시작은 예외 메시지 한 줄

Java로 만든 프로그램을 실행했을 때, 아래와 같은 예외가 발생했습니다.
특히 외부 HTTPS 서버에 접속하려 할 때 터졌습니다.

javax.net.ssl.SSLHandshakeException: PKIX path building failed: 
sun.security.provider.certpath.SunCertPathBuilderException: 
unable to find valid certification path to requested target

 

🧠 이 예외의 의미는?

📌 한마디로 말하면:

"Java가 접속하려는 서버의 인증서를 신뢰하지 못했다"는 뜻입니다.

조금 더 자세히 보면:

단계설명
1️⃣ Java 앱이 https://example.com 같은 서버에 SSL 연결 시도
2️⃣ 서버는 자신의 SSL 인증서를 보냄
3️⃣ Java는 이 인증서가 자신이 신뢰하는 기관에서 발급됐는지 확인
4️⃣ 인증서의 발급 경로(체인)가 신뢰할 수 없다면 → SSLHandshakeException 발생

이때 "PKIX path building failed"란 말은,
신뢰할 수 있는 루트 인증서까지 연결되는 경로(path)를 못 찾았다는 뜻입니다.
 
 

🔍 내 환경에서는 왜 생겼을까?

저는 우분투 서버에서 Java 8 (OpenJDK 1.8.0_292) 환경에서
https://example.com 및 https://example.s3.xxx.amazon.com
같은 외부 서버에 접속하는 애플리케이션을 실행하고 있었습니다.
그런데 로컬에서 Eclipse로 실행하면 잘 되는데, 우분투서버 터미널에서는 오류 발생!
이유는 아주 간단했습니다:

💡 Eclipse는 자체적으로 더 최신의 인증서를 신뢰할 수 있게 설정되어 있었고,
터미널의 Java는 신뢰 저장소(truststore)에 인증서가 없었던 것입니다.

 

🔑 해결 방법은?

🔹 1. 서버 인증서를 추출

openssl s_client -showcerts -connect example.com </dev/null > xxx_cert.pem
 

🔹 2. Java truststore에 인증서 등록

keytool -importcert -alias xxx_cert \ -keystore /home/truststore/mytruststore.jks \ -file xxx_cert.pem \ -storepass changeit
 

🔹 3. Java 실행 시 truststore 지정

java \ -Djavax.net.ssl.trustStore=/home/truststore/mytruststore.jks \ -Djavax.net.ssl.trustStorePassword=changeit \ -classpath ... \ com.xxx.MyApp
 

📎 그리고 추가로...

Amazon S3 같은 서버는 인증서 체인이 길어서,
openssl s_client -showcerts 명령으로 전체 체인을 받아
여러 개의 .crt 파일로 분리해 모두 truststore에 넣어야 했습니다.
 

🛠 해결 방법 (추가 인증서 등록)

🔹 1. S3 서버의 전체 인증서 체인 다운로드

openssl s_client -showcerts -connect example.s3.xxx.amazon.com </dev/null > s3_chain.pem
 

🔹 2. 인증서 분리

csplit -sz -f s3_cert_ s3_chain.pem '/-----BEGIN CERTIFICATE-----/' '{*}'
 

그럼 다음과 같이 s3_cert_00, s3_cert_01 … 식으로 파일이 생성됩니다.

-rw-r--r-- 1 root root  136 Apr 11 09:13 s3_cert_00
-rw-r--r-- 1 root root 3024 Apr 11 09:13 s3_cert_01
-rw-r--r-- 1 root root 1756 Apr 11 09:13 s3_cert_02
-rw-r--r-- 1 root root 1878 Apr 11 09:13 s3_cert_03
-rw-r--r-- 1 root root 2165 Apr 11 09:13 s3_cert_04
-rw-r--r-- 1 root root 8959 Apr 11 09:13 s3_chain.pem

 
 
🔹 3. truststore에 각 인증서 등록

keytool -importcert -alias s3_cert_00 -keystore /home/truststore/mytruststore.jks -file s3_cert_00 -storepass changeit -noprompt
keytool -importcert -alias s3_cert_01 -keystore /home/truststore/mytruststore.jks -file s3_cert_01 -storepass changeit -noprompt
keytool -importcert -alias s3_cert_02 -keystore /home/truststore/mytruststore.jks -file s3_cert_02 -storepass changeit -noprompt
keytool -importcert -alias s3_cert_03 -keystore /home/truststore/mytruststore.jks -file s3_cert_03 -storepass changeit -noprompt
keytool -importcert -alias s3_cert_04 -keystore /home/truststore/mytruststore.jks -file s3_cert_04 -storepass changeit -noprompt

 
 
✅ 등록 확인해 볼수도 있습니다.

keytool -list -keystore /home/truststore/mytruststore.jks -storepass changeit | grep s3_cert_

결과 예시..
s3_cert_01, Apr 11, 2025, trustedCertEntry, 
s3_cert_02, Apr 11, 2025, trustedCertEntry, 
s3_cert_03, Apr 11, 2025, trustedCertEntry, 
s3_cert_04, Apr 11, 2025, trustedCertEntry,

 
 
 
🔹 4. 다시 실행

java \ -Djavax.net.ssl.trustStore=/home/truststore/mytruststore.jks \ -Djavax.net.ssl.trustStorePassword=changeit \ -classpath ... \ com.xxx.MyApp

 

✅ 요약

원인해결 방법
Java가 서버의 인증서를 신뢰하지 않음 truststore에 인증서 등록
인증서 체인 전체가 없으면 에러 발생 openssl s_client -showcerts로 체인 전체 확보
Eclipse에서는 되는데 터미널은 안 됨 Eclipse는 자체 설정 or 다른 JDK를 사용할 수 있음

 

🧭 결론

이 예외는 Java의 보안 설정이 잘 작동하고 있다는 뜻이기도 합니다.
단지 우리가 신뢰 인증서를 수동으로 추가해줄 필요가 있을 뿐이죠.
한 번 해결해두면 앞으로는 안정적으로 통신할 수 있습니다!

 


 

🔧 Java SSLHandshakeException 해결? 업그레이드만이 답은 아니다

💡 흔한 첫 번째 반응

"아, Java 버전이 오래돼서 인증서를 못 인식하나 보네.
그냥 Java 11이나 17로 업그레이드하면 되지 않을까?"

맞습니다.
최신 JDK는 최신 루트 인증서가 내장되어 있어서,
SSLHandshakeException 문제가 사라질 가능성이 높습니다.

하지만 정말로 그냥 업그레이드해도 될까요?

 

⚠️ Java 업그레이드가 쉽지 않은 이유들

1️⃣ 삭제된 패키지들

Java 11부터는 다음과 같은 익숙한 패키지들이 완전히 제거되었습니다:

  • javax.xml.bind (JAXB)
  • javax.annotation
  • javax.activation
  • javax.ws.rs.*
  • javax.jws.*

👉 즉, 예전 코드가 있다면 컴파일 자체가 안 됩니다.


2️⃣ 모듈 시스템(Jigsaw) 도입

Java 9부터 도입된 모듈 시스템 때문에
com.sun.* 같은 내부 API 접근이 제한되고,
라이브러리들도 모듈 간 의존성 문제로 예상치 못한 충돌이 생길 수 있습니다.


3️⃣ 빌드 도구 호환성

  • Maven: 3.6 이상 권장
  • Gradle: 6.x 이상 권장
  • 일부 구버전 플러그인들은 Java 11 이상에서 작동하지 않을 수 있습니다.

4️⃣ 프레임워크 호환성

  • Spring Boot 1.x → Java 11 미지원
  • Hibernate, Tomcat, Kafka 등도 버전에 따라 Java 11 미호환

👉 실무에서는 관련 라이브러리 전체를 함께 업그레이드해야 합니다.


5️⃣ 서버 환경까지 바꿔야 할 수도...

  • Tomcat이나 JBoss 등 서버 구성도 Java 버전과 엮여 있기 때문에
    운영 환경 전체에 영향을 줄 수 있습니다.

 

실시간 눈, 비구름, 위성영상, 레이더영상 관찰

안드로이드 무료 다운로드

 

날씨위성영상 라이브 - (태풍 구름 눈 비 CCTV) - Google Play 앱

실시간으로 위성영상, 레이더영상을 확인하세요

play.google.com

 

앱스토어 무료다운로드 

우분투 명령어

service mysql status

service mysql start

service mysql stop

service mysql restart

 

 

active (running)
inactive (dead)

syntax color scheme 적용하는 방법을 기록합니다.

 

crontab 수정하는 도중

주석처리된 부분이 파란색이라 

보이지도 않으면서 눈이 아프네요

 

crontab -e


1. 우선 루트 디렉토리로 이동합니다.

2. .vimrc 파일을 생성하고 다음을 입력한다.

.vimrc 파일 생성

3. 다음을 입력하고 저장한다.

colorsheme desert 를 사용

4. 이제 잘보입니다.

desert 적용한 color scheme

5. 파일명이 (.) 마침표로 시작하는 파일은 숨김파일입니다.

 

6. 추가적으로 color scheme 이 있습니다.  

맘에 드는 것을 사용하시면 되겠네요

additional color scheme


실시간 위성 레이더 어플

무료 안드로이드 설치하기

 

날씨위성영상 라이브 - (태풍 구름 눈 비 CCTV) - Google Play 앱

실시간 위성 구름 영상( 한국, 한국인접국, 동아시아) 가시영상, 적외선영상, 레이더영상, 태풍, 황사,CCTV 오늘 날씨를 직접 예측하세요

play.google.com

 

ls -l *202112*

문자열 포함한 파일 보기

root@ip:/test# ls -l | grep ^-
-rw-r--r-- 1 root root 44160 Dec  7  2021 20211207.dat
-rw-r--r-- 1 root root 44458 Dec  7  2021 20211207.dat
-rw-r--r-- 1 root root 36474 Dec  7  2021 20211207.dat
-rw-r--r-- 1 root root 44014 Dec  7  2021 20211207.dat

 

abc.txt 파일을 아래와 같이 작성.

djkkdlf
dlkfjaf
bdkdkd
adkdd
dfafdaf:wq!
:

 

wc -l abc.txt >> abc.txt 파일의 줄수를 반환

root@ip:/test# wc -l abc.txt
6 abc.txt

 

grep ^d abc.txt 첫문자 d를 찾음

root@ip:/test# grep ^d abc.txt
djkkdlf
dlkfjaf
dfafdaf:wq!

 

파일만 한줄로 출력하고 (첫문자가 - 이면 파일) 그 출력물에서 한줄씩 개수를 세어라

ls -l | grep ^- | wc -l

 

 

 

 

 

 

1. 특정문자열이 포함된 파일만 지울때

rm *abc*

 

2. 오늘날짜가 포함된 파일만 지울때

rm *20220705*

 

3. 현재 시간

4. 오늘날짜

5. 어제 날짜, 2일전 날짜

6. 2일전,1일전, 0일전 날짜를 포함한 파일 보기

0. 1. 설치하기

sudo apt-get install tomcat9

0. 2. 제거하기

sudo apt-get purge --auto-remove tomcat9

1. 톰캣 홈페이지 tar.gz 파일 주소 복사하여 다운로드

sudo wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.53/bin/apache-tomcat-9.0.53.tar.gz

2. 압축해제

sudo tar xvf apache-tomcat-9.0.53.tar.gz

3. 디렉토리명 수정

sudo mv apache-tomcat-9.0.53 tomcat

4. 경로 설정, 

vi /etc/profile
.
.
.
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
export CATALINA_HOME=/home/tomcat
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib/tools.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ext:.

5. 실행 및 확인

source /etc/profile
echo $CATALINA_HOME

6. 톰캣 설정

vi /home/tomcat/conf/server.xml

7. shutdown 및 startup

sh /home/tomcat/bin/shutdown.sh
sh /home/tomcat/bin/startup.sh

7.1 동작확인

    브라우저에서 http://ip주소:8080/

 

7.2 자동시작설정

sudo vi/etc/init.d/tomcat
#!/bin/bash
### BEGIN INIT INFO
# Provides:    tomcat
# Required-Start:  $remote_fs $syslog
# Required-Stop:   $remote_fs $syslog
# Default-Start:   2 3 4 5
# Default-Stop:    0 1 6
# Short-Description: auto start Tomcat server
# Description: start web server
### END INIT INFO

case $1 in
start)
sh /home/tomcat/bin/startup.sh
;;
stop)
sh /home/tomcat/bin/shutdown.sh
;;
restart)
sh /home/tomcat/bin/shutdown.sh
sh /home/tomcat/bin/startup.sh
;;
esac
exit 0
cd /etc/init.d
sudo chmod 755 tomcat
sudo update-rc.d tomcat defaults

8. 확인

ps -ef | grep tomcat

netstat -tln

9. 잘 안 된다...

AWS EC2 보안그룹 인바운드규칙 그리고 탄력적 IP 체크

 

10. 이리저리 만지다 보니 원격으로 접속 성공

나 같은 경우는 탄력적IP(Elastic IP) 를 셋팅.

결과적으로 putty 접속과 http 접속에 같은 IP주소를 사용하게 되었는데..

 

http://xxx.xxx.xxx.xxx:8080 

AWS EC2 t2.micro 인스턴트

Ubuntu 18.04.5 LTS

 

1. 업데이트 

sudo apt-get update

2. 자바8 JRE, JDK 설치

sudo apt-get install openjdk-8-jre
sudo apt-get install openjdk-8-jdk

3. 설치후 버전 확인

javac -version
java -version
ubuntu@ip:~$ javac -version
javac 1.8.0_292
ubuntu@ip:~$ java -version
openjdk version "1.8.0_292"
OpenJDK Runtime Environment (build 1.8.0_292-8u292-b10-0ubuntu1~18.04-b10)
OpenJDK 64-Bit Server VM (build 25.292-b10, mixed mode)
ubuntu@ip:~$

4. path 설정 위해 javac 절대경로 확인

which javac
readlink -f /usr/bin/javac
ubuntu@ip:~$ which javac
/usr/lib/jvm/java-8-openjdk-amd64/bin/javac
ubuntu@ip:~$ readlink -f /usr/bin/javac
/usr/lib/jvm/java-8-openjdk-amd64/bin/javac
ubuntu@ip:~$

5. path 설정

sudo vi /etc/profile
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
export CLASS_PATH=$JAVA_HOME/lib:$CLASS_PATH

6. 경로 다시 실행

source /etc/profile

7. 자바 경로 확인

echo $JAVA_HOME
$JAVA_HOME/bin/javac -version

8. CLASSPATH 설정

echo $CLASSPATH
vi /etc/profile

마지막에 추가

...
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
export CLASS_PATH=$JAVA_HOME/lib:$CLASS_PATH
export CATALINA_HOME=/home/tomcat
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib/tools.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ext:.
~

9. 필요한 jar 파일을 다음 폴더에 복사하여 자바 컴파일

/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ext

일정간격으로 뭔가를 실행할 수 있는 명령이다.

 

crontab 수정하기

vi 에디터에 내용이 나타나고 수정하고 저장하면 이후로 주기적으로 실행된다.

root@ncpmicro:/home/cronshell# crontab -e

crontab 내용보기

root@ncpmicro:/home/cronshell# crontab -l

 

shell 명령실행 또는 자바프로그램 실행등을 할 수 있다.

root@ncpmicro:/home/cronshell# crontab -l
#shell 실행
3,13,23,33,43,53 * * * * sh /home/cronshell/auto1.sh
1 5 * * * sh /home/cronshell/auto2.sh
#java 실행
1,16,31,46 * * * * /usr/lib/jvm/java8/bin/java -classpath "/home/javap/sat" Sat 1 > /home/javap/sat/cron1.log
2 */3 * * * /usr/lib/jvm/java8/bin/java -classpath "/home/javap/sat" Sat 3 > /home/javap/sat/cron3.log
45 8,20 * * * /usr/lib/jvm/java8/bin/java -classpath "/home/javap/sat" Sat 5 > /home/javap/sat/cron5.log
3 5 * * * sh /home/cronshell/auto3.sh

 

+ Recent posts