스프링 3.x 버전에서 4.0.1로 이전 후 새로운 프로젝트를 생성할 때 인증서 오류가 발생한다.


유효한 인증서 경로를 찾을 수 없다는 오류 메시지로 검색을 통해 찾은 원인은 아래와 같다.

서버에 자체 서명 인증서가 있거나 인증서 자체 없거나 신뢰하는 인증기관 인증서 목록(keystore)에 없는 경우 등에서 발생한다.
이 경우는 접속하려는 서버의 인증서를 cacerts 파일에 추가해야 한다.

해결하는 절차는 다음과 같다.

1. download source

curl -O https://gist.githubusercontent.com/lesstif/cd26f57b7cfd2cd55241b20e05b5cd93/raw/InstallCert.java 

curl이 설치 되지 않은 경우 [https://gist.githubusercontent.com/lesstif/cd26f57b7cfd2cd55241b20e05b5cd93/raw/InstallCert.java]를 브라우저 주소창에 붙여 넣으면 파일이 브라우저에 표시된다. 이것을 인증서 파일로 저장하면 된다.

2. compiling

D:\SSL>javac InstallCert.java 

받은 인증서 파일을 컴파일한다.

3. Run

인증서를 가져올 서버의 URL [https://start.spring.io]을 넣고 InstallCert 실행한다.

D:\SSL>java -cp . InstallCert start.spring.io

Loading KeyStore C:\Java\jdk1.8.0_181\jre\lib\security\cacerts...

Opening connection to start.spring.io:443...

Starting SSL handshake...


javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException:

PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderExce

ption: unable to find valid certification path to requested target

        at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)

        at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1964)

        at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:328)

        at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:322)

        at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1614)

        at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:216)

        at sun.security.ssl.Handshaker.processLoop(Handshaker.java:1052)

        at sun.security.ssl.Handshaker.process_record(Handshaker.java:987)

        at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1072)

        at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1385)

        at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1413)

        at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1397)

        at InstallCert.main(InstallCert.java:116)

Caused by: sun.security.validator.ValidatorException: PKIX path building failed:

 sun.security.provider.certpath.SunCertPathBuilderException: unable to find vali

d certification path to requested target

        at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:397)

        at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:302)

        at sun.security.validator.Validator.validate(Validator.java:262)

        at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324)

        at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229)

        at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:105)

        at InstallCert$SavingTrustManager.checkServerTrusted(InstallCert.java:196)

        at sun.security.ssl.AbstractTrustManagerWrapper.checkServerTrusted(SSLContextImpl.java:992)

        at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1596)

        ... 8 more

Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

        at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141)

        at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126)

        at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280)

        at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:392)

        ... 16 more


Server sent 2 certificate(s):


 1 Subject CN=*.spring.io, O="Pivotal Software, Inc.", L=Palo Alto, ST=California, C=US

   Issuer  CN=ePrism SSL, O=SOOSAN INT, C=KR

   sha1    de 15 9c 35 fa 96 56 d0 2d 71 7c 5c c1 06 f4 70 90 4a 13 a6

   md5     f9 fa f2 87 59 b1 a2 34 44 de 61 11 ab 23 59 2a


 2 Subject CN=ePrism SSL, O=SOOSAN INT, C=KR

   Issuer  CN=ePrism SSL, O=SOOSAN INT, C=KR

   sha1    a1 c7 0e 1c 49 56 1d 88 be 71 3a 77 2c 54 8d d6 50 0d 57 94

   md5     ed dd 6e 4a 18 64 2d dc 08 2b d5 1c 97 7a af e6


Enter certificate to add to trusted keystore or 'q' to quit: [1]

1

스프링 서버에서 2 개의 인증서를 받았고 1번째가 spring.io 의 CA 인증서이므로 1번을 선택한다.

4. save peer's ssl cert to keystore(name is jssecacerts)

인증서를 [jssecacerts]란 이름으로 저장한다. 단, [start.spring.io-1]란 별명을 사용한다.

Enter certificate to add to trusted keystore or 'q' to quit: [1]

1


[

[

  Version: V3

  Subject: CN=*.spring.io, O="Pivotal Software, Inc.", L=Palo Alto, ST=California, C=US

  Signature Algorithm: SHA256withRSA, OID = 1.2.840.113549.1.1.11


  Key:  Sun RSA public key, 2048 bits

  modulus: 263928970859943711285259256378426809142774897970370798626231535931942

38409073420033337820853213259936319431187077471026904751218700716775956553485192

63072794448503569641979890019214335188526706469916615801983695268526795895064236

14805069166416213890309753799058797374360512087490392551396596314265486098345112

38346487589237003244049673314353732442844181854549313881496966524091353845684506

73898243478121546411604265519058763178644025910262715604953927793133685768856468

44984536178621124815426706758929747487124884842208121915196897650268954700930607

18749031845472475169138484159625692131931553495875361777968191547673

  public exponent: 65537

  Validity: [From: Fri Mar 16 09:00:00 KST 2018,

               To: Thu Mar 21 21:00:00 KST 2019]

  Issuer: CN=ePrism SSL, O=SOOSAN INT, C=KR

  SerialNumber: [   -bcd88202 a76ed4b7 3de08797 8dd28d27]


Certificate Extensions: 1

[1]: ObjectId: 2.5.29.17 Criticality=false

SubjectAlternativeName [

  DNSName: *.spring.io

  DNSName: spring.io

]


]

  Algorithm: [SHA256withRSA]

  Signature:

0000: 9F E1 E1 C1 5D D9 AC C1   D4 24 15 4C 2D 81 45 10  ....]....$.L-.E.

0010: 0E 08 7C 37 CD 82 80 CE   EC D6 08 32 03 B3 D4 71  ...7.......2...q

0020: E0 B3 20 9B 2D 6B CC ED   E6 D1 0E AB 86 03 7F B1  .. .-k..........

0030: 0B 74 F2 DE 57 B4 17 63   67 E2 35 7D E0 23 61 20  .t..W..cg.5..#a

0040: 28 61 FE 6B 58 BA 6E 84   05 3D FD 12 8D 7F 17 94  (a.kX.n..=......

0050: 48 DE C6 9E 1A A7 7E F5   F5 9F 91 20 78 BF 9C BE  H.......... x...

0060: 36 C0 5A A7 32 87 3B 91   3C D3 A3 21 A6 7A 2E 52  6.Z.2.;.<..!.z.R

0070: 53 6A D8 15 44 98 48 37   2D 36 C4 A0 A6 89 B6 F4  Sj..D.H7-6......

0080: 1C A1 38 F8 FD C8 4F 09   20 13 CE DA 21 2A A5 A7  ..8...O. ...!*..

0090: 95 80 28 35 EF 82 5A 82   07 B5 CD 76 F9 59 82 B1  ..(5..Z....v.Y..

00A0: E2 7F B2 66 BB 52 86 A6   11 B8 F7 37 81 21 13 A7  ...f.R.....7.!..

00B0: 0C DD 5B 0D C0 E4 0C 52   F1 C6 5A 30 90 1E EC F0  ..[....R..Z0....

00C0: DE CB 64 34 65 57 0E B1   8C 86 73 84 67 48 63 72  ..d4eW....s.gHcr

00D0: D4 59 ED FB 5D 37 CB DE   59 6C D0 93 80 4A 86 76  .Y..]7..Yl...J.v

00E0: 0D 15 9A 59 98 90 48 5C   69 4D 04 59 20 F7 86 F0  ...Y..H\iM.Y ...

00F0: 5D 3A CE EE A2 AF D8 56   00 FA 13 3C A8 1F 71 9D  ]:.....V...<..q.


]


Added certificate to keystore 'jssecacerts' using alias 'start.spring.io-1'


D:\SSL>

5. extract cert from saved keystore

keytool 로 저장된 keystore에서 [output.cert]란 이름으로 인증서를 추출한다.

D:\SSL>keytool -exportcert -keystore jssecacerts -storepass changeit -file output.cert -alias start.spring.io-1

인증서가 <output.cert> 파일에 저장되었습니다.

6. import cert into JDK's keystore

설치된 JDK 의 keystore에 인증서를 추가한다. 

D:\SSL>keytool -importcert -keystore c:/Java/jdk1.8.0_181/jre/lib/securi

ty/cacerts -storepass changeit -file output.cert -alias letsencrypt

소유자: CN=*.spring.io, O="Pivotal Software, Inc.", L=Palo Alto, ST=California,

C=US

발행자: CN=ePrism SSL, O=SOOSAN INT, C=KR

일련 번호: -bcd88202a76ed4b73de087978dd28d27

적합한 시작 날짜: Fri Mar 16 09:00:00 KST 2018 종료 날짜: Thu Mar 21 21:00:00 KS

T 2019

인증서 지문:

         MD5:  F9:FA:F2:87:59:B1:A2:34:44:DE:61:11:AB:23:59:2A

         SHA1: DE:15:9C:35:FA:96:56:D0:2D:71:7C:5C:C1:06:F4:70:90:4A:13:A6

         SHA256: 45:C4:CC:B6:8F:75:81:AB:F0:CB:E2:83:60:54:BD:50:C1:AA:FF:DD:13:

D9:14:43:48:69:CC:69:20:DE:B5:06

서명 알고리즘 이름: SHA256withRSA

주체 공용 키 알고리즘: 2048비트 RSA 키

버전: 3


확장:


#1: ObjectId: 2.5.29.17 Criticality=false

SubjectAlternativeName [

  DNSName: *.spring.io

  DNSName: spring.io

]


이 인증서를 신뢰합니까? [아니오]: 

인증서가 키 저장소에 추가되었습니다.


[start.spring.io]서버의 인증서를 추가한 후에는 스프링 4.0.1에서 정상적으로 프로젝트를 생성할 수 있다.


'IT > Spring' 카테고리의 다른 글

[Spring][Spring Tool Suite 4.0.1][SSL] certification error  (0) 2019.01.03

+ Recent posts

티스토리 툴바