Tomcat Let's Encrypt SSL 인증서 설치(윈도우)
지금 이 상황에 오기까지 무수한 시행착오를 겪었다. 지금도 겪고 있지만 ...
매번 정리를 해야지 해야지... 하면서도 또 다른 관심사에 이끌려 지나치고
지나쳐 왔던거 같다.
하지만 이번 같은 경우는 정리를 안하면 진짜 잊어먹고 또 같은 삽질?을 반복할 것 같아서
이렇게 정리를 실행에 옮긴다.
나는 윈도우를 사용하는 보통의 흔한 개발자이다.
그래서 톰캣도 윈도우 DB도 윈도우 전부 윈도우다. spring 이라는 것을 어깨 너머로 배워 작은것을 하던 도중 html의 getLocation이 필요하여 사용하게 된다. 하지만 이것이... html5? 가 되면서 부터 https 로 요청을 해야 응답을 받을 수 있게 되었다고 한다고 한다고 한다...... 덕분에 node 서버도 ssl로 할수밖에 없었지만...ㅠㅠ
그래서! 무조건 위치를 받아야 하는 나로써는... https를 적용 하기로 마음먹고 삽질을 시작했다.
ssl적용은 유료도 있고 무료도 있는 것 같다.
하지만 나는 무료로 일단 시작해본다.
Letsencrypt
Let's Encrypt - 무료 SSL/TLS 인증서
letsencrypt.org
우선 필요한 파일들을 다운로드 하고 설치 해야 합니다.
1. Java를 다운받아 설치하고 환경변수에 추가합니다.
무료 Java 소프트웨어 다운로드
모든 Java 다운로드 다른 컴퓨터 또는 운영 체제용 Java를 다운로드하려면 아래 링크를 누르십시오. 모든 Java 다운로드 문제 보고 Java 응용 프로그램이 포함된 페이지를 방문할 경우 항상 이 페이지로 재지정되는 이유는 무엇입니까? » 추가 정보
java.com
환경변수에 추가까지 했다면 cmd에서 java를 쳐보면서 실행이 되는것을 확인~
2. OpenSSL 설치하고 Path 환경변수에 추가
환경변수를 설정하고 %변수명%\bin 으로 path를 추가하면 openssl을 어디서든 부를 수 있게된다.
마찬가지로 cmd에서 openssl 실행이 되는걸 확인한다.
3. PJAC(Porunov Java ACME_Client)를 다운로드 합니다.
https://github.com/porunov/acme_client/releases
porunov/acme_client
Java ACME Client application. Contribute to porunov/acme_client development by creating an account on GitHub.
github.com
4. 이제 cert를 받을 폴더를 먼저 만듭니다. c:\cert를 만듭니다.
여기에 3. 에서 받은 acme_client.jar를 복사 합니다.
이제 인증서 발급받을 준비 완료
<이제부터 인증서 발급 받기>
5. OpenSSL을 이용해서 CA user account key 를 생성 합니다.
openssl genrsa -out "C:\cert\account.key" 2048
6. private domain key를 생성한다.
openssl genrsa -out "C:\cert\도메인.key" 2048
7. CSR(Certificate Signing Request)를 생성합니다.
openssl req -new -key "C:\cert\도메인.key" -sha256 -nodes -subj "/C=KR/ST=Seoul/L=Seoul/O=회사명/OU=부서명/CN=도메인/emailAddress=이메일" -outform PEM -out "C:\cert\도메인.csr"
-> 여기서 부터는 C:\cert폴더로 이동해서 실행
8. PJAC를 이용하여 CA user account를 등록합니다.
java -jar acme_client.jar --command register -a "C:\cert\account.key" --with-agreement-update --email 이메일
9. 인증서를 요청하고 http-01 challenge 파일을 다운로드 받습니다.
참고사항(http-01 challenge)
https://certbot.eff.org/docs/challenges.html
Challenges — Certbot 1.4.0.dev0 documentation
Challenges To receive a certificate from Let’s Encrypt certificate authority (CA), you must pass a challenge to prove you control each of the domain names that will be listed in the certificate. A challenge is one of a list of specified tasks that only som
certbot.eff.org
java -jar acme_client.jar --command order-certificate -a "C:\cert\account.key" -w "C:\cert" -c "C:\cert\도메인.csr" --well-known-dir "C:\cert" --one-dir-for-well-known
10. 이제 C:\cert폴더에 알수없는이름의 긴 파일명이 생성되었음을 확인. 그게 http-01 challenge 파일
그파일을 Tomcat 설치 경로 하위에 있는 webapps\root\.well-known\acme-challenge 폴더에 복사합니다.
윈도우에서 .well-known폴더를 생성하려고 하면 에러발생할 수 있습니다. 에러가 발생한다면 폴더이름 마지막에도 . 을 찍어서 .well-known. 으로 만들면 됩니다.
이제 Tomcat을 80포트로 만들고 Http connector 설정해서 접속 가능해야 합니다.
해당 포트로 접속가능한지 테스트 해보기
http://도메인/.well-known/acme-challenge/알수없는이름파일명 을 했을때 해당 파일 내용이 나타나야 합니다.
아니면 해당 폴더에 test.txt파일을 만들어 테스트 해보아도 됩니다.
http://도메인/.well-known/acme-challenge/test.txt
**해당 파일이 확인되지 않으면 경로 설정이나 접속포트를 다시 확인해야 합니다.**
11. 다시 C:\cert 폴더로 돌아와서 PJAC를 이용하여 challenge파일을 검증 합니다.(도메인검증verify)
java -jar acme_client.jar --command verify-domain -a "C:\cert\account.key" -w "C:\cert" -c "C:\cert\도메인.csr"
12. 검증이 완료 되면 인증서를 생성 및 다운로드
java -jar acme_client.jar --command generate-certificate -a "C:\cert\account.key" -w "C:\cert" -c "C:\cert\도메인.csr" --cert-dir "C:\cert"
13. C:\cert\ 폴더에 EPM 파일 3개를 확인(cert.pem, chain.pem, fullchain.pem)
14. Tomcat에서 사용하기 위해 인증서 파일을 변환
openssl pkcs12 -export -in "C:\cert\fullchain.pem" -inkey "C:\cert\도메인.key" -out "C:\cert\keystore.p12" -name tomcat -CAfile "C:\cert\chain.pem" -caname root -password pass:패스워드
15. Tomcat에 SSL 인증서 적용 톰캣의 conf -> server.xml 에 connector 설정
(톰캣7.0)
<Connector SSLEnabled="true" clientAuth="false" keystoreFile="C:\cert\keystore.p12" keystorePass="khknjhplay" keystoreType="pkcs12" maxThreads="150" port="8443" protocol="org.apache.coyote.http11.Http11Protocol" scheme="https" secure="true" sslProtocol="TLS"/>
(톰캣8.5이상)
- <Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"
- maxThreads="150" SSLEnabled="true">
- <SSLHostConfig>
- <Certificate certificateKeystoreFile="C:\cert\keystore.p12"
- certificateKeystorePassword="패스워드"
- certificateKeystoreType ="pkcs12" type="RSA" />
- </SSLHostConfig>
- </Connector>
인증서갱신하기
Let's Encrypt는 90일이기때문에 재발급받아야한다. 만료일이 가까워지면 메일이 온다.
위의 9.번 부터 다시 해서 재발급 받으면 된다.
아래 내용때문에 몇일동안 삽질함...ㅠ
기존 프로젝트에 발급을 받을려고 하다가 10.번 폴더 및 생성된 파일(http-01)이 외부에서 확인안되는 문제가 있어서 그냥 새로 빈? 톰캣을 생성해서 실행해서 거기다 도메인 인증을 요청해서 받았다. 그렇게 받은 해당 도메인 인증서를 기존 톰캣 폴더에 넣어서 인증을 받게 되었다.
해당 내용은 https://bigboss.io/ 이분의 내용에서 많이 도움 받았습니다.
댓글도쓰고 메일도 보내고 계속 도움을 요청 해서 몇일, 몇주에 걸쳐 해결 하였습니다.
빅보스님 감사합니다...^^