letsencrypt利用 Debian 9 StretchのNginxをSSL(http2)サイト化

2017/07/16[公開] 2019/03/02[最終更新]

 Debian 9 Stretchに移行計画中です。新規インストールしたStretchに現行サイトからデータを移す予定です。

 Let’s Encrypt証明書でサイト全体をSSL通信(HTTP/2)にして、SSL Server TEST【A+】のテスト結果になるまでの設定内容です。以前の記事【Debian 9 StretchでNginx+PHP7.0+MariaDBをインストール】で設定した環境前提です。

このページの目次

スポンサー リンク

Certbotインストール

 Debian 9 Stretchは、Letsencrypt用パッケージのCertbotの安定版が利用できます。まずはこれをインストールします。

# apt-get install certbot

 ただし、Nginx用プラグインはまだ無いようなのでcertonly –webroot オプションを利用します。その際に認証用ディレクトリを/var/lib/letsencrypt にまとめます。サブドメインを含めた複数サイトの証明書を作成するときに管理しやすくなります。

  /etc/nginx/conf.d/default.conf  を編集します。default.confファイルはデフォルトファイル名ですが、これは環境によりファイル名が違います。

location ^~ /.well-known/acme-challenge {
    alias /var/lib/letsencrypt/.well-known/acme-challenge;
    default_type "text/plain";
    try_files $uri =404;
}

これをserver { }内に追加します。私は{ }内の一番下(赤字部分)に追加しました。

server {
    listen       80 ;
    server_name  def-4.com www.def-4.com;

 location / { root /usr/share/nginx/html;
...............以下略................................

....................................................

    location ^~ /.well-known/acme-challenge {
        alias /var/lib/letsencrypt/.well-known/acme-challenge;
        default_type "text/plain";
        try_files $uri =404;
    }
}

設定を反映させるためにnginxを再起動します。

# /etc/init.d/nginx restart

証明書発行

 certbot certonly –webroot –webroot-path /var/lib/letsencrypt -d [domain]で証明書を発行します。初回はメールアドレスの入力と、ACMEサーバーへの登録に同意するかどうか聞かれます。それも含めて、当サイトdef-4.com で発行する場合の例は以下です。

certbot certonly -m [e-mail-address] --agree-tos --webroot --webroot-path /var/lib/letsencrypt -d def-4.com -d www.def-4.com

 発行された証明書の保存場所がこちら。def-4.com部分はこのサイトのドメイン名です。最後の数字部分が更新される毎に増えていきます。

  • /etc/letsencrypt/archive/def-4.com/cert1.pem …サーバ証明書(公開鍵)
  • /etc/letsencrypt/archive/def-4.com/privkey1.pem …秘密鍵
  • /etc/letsencrypt/archive/def-4.com/chain1.pem …中間証明書
  • /etc/letsencrypt/archive/def-4.com/fullchain1.pem …サーバ証明書と中間証明書が結合されたファイル

★実際に設定に使用するのは同時に作成されているエイリアスのファイルを指定します。それによって、3ヶ月毎に証明書ファイルが更新されていっても、nginx側の設定変更をする必要がなくなります。

  • /etc/letsencrypt/live/def-4.com/cert.pem…サーバ証明書(公開鍵)
  • /etc/letsencrypt/live/def-4.com/privkey.pem…秘密鍵
  • /etc/letsencrypt/live/def-4.com/chain.pem…中間証明書
  • /etc/letsencrypt/live/def-4.com/fullchain.pem …サーバ証明書と中間証明書が結合されたファイル

HTTP/2化と証明書インストール

 再度、 /etc/nginx/conf.d/default.conf もしくは同じディレクトリにある該当ファイルを編集して、HTTP/2対応と証明書をインストールします。(赤字部分を追加)

server {
    listen       80 ;
    server_name  def-4.com www.def-4.com;

 location / { root /usr/share/nginx/html;
...............以下略................................

....................................................

    location ^~ /.well-known/acme-challenge {
        alias /var/lib/letsencrypt/.well-known/acme-challenge;
        default_type "text/plain";
        try_files $uri =404;
    }
}

↓ ↓ ↓ ↓

server {
    listen       80 ;
    server_name  def-4.com www.def-4.com;
    return 301 https://$host$request_uri;
}
    
server {
    listen       443 ssl http2 ;
    server_name  def-4.com www.def-4.com;

    ssl_certificate /etc/letsencrypt/live/def-4.com/fullchain.pem; 
    ssl_certificate_key /etc/letsencrypt/live/def-4.com/privkey.pem;

    ssl_prefer_server_ciphers  on;
    ssl_session_cache   shared:SSL:10m;
    add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";

 location / { root /usr/share/nginx/html;
...............以下略................................

....................................................

    location ^~ /.well-known/acme-challenge {
        alias /var/lib/letsencrypt/.well-known/acme-challenge;
        default_type "text/plain";
        try_files $uri =404;
    }
}

4-5行目

 サイト全体をSSL化するのでreturn 301 https://$host$request_uri; でhttp://~のアクセスをhttps://~にリダイレクトします。

8行目

 ポート443の待ち受けでSSLを有効、さらにHTTP/2を有効にします。

11-12行目

 サーバー証明書と秘密鍵のパスを指定しています。サーバ証明書と中間証明書が結合されたファイルfullchain.pem の方を指定しました。

Server SSL TESTでA+を出す設定

 Debian Stretchではデフォルト設定でSSL Server TEST【A-】のテスト結果になりますが、これを【A+】のテスト結果にするのが14-16行目です。

14行目

 Forward Secrecy(FS)を有効にします。ssl_prefer_server_ciphers on;

15行目

 Session resumption (caching)を有効にします。ssl_session_cache shared:SSL:10m;

16行目

 HSTS (HTTP Strict Transport Security)を有効にします。(サイト全体SSL化が必須)add_header Strict-Transport-Security “max-age=31536000; includeSubdomains”;

Nginx再起動

nginx.conf(conf.dディレクトリ含む)のテストnginx -t をしてエラーや警告がなければ、設定を反映させるためにnginxを再起動します。

# nginx -t
# /etc/init.d/nginx restart

Cronで証明書の更新自動化

 Let’s Encrypt証明書の有効期限は3ヶ月です。更新忘れの心配がないようにCronに、certbot renew を入れて自動更新にします。

 renewコマンドは、有効期限が30日以内なら更新、それ以上ならチェックのみでスルーしてくれるので、、週一で深夜にCronに実行させる設定にしました。オプション-q はエラーがあった時だけメッセージを出してくれるので、cronに設定する場合は付けたほうが良いでしょう。

 設定ファイルは /etc/crontab です。毎週金曜日のam4時15分に実行する設定例です。nginxをリロードする必要がありました。

# m h dom mon dow user  command
15 4 * * 5 root certbot renew -q && service nginx reload

設定完了

 以上で、Let’s Encrypt証明書でサイト全体をSSL通信(HTTP/2)にして、SSL Server TEST【A+】のテスト結果になりました。今回のDebian Stretchでは、Opensslのバージョンが1.1.0のため、SSLプロトコルやCipher Suitesの脆弱性対策設定を省略できました。

 いままで、このサイトはあえてXP_IE8でも証明書の警告は出るがなんとか表示できるようにしていたのが、Stretchに移行したら完全に切り捨てとなります。まあ、影響は無いでしょう。なんとか今月中に移行作業を決行したいところです。

スポンサー リンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です