영혼 없이 Windows용 Tomcat에 Let’s Encrypt SSL 인증서 설치하기

Let’s Encrypt 인증서를 설치하려고 검색을 해보니 리눅스 환경에서 certbot을 활용하는 방법이 주로 나왔습니다. 윈도 환경에서는 IIS에 적용하는 방법은 종종 찾을 수 있었지만 Tomcat에 적용하는 방법은 찾기 어려웠습니다. 아무래도 윈도에서 Tomcat으로 서버를 운영하는 사람이 많지 않아서 그런 것 같습니다. 누군가에게 티끌만큼이라도 도움이 되었으면 하는 마음으로 제가 삽질한 내용을 정리해 보았습니다.

준비하기

우선 필요한 파일을 다운로드하고 설치합니다.

(1) Java와 OpenSSL을 설치하고 Path 환경변수에 추가합니다. Path 환경변수에 꼭 넣을 필요는 없지만 넣어두는 것이 정신 건강에 좋습니다. Windows용 OpenSSL은 아래 링크에서 3MB짜리 Light 버전으로 다운로드 받으면 됩니다.
https://slproweb.com/products/Win32OpenSSL.html

(2) PJAC (Porunov Java ACME Client)를 다운로드 합니다. 참고로, 이 글을 쓰는 현재 최신 버전은 v3.0.0 입니다.
https://github.com/porunov/acme_client/releases

(3) 편의를 위해 C 드라이브 루트에 cert 폴더를 만듭니다. 그리고 다운로드 받은 acme_client.jar 파일을 C:\cert에 복사합니다.

인증서 발급받기

이제 인증서를 발급받기 위해 영혼 없이 아래 명령어를 순서대로 실행하면 됩니다. 아래 명령어 중에서 한글로 적힌 부분은 각자에게 맞는 내용으로 변경하여야 합니다.

(1) OpenSSL을 이용하여 CA user account key를 생성합니다.

openssl genrsa -out "C:\cert\account.key" 2048


(2) private domain key를 생성합니다.

openssl genrsa -out "C:\cert\도메인.key" 2048


(3) 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"


(4) PJAC를 이용하여 CA user account를 등록합니다. 여기부터는 C:\cert 폴더로 이동 후 실행하여야 합니다.

java -jar acme_client.jar --command register -a "C:\cert\account.key" --with-agreement-update --email 이메일


(5) 인증서를 요청하고 http-01 challenge 파일을 다운로드 받습니다. http-01 challenge가 무엇인지 궁금하시면 구글에서 검색해 보세요.

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


(6) C:\cert 폴더를 열어보면 잡다하게 긴 이름의 파일이 하나 만들어져 있을 것입니다. 그게 http-01 challenge 파일입니다. 그 파일을 Tomcat 설치 경로 하위에 있는 webapps\ROOT\.well-known\acme-challenge 폴더에 복사합니다. 윈도 탐색기에서 “.well-known” 폴더를 만들려고 하면 에러 메시지가 뜨면서 만들어지지 않을 것입니다. 그러면 “.well-known.”과 같이 끝에도 점을 하나 더 찍으면 폴더가 만들어 집니다. Tomcat은 80 포트로 HTTP Connector를 설정하여 아래와 같은 URL로 접속 가능해야 합니다.

http://도메인/.well-known/acme-challenge/잡다구리파일명


(7) 다시 C:\cert 폴더로 돌아와서, PJAC를 이용하여 challenge 파일을 검증합니다.

java -jar acme_client.jar --command verify-domains -a "C:\cert\account.key" -w "C:\cert" -c "C:\cert\도메인.csr"


(8) 검증이 완료되면 인증서를 생성 및 다운로드합니다.

java -jar acme_client.jar --command generate-certificate -a "C:\cert\account.key" -w "C:\cert" -c "C:\cert\도메인.csr" --cert-dir "C:\cert"


(9) 이제 C:\cert 폴더에 세 개의 PEM 파일이 생긴 것을 확인할 수 있을 것입니다. (cert.pem, chain.pem, fullchain.pem)


(10) 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:패스워드


(11) 마지막으로, Tomcat에 SSL 인증서를 적용하기 위해 Tomcat의 conf 폴더에 있는 server.xml에 아래와 같이 Connector를 설정합니다.

  • Tomcat 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>
  • Tomcat 8 이하
<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"
	maxThreads="150" SSLEnabled="true"
	keystoreFile="C:\cert\keystore.p12" keystorePass="패스워드" keystoreType="pkcs12">

인증서 갱신하기

Let’s Encrypt 인증서의 유효기간은 90일이기 때문에 계속 유지하려면 주기적으로 인증서를 재발급 받아야 합니다. 만료일이 가까워지면 위의 (4)번에서 입력한 이메일 주소로 알림 메일이 옵니다. 그러면 위의 (5)번부터 (10)번까지 순서대로 다시 실행하고 Tomcat을 재시작하면 됩니다.

4 Replies to “영혼 없이 Windows용 Tomcat에 Let’s Encrypt SSL 인증서 설치하기”

  1. 안녕하세요. 초보개발자입니다.
    정리해주신 자료 잘 보고 따라해봤는데요.
    일단 잡다구리한걸 root에 넣고 확인까지 했는데요. 다만 80포트가 아닌 다른 포트를 써야되서요.
    혹시 다른포트로 지정할땐 해결방법이 없는건가해서요.

    1. Let’s Encrypt 서버에서 인증서 발급 전에 정상 도메인인지 여부를 확인하기 위해서 해당 도메인으로 연결을 시도합니다. 이 때 80포트로만 연결을 시도하기 때문에 다른 포트를 사용할 수는 없습니다. 80포트를 열어서 인증서를 발급하신 후 원하시는 포트로 변경하는 것을 추천드립니다.

Leave a Reply

Your email address will not be published. Required fields are marked *