nginx와 dehydrated의 조합으로 ACME 클라이언트를 사용한 간편한 ssl 지원 웹 서버 구축 IPv6 전용

FreeBSD 11.2-RELEASE 가 전제입니다만, 쓰기 시점에서는 10.4-RELEASE 나 12-current 에서도 적응 가능합니다.
또 본 기사는 FreeBSD 경험자를 대상으로 쓰고 있으므로, 세세한 배려는 되어 있지 않습니다.

아래 준비



OS는 최신 패치가 적용되고 포트 skeleton도 가능한 최신 버전과 동기화됩니다.
IPv6에서 인터넷에 연결되어 있어야 합니다.

애플리케이션 도입



ports 로부터 다음의 패키지를 인스코 한다.
  • www/nginx
  • security/dehydrated

  • ACME 클라이언트 취득을 위한 계정 생성



    다음 명령을 실행하여 ACME 계정을 발급합니다.
    # dehydrated --register --accept-terms --ipv6 --domain %%HOSTNAME%% --ocsp --challenge http-01
    

    %%HOSTNAME%% 의 부분은 향후 사용할 예정인 웹 서버 주소로, 실제로 인터넷망으로부터 액세스 할 수 있는 주소인 것.
    이것이 할 수 없으면 앞으로는 진행할 수 없기 때문에 주의.
    또한, %%HOSTNAME%% 는 모두 반각 소문자인 것에 주의.
    일본어 도메인에서 이용하는 경우는 자동 변환하지 않기 때문에, 미리 IDN 로 Punycode 화한 도메인명을 지정하는 것.

    ACME 클라이언트 인증에 사용되는 특정 디렉토리 설정



    nginx 설정에서 server 절에 다음 alias를 추가합니다.

    nginx.conf
            location ^~ /.well-known/acme-challenge/ {
                alias /usr/local/www/dehydrated/;
            }
    

    인증서 발급 작업


    # dehydrated --cron --ipv6 --domain %%HOSTNAME%% --ocsp --challenge http-01
    

    문제가 없으면 이하의 디렉토리에 증명서와 개인키등이 작성되고 있을 것입니다.
    /usr/local/etc/dehydrated/certs/%%HOSTNAME%%/
    

    생성되는 파일 이름 (실제로 정적 링크)
  • cert.csr
  • cert.pem
  • chain.pem
  • fullchain.pem
  • privkey.pem

  • nginx에 작성된 인증서를 작성하여 ssl 준비



    이전에 server 절에 추가한 부분과는 별도로 server 절을 새로 작성합니다.

    nginx.conf
        server {
            listen [::]:443 ssl http2;
            ssl_certificate /usr/local/etc/dehydrated/certs/%%HOSTNAME%%/fullchain.pem;
            ssl_certificate_key /usr/local/etc/dehydrated/certs/%%HOSTNAME%%/privkey.pem;
            ssl_trusted_certificate /usr/local/etc/dehydrated/certs/%%HOSTNAME%%/cert.pem;
            ssl_ciphers HIGH:!aNULL:!MD5;
            ssl_protocols tlsv1.1 tlsv1.2 tlsv1.3;
            ssl_prefer_server_ciphers on;
            ssl_stapling on;
            ssl_stapling_verify on;
            ssl_session_cache shared:SSL:10m;
            ssl_session_timeout 10m;
            add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";
            resolver [2001:4860:4860::8844] [2001:4860:4860::8888] valid=60s ipv6=on;
            resolver_timeout 5s;
        }
    

    nginx 재부팅


    # service nginx reload
    

    인증서 만료 날짜 자동 업데이트



    매주 정기적으로 업데이트 스크립트를 실행하도록 설정합니다.

    /etc/periodic.conf.local
    weekly_dehydrated_enable="YES"
    weekly_dehydrated_flags="--ipv6 --domain %%HOSTNAME%%"
    

    증명서의 자동 갱신 후, nginx 에게도 전해 주지 않으면 오래된 증명서를 잡은 채이므로, 배포 스크립트를 작성해, nginx 의 config 를 리로드 시킨다.

    /usr/local/etc/dehydrated/deploy.sh
    #!/bin/sh
    /usr/local/sbin/nginx -s reload
    

    당연히 쉘 스크립트이므로 실행 권한도 부여하는 것을 잊지 않도록.
    chmod +x /usr/local/etc/dehydrated/deploy.sh
    

    방금 편집한 periodic.conf.local 에도 이 배포 스크립트를 지정시켜 둔다.

    /etc/periodic.conf.local
    weekly_dehydrated_deployscript="/usr/local/etc/dehydrated/deploy.sh"
    

    🙌

    좋은 웹페이지 즐겨찾기