GCE에서 Nginx + Tomcat을 설치 한 후 처음으로 수행하는 SSL 설정

GCE에서 Nginx + Tomcat을 설치 한 후 처음으로 수행하는 SSL 설정

2022-10-04 last update

6 minutes reading Tomcat SSL gce letsencrypt nginx

절차


  • Let's Encrypt에서 인증서 발급
  • Tomcat HTTPS 통신 포트를 엽니 다
  • Nginx 설정 변경
  • Tomcat 설정 변경
  • SSL 안전 점검
  • SSL 인증서 업데이트 설정

  • 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포트를 열어 둔다.
  • Google Cloud Platform 사이드 메뉴 → VPC 네트워크 → 방화벽 규칙
  • 상단의 방화벽 규칙 만들기를 클릭하십시오
  • 내용을 각각 설정하고 작성을 클릭
  • 이름:firewall-58080(선택)
  • 타겟 : 지정된 타겟 태그
  • 타겟 태그 : firewall-58080
  • 소스 ID 범위: 0.0.0.0/0
  • 프로토콜 및 포트: tcp:58080

  • VM 인스턴스 화면에서 게시 할 인스턴스의 이름을 클릭합니다.
  • 상단의 편집을 클릭하십시오
  • 중간 가까이에있는 '네트워크 태그'에 'firewall-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 를 정지하는 설정으로 변경하고 있다.