Windows에서 TOMCAT에 개발용으로 SSL 적용하기

프로그래밍/네트워크, 보안 2018. 4. 21. 00:10
반응형

사이트에 SSL을 적용하려면 인증기관으로부터 인증서를 발급받아 웹서버에 설치해야 합니다. 개발용으로 자신이 인증기관이 되어 인증서를 발급하여 Tomcat에 적용하는 방법을 알아봅니다.



1. openssl 설치하기


키와 인증서를 만들기 위해서 openssl을 설치합니다. 다음 사이트에서 자신의 PC에 맞는 파일을 다운 받습니다. 이 글에서는 윈도우에서 테스트하므로 openssl-0.9.8k_X64.zip 파일 다운로드 받았습니다.


https://code.google.com/archive/p/openssl-for-windows/downloads


다운 받은 파일은 압축을 풀어서 적당한곳에 복사해두면 됩니다. 여기에서는  D:\util\openssl-0.9.8k_X64 에 설치하였습니다. D:\util\openssl-0.9.8k_X64\bin 폴더 PATH 에 추가하면 편리하게 사용할 수 있습니다.



2. 인증기관(CA, Certificate Authority)


공인인증기관이 아닌 내가 인증기관처럼 작업을 해야 하므로 인증기관용 개인키를 먼저 만들고, 웹브라우저에 설치될 루트 인증서도 만듭니다. 공인인증기관의 루트 인증서와 중간 인증서는 이미 웹브라우저에 설치되어 있으므로 바로 인증이 되는 것입니다.


openssl 명령을 실행하기 위해서 명령창을 관리자 권한으로 실행합니다. 관리자 권한이 아니면 unable to write 'random state' 오류가 발생할 수 있습니다.



2.1. CA가 사용할 RSA  key 쌍(public, private key)을 만들기


2048bit 개인키를 생성하는데, 분실에 대비해서 AES256으로 암호화 합니다. 그러므로 암호를 잊어버리면 개인키를 사용할 수 없게 됩니다. 암호화 하지 않으려면 -aes256 옵션을 빼고 만들면 됩니다. 여기서는 D:\cert 폴더를 만들고 그곳에서 작업을 합니다.


D:\cert>openssl genrsa -aes256 -out rootca_private.key 2048




테스트용 이므로 암호는 적당히 넣으면 되겠습니다. 잊어 먹으면 진행이 안되니 잘 적어두기 바랍니다. D:\cert\rootca_private.key 파일이 생성되었습니다.



※ 참고 : 개인키로 공개키를 직접 만드는 방법 입니다.

D:\cert>openssl rsa -in rootca_private.key -out rootca_public_key.pem -pubout



2.2. 인증서 요청 파일 (.csr) 만들기


인증서를 발급받기 위해서는 나의 공개키와 도메인 정보를 담은 .csr 파일을 만들어서 인증기관에 보내게 되는데, 여기서는 내가 인증기관이 되어 인증서를 발급하여야 하므로 인증기관의 공개키를 나의 개인키로 서명하여 만들게 됩니다.


D:\cert>openssl req -new -key rootca_private.key -out rootca.csr -config D:\util\openssl-0.9.8k_X64\openssl.cnf




- Enter pass phrase for rootca_private.key: 에는 개인키 비밀번호를 입력합니다.

- A challenge password[]: 와 An optional company name []: 은 엔터만 치고 넘어갑니다.

- rootca.csr 파일이 만들어졌습니다.



2.3. 10년짜리 self-signed 인증서 만들기


내가 인증기관이므로 .csr 파일을 나의 인증기관 개인키로 서명합니다. X.509 버전 3 인증서를 만듭니다.


D:\cert>openssl x509 -req -days 3650 -extensions v3_ca -set_serial 1 -in rootca.csr -signkey rootca_private.key -out rootca.crt




- Enter pass phrase for rootca_privatge.key: 에는 인증기관 개인키 비밀번호를 입력합니다.

- rootca.crt 파일이 생성되었습니다. 이것이 루트 인증서 입니다.

- 다음 명령으로 인증서 내용을 확인할 수 있습니다.

  D:\cert>openssl x509 -text -in rootca.crt




- 인증기관의 공개키가 포함된 인증서를 확인할 수 있습니다.



3. 웹서버를 위한 인증서를 생성합니다.


위에서 인증기관에 필요한 것들이 준비가 되었습니다. 이제 웹서버에 필요한 키와 인증서를 생성합니다. 생성 방법은 위에서 작업한 것과 거의 비슷한 과정을 거치게 됩니다.



3.1 웹서버를 위한 개인키 만들기


D:\cert>openssl genrsa -aes256 -out localhost_private.key 2048




- 개인키 비밀번호는 잊어먹지 않도록 주의합니다.

- localhost_private.key 파일이 생성되었습니다.



3.2. 인증서 요청파일(.csr) 만들기


인증서 발급을 위한 .csr 파일을 생성합니다.


D:\cert>openssl req -new -key localhost_private.key -out localhost.csr -config D:\util\openssl-0.9.8k_X64\openssl.cnf




- Enter pass phrase for localhost_private.key: 에는 개인키 비밀번호를 입력합니다.

- Common Name(eg, YOUR name) []: 에는 도메인명 또는 hostname을 입력합니다.

- A challenge password[]: 와 An optional company name []: 은 엔터만 치고 넘어갑니다.

- localhost.csr 파일이 만들어졌습니다.



3.3. 5년짜리 localhost용 SSL 인증서 발급하기(CA 개인키로 서명)


D:\cert>openssl x509 -req -days 1825 -extensions v3_user -in localhost.csr -CA rootca.crt -CAcreateserial -CAkey rootca_private.key -out localhost.crt




- Enter pass phrase for rootca_privatge.key: 에는 인증기관 개인키 비밀번호를 입력합니다.

- localhost.crt 파일이 생성되었습니다. 이것이 웹서버용 인증서 입니다.



4. Tomcat용 인증서 파일 생성


인증서와 웹서버용 개인키를 이용해서 Tomcat용 keystore를 생성합니다.


D:\cert>openssl pkcs12 -export -in localhost.crt -inkey localhost_private.key -out keystore -name "localhost cert"




- (-name) 옵션은 keystore의 alias 가 됩니다.

- Enter pass phrase for localhost_private.key: 에 웹서버용 개인키 비밀번호를 입력합니다.

- Enter Export Password: 에는 키스토어 비밀번호를 입력합니다.

- Verifying - Enter Export Password: 에는 키스토어 비밀번호를 입력합니다.

- keystore 파일이 만들어 졌습니다.



5. Tomcat 설정


server.xml 파일이 https 설정을 추가하고, 실행합니다.


<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"

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

           keystoreFile="D:/cert/keystore" keystorePass="keystorepwd"

           clientAuth="false" sslProtocol="TLS" />





6. 웹 브라우저로 https://localhost:8443/pentode 를 호출한 결과 입니다.




웹서버로 부터 받은 인증서를 보증 해줄 인증기관의 인증서가 웹브라우저에는 없으므로 신뢰할 수 없다고 나옵니다. 추가정보를 클릭하고 억지로 실행할 수 있습니다.



7. 사설 root 인증서 설치하기


- IE 웹 브라우저에서  도구 -> 인터넷 옵션 -> 내용 -> 인증서를 클릭합니다.

- 신뢰할 수 있는 루트 인증기관 탭에서 "가져오기" 를 실행하여 앞에서 만든 rootca.crt 를 가져옵니다.




- 웹브라우저로 요청하면 에러 없이 페이지가 열립니다.




이것으로 개발, 테스트용으로 Tomcat 에 사설 인증서를 설치하는 방법을 알아보았습니다.


반응형
Tag , ,

댓글을 달아 주세요

  • 재능인 2020.01.17 12:00  댓글주소  수정/삭제  댓글쓰기

    오래된글에 답변을 주실지 모르지만..질문드립니다

    게시물 내용을 그대로 따라하였습니다..

    하지만 웹에서 8443포트로 접근이안되네요..
    이유가 뭘까요?

    • pentode 2020.01.17 21:56 신고  댓글주소  수정/삭제

      다른 부분에 오류가 없다면 Tomcat 설정 부분을 확인해보세요.

      <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"

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

      keystoreFile="D:/cert/keystore" keystorePass="keystorepwd"

      clientAuth="false" sslProtocol="TLS" />

      여기에서 keystorepwd 는 실제 만들 비밀번호가 사용되어야 합니다.

      그리고나서는

      8443포트가 실제로 열려 있는지 즉 연결이 되는지 확인하시고요.

      다음으로 Tomcat의 log 파일을 확인해 보아서 어떤 오류가 있는지 파악해보세요.

      성공하시길 바랄께요.

  • 개발자A 2020.02.10 19:04  댓글주소  수정/삭제  댓글쓰기

    저도 답변을 주실지는 모르겠지만 질문 남깁니다..

    게시글 내용을 그대로 따라하여 어찌어찌 성공적으로 되긴 했습니다만..

    테스트용으로 돌아가는 서버는 잘 적용되지만

    도메인발급받은 실제서버에서는 적용이 어정쩡하게 되네요..

    해당서버컴퓨터에서는 https로 위와 같이 되긴합니다만

    다른 서버컴퓨터에서 https로 접속하려면 아에 접속 자체가 안되네요

    참고로 다른 서버컴퓨터에서 기존 http는 잘 됩니다.

    지금 전혀 무슨문제인지 모르고 있어서 난감한 상황인데 의심가는 문제가 있을까요??

    • pentode 2020.02.12 21:04 신고  댓글주소  수정/삭제

      안녕하세요. 로컬에서는 접속이 되는데, 외부에서 접속 자체가 안된다면 방화벽에 포트가 열려 있는지 확인해 보세요.

      성공하시길 바랄께요. 새해 복많이 받으세요.^^

    • 개발자A 2020.02.13 15:57  댓글주소  수정/삭제

      답변감사드립니다.

      방화벽에 포트가 열려있긴 하나 잘 안되었는데 포트를 아에 새로 추가하는 방식으로 해결되었습니다.

      새해 복 많이 받으세요!

  • 서경섭 2020.03.19 08:24  댓글주소  수정/삭제  댓글쓰기

    다른 컴퓨터에서 접속하니 역시 주의 요함으로 표시되면서 인증서가 유효하지 않음으로 표시가 됩니다.
    유효한 인증서로 표시하려면 위의 절차 중 7. 사설 root 인증서 설치하기를 그 브라우저에서 해주어야 할 것 같은데
    어떻게 해주어야 하나요? 인증서를 어떻게 얻을 수 있으며, 어떤 방법으로 해야 하는지 알고 싶습니다.
    인증서를 보면 localhost.crt가 전송된 것 같은데...

    • pentode 2020.03.23 21:32 신고  댓글주소  수정/삭제

      브라우저에는 인증서를 발급하는 인증기관의 인증서 즉, 루트 인정서가 설치되어야 합니다.

      이 글에서는 테스트용으로 내가 인증기관이 되어서 내가 사용할 인증서를 만드는 것입니다. 글에서 rootca.crt 가 루트 인증서 입니다. 글에서와 같이 설치하시면 됩니다.

  • RRR 2020.04.28 13:56  댓글주소  수정/삭제  댓글쓰기

    덕분에 편하게 로컬에 ssl 적용했습니다. 감사합니다.

  • 초보 2020.06.19 11:04  댓글주소  수정/삭제  댓글쓰기

    감사합니다.
    덕분에 로컬에 SSL 접속 테스트가 잘됩니다.
    ^_^

  • value 2020.08.04 13:26  댓글주소  수정/삭제  댓글쓰기

    게시글 감사합니다

    따라하는중인데 모두 적용하고 나서 톰캣 기동시 에러가 발생합니다

    혹시 톰캣 8.5버전은 설정이 다른가요??


    심각: Protocol handler instantiation failed
    java.lang.ClassNotFoundException: org.apache.coyote.http11.Http11Protocol
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:264)

    • pentode 2020.11.19 15:24 신고  댓글주소  수정/삭제

      Tomcat 8에서는 Connector의 protocol 클래스가 바뀐것 같습니다. Tomcat 8의 원래 클래스를 사용하면 될것 같습니다.

      protocol="org.apache.coyote.http11.Http11NioProtocol"

  • test 2020.08.29 16:31  댓글주소  수정/삭제  댓글쓰기

    java.io.IOException: Invalid keystore format
    org.apache.catalina.LifecycleException: Failed to initialize component [Connector[HTTP/1.1-8443]]

    이런 오류가 뜨는데 무슨이유일까요?
    다른데 검색해보면 패스워드의 문제라고 적혀있는거 까진 확인했습니다만
    패스워드는 정확합니다.

  • twirl1 2020.12.01 13:36  댓글주소  수정/삭제  댓글쓰기

    한번에 잘 해결했습니다 그대로 정독한다음 지금 개발환경에 맞춰 로컬 SSL 접속 했습니다 감사합니다

  • test2 2021.02.19 16:03  댓글주소  수정/삭제  댓글쓰기

    IE에서는 정상적으로 되는데 크롬에서는 유효하지 않은 인증서라고 뜹니다.
    어떻게 해야하는지 아시는지 궁금합니다!

    • pentode 2021.02.19 18:12 신고  댓글주소  수정/삭제

      Chrome에서도 IE에서와 같이 사설 root 인증서를 설치해야 합니다.

      설정 -> 개인정보 및 보안 -> 보안 -> 인증서 관리 메뉴에서 가져오기 하여 등록합니다.

      Chrome 브라우저 버전에 따라 위 메뉴의 위치는 다를 수 있습니다.

      성공하시길 바랄께요. 방문해 주셔서 감사합니다.^^