Let's Encryptは無料で利用できて商用利用可能な証明書発行サービスです。https化に必要なSSL証明書が無料で発行されるなんて、良い時代になりましたね。
しかし証明書の有効期限は90日なのでその度に、更新作業は面倒なので、自動化してしまいましょう。
[root@localhost ~]# cd /usr/local/ ← ディレクトリ移動 |
[root@localhost local]# git clone https://github.com/certbot/certbot ← Certbotクライアントダウンロード |
[root@localhost local]# cd ← ディレクトリ移動| [root@localhost ~]# /usr/local/certbot/certbot-auto -n ← Certbotクライアントインストール|
[root@localhost ~]# sudo ./certbot-auto certonly |
指示に従ってすすめていきます。 |
Saving debug log to /var/log/letsencrypt/letsencrypt.log How would you like to authenticate with the ACME CA? - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1: Apache Web Server plugin - Beta (apache) 2: Nginx Web Server plugin (nginx) 3: Spin up a temporary webserver (standalone) 4: Place files in webroot directory (webroot) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Select the appropriate number [1-4] then [enter] (press 'c' to cancel): 2 ←2(Nginx)を選択 |Plugins selected: Authenticator nginx, Installer None Please enter in your domain name(s) (comma and/or space separated) (Enter 'c' to cancel): hoge.jp ←ドメイン名(FQDN)を入力 Obtaining a new certificate Performing the following challenges: http-01 challenge for hoge.jp Waiting for verification... Cleaning up challenges IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/hoge.jp/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/hoge.jp/privkey.pem Your cert will expire on 2018-11-23. To obtain a new or tweaked version of this certificate in the future, simply run certbot-auto again. To non-interactively renew *all* of your certificates, run "certbot-auto renew" - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le |
nginxのSSLを設定する際に、必要なパラメーターとして”ssl_dhparam”があります。これはnginxの1.11.0から必須になったパラメーターで、鍵交換アルゴリズムで使用される素数を格納するファイルになります。
このファイルはopensslコマンドで作成する必要があります。ファイルを保存するパスは”/etc/nginx/ssl/”を指定します。
[root@localhost ~]# mkdir /etc/nginx/ssl |
[root@localhost ~]# openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048 |
Generating DH parameters, 2048 bit long safe prime, generator 2 This is going to take a long time ................................................+.................................................. ....................+.............................................................................. 【略】 ........................................+..........................................+............... .............++*++* |
サーバーの性能によっては、かなり時間が掛かりますが、途中で止めずに暫く待ってみて下さい。エラーが表示されずにプロンプトに戻れば、コマンドの実行は完了です。
[root@localhost ~]# vi /etc/nginx/sites-available/hoge.com.conf |
server { listen 80; server_name hoge.com www.hoge.com; rewrite ^ https://$server_name$request_uri? permanent; } server { listen 443 ssl; server_name hoge.com www.hoge.com; access_log /var/log/nginx/hoge.com-access.log main; error_log /var/log/nginx/hoge.com-error.log; root /home/www/hoge.com; ssl_certificate /etc/letsencrypt/live/hoge.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/hoge.com/privkey.pem; ssl_session_timeout 1d; ssl_session_cache shared:SSL:50m; ssl_session_tickets on; ssl_dhparam /etc/nginx/ssl/dhparam.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { index index.php index.html; } location ~ \.php$ { root /home/www/hoge.com try_files $uri $uri/ =404; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } |
[root@localhost ~]# systemctl restart nginx &color(lime){←nginx再起動 |
Certbotのサーバー証明書の有効期間は3ヶ月のため、毎月自動でサーバー証明書を更新するようにする。
[root@localhost ~]# vi /etc/cron.monthly/certbot ← サーバー証明書自動更新スクリプト作成 |
#!/bin/sh log=`mktemp` code=0 # # 証明書更新 # 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}'` if [ ${authenticator} = 'webroot' ]; then # Web認証の場合 # ドキュメントルート取得 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 'Webサーバー稼働中のためスタンドアロン認証不可' else /usr/local/certbot/certbot-auto certonly -a standalone \ -d ${domain} --renew-by-default >> ${log} 2>&1 [ $? -ne 0 ] && cat ${log} fi fi done # # 証明書更新反映 # # Webサーバー設定再読込み lsof -i:443 > /dev/null 2>&1 if [ $? -eq 0 ]; then rpm -q systemd > /dev/null 2>&1 if [ $? -eq 0 ]; then systemctl reload httpd else /etc/rc.d/init.d/httpd reload > /dev/null 2>&1 fi fi # SMTPサーバー設定再読込み lsof -i:465 > /dev/null 2>&1 if [ $? -eq 0 ]; then rpm -q systemd > /dev/null 2>&1 if [ $? -eq 0 ]; then systemctl reload postfix else /etc/rc.d/init.d/postfix reload > /dev/null 2>&1 fi fi # IMAPサーバー設定再読込み lsof -i:995 > /dev/null 2>&1 if [ $? -eq 0 ]; then rpm -q systemd > /dev/null 2>&1 if [ $? -eq 0 ]; then systemctl reload dovecot else /etc/rc.d/init.d/dovecot reload > /dev/null 2>&1 fi fi # # ログをsyslogへ出力後削除 # cat ${log} | logger -t `basename ${0}` ; rm -f ${log} |
[root@localhost ~]# chmod +x /etc/cron.monthly/certbot ← サーバー証明書自動更新スクリプトへ実行権限付加 |