2018. 3. 2. 20:00ㆍ공부/SPRING
톰캣 웹 서비스에 Letsencrypt SSL 적용하기..
java keytool 사용 / 스프링부트 SSL 설정 출처: http://iwan2fly.tistory.com/202
에 이은 2차 글입니다.
개발환경에서는 스프링부트의 내장 톰캣을 사용하기 때문에, 이전 글에서 사용했던 몇 몇 코드만 가지고 https를 적용할 수 있습니다. 하지만 실제 운영하는 서버에 https를 적용하려면, 환경도 다르고 비용도 들어가죠. 하지만 무료로 SSL 인증서를 발급 받을 수 있는 곳이 생겼다고 합니다.
https://letsencrypt.org/
HTTPS 가 선택이 아닌 필수가 되어가는 시점에서 매우 반가운 일이고, 이를 받아서 적용하는 것도 크게 어렵지는 않습니다. 쉘을 이용할 수 있다면 Certbot 이라는 곳에서 스크립트를 다운로드 받아 타이핑 몇 번으로 인증서를 발급받을 수도 있습니다.
https://certbot.eff.org/
저의 경우, software = 'none of the above', System = 'CentOs 6' 를 선택해서 설치했는데, 두 옵션을 선택하면 아래와 같은 매뉴얼 페이지가 나타납니다.
#1 certbot 다운로드 및 실행옵션 추가
wget https://dl.eff.org/certbot-auto
chmod a+x cerbot-auto
#2 cerbot-auto 실행 실패
- certbot 내부 웹서버를 이용한 인증
- 80,443 포트가 열려있고, 점유되어 있지 않아야 함
- iptables 를 이용해 포트 포워딩을 하고 있을 경우 (내부 웹서버가 80번 포트를 이용하는 듯)
[root@venus ~]# ./certbot-auto certonly
Saving debug log to /var/log/letsencrypt/letsencrypt.log
How would you like to authenticate with the ACME CA?
-------------------------------------------------------------------------------
1: Apache Web Server plugin - Beta (apache)
2: Spin up a temporary webserver (standalone)
3: Place files in webroot directory (webroot)
-------------------------------------------------------------------------------
Select the appropriate number [1-3] then [enter] (press 'c' to cancel): 2
Plugins selected: Authenticator standalone, Installer None
Please enter in your domain name(s) (comma and/or space separated) (Enter 'c'
to cancel): mydomain.co.kr
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for mydomain.co.kr
Waiting for verification...
Cleaning up challenges
Failed authorization procedure. glog.co.kr (http-01): urn:acme:error:unauthorized :: The client lacks sufficient authorization :: Invalid response from http://mydomain.co.kr/.well-known/acme-challenge/eteSkX735iuOpeJ-QB0ylQ-8cqlEYOsghI7OmEv_pwM [210.116.66.133]: 404 (이미 점유되어 있어서 에러 )
IMPORTANT NOTES:
- The following errors were reported by the server:
Domain: mydomain.co.kr
Type: unauthorized
Detail: Invalid response from
http://mydomain.co.kr/.well-known/acme-challenge/eteSkX735iuOpeJ-QB0ylQ-8cqlEYOsghI7OmEv_pwM
[210.116.66.133]: 404
To fix these errors, please make sure that your domain name was
entered correctly and the DNS A/AAAA record(s) for that domain
contain(s) the right IP address.
#3 certbot-auto 실행 성공
[root@venus ~]# ./certbot-auto certonly
Saving debug log to /var/log/letsencrypt/letsencrypt.log
How would you like to authenticate with the ACME CA?
-------------------------------------------------------------------------------
1: Apache Web Server plugin - Beta (apache)
2: Spin up a temporary webserver (standalone)
3: Place files in webroot directory (webroot)
-------------------------------------------------------------------------------
Select the appropriate number [1-3] then [enter] (press 'c' to cancel): 2
Plugins selected: Authenticator standalone, Installer None
Please enter in your domain name(s) (comma and/or space separated) (Enter 'c'
to cancel): mydomain.co.kr
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for mydomain.co.kr
Waiting for verification...
Cleaning up challenges
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/mydomain.co.kr/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/mydomain.co.kr/privkey.pem
Your cert will expire on 2018-05-31. To obtain a new or tweaked
version of this certificate in the future, simply run certbot-auto
again. To non-interactively renew *all* of your certificates, run
"certbot-auto renew"
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
#4 인증서 확인
[root@venus mydomain.co.kr]# ls -alF
합계 12
drwxr-xr-x 2 root root 4096 2018-03-02 19:41 ./
drwx------ 4 root root 4096 2018-03-02 19:41 ../
-rw-r--r-- 1 root root 543 2018-03-02 19:41 README
lrwxrwxrwx 1 root root 34 2018-03-02 19:41 cert.pem -> ../../archive/mydomain.co.kr/cert1.pem
lrwxrwxrwx 1 root root 35 2018-03-02 19:41 chain.pem -> ../../archive/mydomain.co.kr/chain1.pem
lrwxrwxrwx 1 root root 39 2018-03-02 19:41 fullchain.pem -> ../../archive/mydomain.co.kr/fullchain1.pem
lrwxrwxrwx 1 root root 37 2018-03-02 19:41 privkey.pem -> ../../archive/mydomain.co.kr/privkey1.pem
#5 pkcs12 형식으로 변환
openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out keystore.p12 -name tomcat -CAfile chain.pem -caname root
#6 톰캣 서버 server.xml 에 keystoreFile, keystorePass 세팅
빨간 부분 때문에 제대로 동작을 안함
<Connector port="8443" proxyPort="443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" keystoreFile="/home/iwan2fly/tomcat/keystore.p12" keystorePass="mypassword" />
#7 https://mydomain.co.kr 은 잘 접속하지만, http를 https 로 리다이렉트하지 못함.
아래 설정을 web.xml 에 추가하면, 서버가 응답을 거부함 ( iptables 설정과 관련이 있는 듯 함 )
<security-constraint>
<web-resource-collection>
<web-resource-name>Automatic SSL Forward</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<!-- auth-constraint goes here if you requre authentication -->
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
iptables 설정
iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
REDIRECT tcp -- anywhere anywhere tcp dpt:http redir ports 8080
REDIRECT tcp -- anywhere anywhere tcp dpt:https redir ports 8443
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
#8 iptables 설정을 제거하고 proxyPort 세팅도 제거하고, 방화벽을 8080, 8443 열어주면 제대로 작동함.
톰캣을 일반유저 권한으로 80번 포트를 사용할 수 없고..
root 권한으로 실행시킬 경우 보안 문제가 발생할 여지가 있으므로..
이 방법은 결국 폐기... 톰캣 앞에 nginx 를 두는 것으로 바꾸려 함.
nginx - tomcat - letsencrypt ssl 적용하기 출처: http://iwan2fly.tistory.com/204 [Dreaming]
에 이어집니다.