Tomcat 서버에서 SSL을 사용하려면 사설 인증서든, 공인 인증서든 아무튼 인증서를 설치해야 한다.

인증서를 발급하는 방법이야 널리고 널린데다, 별 다른 이견이 없어서 생략하고...

발급받은 인증서를 Tomcat에 설치하는 방법 역시 인터넷에 여러가지 많이 나와 있는데

딱히 그대로 되는 경우가 없었다. 시키는 대로 keystore를 생성하고 인증서를 import 해봐도 

마지막에 Tomcat을 기동할라치면,

java.security.UnrecoverableKeyException: Cannot recover key

이런 류의 에러를 뱉어내고 죽어버리기 일쑤.

(keystore 암호와 인증서 key 암호가 서로 달라서 생기는 문제라고...)


혹자는 OpenSSL 도구를 이용해서 pfx를 crt, pem 등의 형식으로 바꾼 다음 다시 작업해야 한다고도 하고,

인증서 요청 생성부터 다시 해야 한다고도 하고... 

이런 말들이 많은데 다 내 시나리오에서는 제대로 동작이 안됐다.


이미 발급한 pfx 인증서를 그냥 jks로 변환만 하고싶단 말이다!!!


그나마 참고가 된 사이트는 SecureSign 도움말 페이지.

>> 참조: https://www.securesign.kr/guides/Tomcat-SSL-Certificate-Install


아예 처음 인증서 요청을 생성하는 절차부터 나와 있는 것이라 그대로 따라해서는 안되었지만

따라 하다가 낭패를 봤다. 그래도 중간에 CA 인증서를 import 하는 내용 등 나름 쓸 만한 내용은 있었다.


그나마 핵심은 이거였다. 

위 사이트에는 pfx 인증서를 바로 jks로 변환하는 방법이 나와 있었다.

>> 참조: https://www.securesign.kr/guides/SSL-Certificate-Convert-Format


문제는, 이렇게 변환할 때 고려해야 할 점이 있다.

위 사이트에 나와있는 대로 그냥 pfx를 jks로 변환해버리면 인증서의 alias가 이상하게 생긴다.

pfx 내에 있던 인증서의 alias가 원래 이상하게 랜덤 생성되어 있었기 때문이겠지...

이것을 명시적으로 변환해줘야 한다. (alias를 이용해 암호 변경 등 뭘 더 할 것이 없다면 굳이 필요없긴 하다)

"%JAVA_HOME%\bin\keytool" -importkeystore -srckeystore {cert.pfx} -srcstoretype pkcs12 -srcalias le-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx -destkeystore {tomcat.jks} -deststoretype jks -destalias tomcat

엥? 저걸 어떻게 찾냐고? srcalias, destalias 지정하지 않고 그냥 한번 변환해보면 알 수 있다. ㅎ

변환된 jks 내용을 조회하는 방법은 아래와 같다.

"%JAVA_HOME%\bin\keytool" -list -v -keystore {tomcat.jks}


추가로,

원래 pfx에 루트 인증서 체인이 포함되어 있지 않았다면 따로 추가해 줄 필요도 있다. (사용해 보니 이 작업은 굳이 필요없긴 했다. 이런다고 클라이언트에서 자동으로 신뢰되는 것은 아니니까.)

"%JAVA_HOME%\bin\keytool" -import -trustcacerts -alias myRootCA -file {myroot.cer} -keystore {tomcat.jks}


마지막으로,

Tomcat의 server.xml 파일에 위에서 변환/생성한 jks 파일을 등록해 주면 SSL 설정은 끝.

이 부분은 굳이 따로 더 언급하진 않겠다. BIO니 NIO니 APR이니 하는 옵션에 따라 설정 방법도 다양하고...

참조 URL만 하나 투척하고 끝낸다. 각 커넥터들의 특징이 일목 요연하게 잘 비교되어 있다.

>> 참조: https://tomcat.apache.org/tomcat-8.0-doc/config/http.html#Connector_Comparison


내 경우에는 Tomcat 7 버전으로 작업을 하고 있기 때문에 NIO2 같은 건 사용할 수 없고

NIO가 기본 BIO에 비해 좋다니 기본값으로 NIO를 사용하는 것이 좋겠다는 것 정도만... ㅎㅎ


Tomcat 7 버전에서 SSL 설정하는 공식 문서는 아래에 나와 있다. 별 도움은 안되었지만.

>> 참조: https://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html


마지막으로,

Tomcat에서는 pfx를 굳이 jks로 변환할 필요가 없었다.

pfx 그대로 server.xml에 기록해주면 되는 거였는데... 대체 난 뭘 한걸까?

<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"

               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"

               clientAuth="false" sslProtocol="TLS" keystoreType="PKCS12"

               keystoreFile="c:/temp/cert.pfx" keystorePass="password" />


아무튼, 쓸 데 없는 삽질을 실컷 했지만... 혹시나 나중에 도움이 될까 해서 기록해 둔다.





Posted by 떼르미
,


자바스크립트를 허용해주세요!
Please Enable JavaScript![ Enable JavaScript ]