톰캣 웹 서비스에 Letsencrypt SSL 적용하기.. (실패->성공)

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]

에 이어집니다.