こんにちは!
かずきです。

Nginxと無料でサーバー証明書を取得できるCertbotを利用して暗号化通信の設定について投稿します。
※すでにNginxでWebサーバー構築済みの方はNginxを停止してCertbotのインストールから進めて下さい。

 

Nginxのリポジトリを登録

# rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

 

Nginxのインストール

# yum install --enablerepo=nginx nginx

 

Certbotインストール

# cd /usr/local/
# git clone https://github.com/certbot/certbot
# certbot/certbot-auto -n

 

サーバー証明書の取得

# /usr/local/certbot/certbot-auto --webroot -w <ドキュメントルート> -m <メールアドレス> -d <ドメイン名> --agree-tos

 

Niginxの設定

# cd /etc/nginx/conf.d
# vi <ドメイン名>-ssl.conf

・ファイルの内容は以下のように設定します

server {
    listen       443 ssl http2;
    listen       [::]:443 ssl http2;
    server_name  <ドメイン名>;
    
    add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains;preload';

    ssl on;
    ssl_certificate /etc/letsencrypt/live/<ドメイン名>/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/<ドメイン名>/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/<ドメイン名>/fullchain.pem;
    
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS;
    ssl_dhparam /etc/nginx/ssl/dhparam.pem;
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8;
    ssl_session_cache shared:ssl_session_cache:10m;

    #charset koi8-r;
    #access_log  /var/log/nginx/log/host.access.log  main;

    location / {
        root   <ドキュメントルート>;
        index  index.html index.htm;
    }
}

 

サーバー証明書自動更新の設定

証明書自動更新のスクリプトを作成します

# vi /etc/cron.monthly/certbot
#!/bin/sh
log=`mktemp`
code=0

#
# /etc/letsencrypt/renewalディレクトリ内に更新情報ファイルのある証明書を更新
#
for conf in `ls /etc/letsencrypt/renewal/`
do
    # ファイルからドメイン名取得
    domain=`echo ${conf}|sed -e 's/\([^ ]*\)\.conf/\1/p' -e d`

    # ファイルから認証方式取得
    authenticator=`grep authenticator /etc/letsencrypt/renewal/${conf}|awk '{print $3}'`

    # 取得した認証方式がWeb認証の場合
    if [ ${authenticator} = 'webroot' ]; then        

        # ファイルからドキュメントルート取得
        webroot=`grep -A 1 webroot_map  /etc/letsencrypt/renewal/${conf}|grep =|awk '{print $3}'`

        # 証明書更新
        /usr/local/certbot/certbot-auto certonly --webroot \
        -w ${webroot} -d ${domain} --renew-by-default >> ${log} 2>&1
        [ $? -ne 0 ] && cat ${log}

    else        # 認証方式がスタンドアロン認証の場合

        # 証明書更新
        lsof -i:80 > /dev/null 2>&1
        if [ $? -eq 0 ]; then
            echo 'Certificate update failed because web server is running.'
        else
            /usr/local/certbot/certbot-auto certonly -a standalone \
            -d ${domain} --renew-by-default >> ${log} 2>&1
            [ $? -ne 0 ] && cat ${log}
        fi
    fi
done

# 証明書更新反映

# Nginx設定再読み込み
lsof -i:443 > /dev/null 2>&1
if [ $? -eq 0 ]; then
	systemctl reload nginx
fi

# ログをsyslogへ出力
cat ${log}|logger -t `basename ${0}` ; rm -f ${log}

 

設定の確認

Webブラウザでhttps://<ドメイン名>でアクセスしてセキュリティの警告が表示されず、アドレスバーに南京錠のマークか表示されていること

Qualys SSL LabsのSSL Server TestでHostnameに設定したドメイン名を入力しA+評価となることを確認する

 

参考させていただいたサイト

CentOS7 に Nginx をインストールする | SaintSouth.NET
Webサーバー間通信内容暗号化(Apache+mod_SSL+Certbot) – CentOSで自宅サーバー構築