
GCE에서 Nginx + Tomcat을 설치 한 후 처음으로 수행하는 SSL 설정
2022-10-04 last update
6 minutes reading Tomcat SSL gce letsencrypt nginx절차
Let's Encrypt로 인증서 발급
sudo apt-get install certbot
Let's Encrypt는 Python에서 실행 중이며 런타임에 문자 코드 오류가 발생할 수 있으므로 확인하고 변경합니다.
python
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
이것을 utf-8로 바꾼다.
sudo vi /usr/lib/python2.7/sitecustomze.py
마지막에 2행을 추가.
# install the apport exception handler if available
try:
import apport_python_hook
except ImportError:
pass
else:
apport_python_hook.install()
import sys
sys.setdefaultencoding('utf-8')
또, 도메인 소유자의 인증을 위해서 TCP 포트의 80번과 443번에 접속되므로, 개방되어 있지 않으면 개방해 둔다.
Nginx와 Tomcat은 일단 중단됩니다.
sudo /etc/init.d/nginx stop
sudo /etc/init.d/tomcat stop
certbot 를 실행한다.
certbot certonly --standalone -d example.jp
example.jp는 자신의 도메인으로 대체합니다.
Tomcat의 HTTPS 통신 포트 열기
Nginx에서 443포트를 기다리고 Tomcat에서 설정하는 58080포트에 연결하도록 하기 위해 GCE 방화벽 설정에서 58080포트를 열어 둔다.
Nginx 설정 변경
/etc/nginx/sites-enabled/tomcat.conf를 만듭니다.
tomcat.conf
# HTTP
server {
client_max_body_size 20M;
listen 80;
server_name example.jp;
root /var/www/tomcat;
access_log /var/log/nginx/tomcat_access.log;
error_log /var/log/nginx/tomcat_error.log;
location / {
proxy_pass http://127.0.0.1:8080/;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
# HTTPS
server {
client_max_body_size 20M;
listen 443 ssl;
server_name example.jp;
root /var/www/tomcat;
ssl on;
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDH !aNULL !eNULL !SSLv2 !SSLv3';
ssl_certificate /etc/letsencrypt/live/example.jp/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.jp/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/example.jp/chain.pem;
access_log /var/log/nginx/tomcat_access.log;
error_log /var/log/nginx/tomcat_error.log;
location / {
proxy_pass http://127.0.0.1:58080/;
}
}
example.jp(5개소)는 자신의 도메인으로 변경한다.
설정 파일의 문법 검사.
sudo nginx -t
> nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
> nginx: configuration file /etc/nginx/nginx.conf test is successful
문제가 있으면 구성 파일을 검토하십시오.
Tomcat 설정 변경
/etc/tomcat8/server.xml을 편집합니다.
server.xml
...中略
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
maxThreads="450"
URIEncoding="UTF-8" />
<Connector port="58080" protocol="HTTP/1.1"
proxyPort="443" redirectPort="443"
scheme="https"
secure="true"
connectionTimeout="20000"
maxThreads="450"
URIEncoding="UTF-8" />
...中略
<Valve className="org.apache.catalina.valves.RemoteIpValve"
protocolHeader="x-forwarded-proto"/>
Nginx, Tomcat 시작
sudo /etc/init.d/nginx start
sudo /etc/init.d/tomcat8 start
브라우저에서 https://example.jp(내 도메인)에 연결할 수 있으면 OK.
SSL 안전 점검
SSL Server Test 에서 자신의 도메인을 입력하고 A 판정 이상이라면 OK.
SSL 인증서 업데이트 설정
/etc/cron.d/certbot을 Nginx 용으로 편집하십시오.
편집 전
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew
편집 후
0 */12 * * * root certbot -q renew --pre-hook "systemctl stop nginx" --post-hook "systemctl start nginx"
certbot 의 갱신 작업 전후로, Nginx 를 정지하는 설정으로 변경하고 있다.