目次

運用していたHTTPウェブサイトをHTTPS運用したい

近年Googleさんが推し進めているHTTPS化 インターネットをより安全にしよう!の一貫ですね,賛同します.

何度かHTTPS化してはいたものの,HTTPS化するたびに調べることがいつも同じだったので記事にしました.

弊サーバー環境

  • Linux CentOS7(Google Compute Engine)
  • Nginx
  • Golang1.11
  • Python2.7.x

前提

  • Nginxが動いている
  • HTTPウェブサイトが動いている
  • 登録ドメイン名を所有管理していること

使うもの

  • Let’s Encrypt(無料SSL証明書発行元)
  • Certbot(EFFが配布するSSL設定補佐コマンド)

流れ

  1. Certbotをダウンロード
  2. NginxプラグインでCertbotを稼働
  3. よく躓くエラーとその対処
  4. CertbotがNginx.confを書き換えたことを確認
  5. SSL Labsで確認
  6. 便利コマンド
  7. さらにもう一歩!

EFFが配布するCertbotをサーバーにダウンロード

$ yum install python2-certbot-nginx
// (or certbot-nginx)

NginxプラグインでCertbotを稼働

nginx.confにHTTPS化したいsever settingを書き込む

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    server {
        listen       443 default ssl;
        listen       [::]:443;
        server_name <domain(https:// などのschemeは不要)>;
        proxy_read_timeout 36000; # websocketなどの切断などの設定

        location / {
            proxy_pass http://127.0.0.1:8088; # APIやウェブサイトのポート
            root /root/go_projects/src/gitlab.com/<account_name>/<app_dir>;
            index index.html index.htm;
        }
    }

※ certbotデフォルトでは,/etc/nginx/nginx.confを書き換えに行きます. コマンドを入力したドメインが.confにあることを確認し,server {}内に自動作成したファイルを追記するまでがcertbotのお仕事.

$ certbot --nginx -d <domain_name>
// --nginxはcertbotのプラグインで,勝手に見つけて書き換えちゃうよって便利な子

E-mailの入力とHTTPS設定を対話式で求められるので自分にあう設定で入力.

よく躓くエラーとその対処

ascii can’t decode問題はpython sys utf-8で対応

$ certbot --nginx -d <domain_name>
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator nginx, Installer nginx
Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for <domain_name>
Cleaning up challenges
An unexpected error occurred:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 54: ordinal not in range(128)
Please see the logfiles in /var/log/letsencrypt for more details.

はい,encordingエラーですね. これについてはpython sysで上書きして対応します.

$ whereis python
// python の場所を確認
/usr/bin/python /usr/bin/python2.7

// 上記の中から下層にsite_packagesがある場所を見つける
$ ls /usr/lib64/python2.7
ありますぜ!オヤビン >> site_packages

// そしたら,site_packages内にsitecustomize.pyを作ってutf-8を読んでくれるようにお願いします.
$ vi /usr/lib64/python2.7/site-packages/sitecustomize.py
// pythonが立ち上がるので下記を入力してexit()
>> import sys
>> sys.setdefaultencoding('utf-8')

// 書き換えたら再度certbotを動かす
$ certbot --nginx -d <domain_name>

CertbotがNginx.confを書き換えたことを確認

成功すると下記返答が返ってきます.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://<domain_name>

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=<domain_name>
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/<domain_name>/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/<domain_name>/privkey.pem
   Your cert will expire on 2019-05-01. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot again
   with the "certonly" option. To non-interactively renew *all* of
   your certificates, run "certbot 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.confが下記のようになってるはず

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    server {
        listen       443 default ssl;
        listen       [::]:443;
        server_name <domain(https:// などのschemeは不要)>;
        proxy_read_timeout 36000; # websocketなどの切断などの設定

        location / {
            proxy_pass http://127.0.0.1:8088; # APIやウェブサイトのポート
            root /root/go_projects/src/gitlab.com/<account_name>/<app_dir>;
            index index.html index.htm;
        }
        ssl_certificate /etc/letsencrypt/live/<domain_name>/fullchain.pem; # certbotが追加する行
        ssl_certificate_key /etc/letsencrypt/live/<domain_name>/privkey.pem; # certbotが追加する行
    }

SSL Labsで確認して作業完了!

下記URLのを変更し,HTTPS化を確認
https://www.ssllabs.com/ssltest/analyze.html?d=<domain_name>

便利なコマンド

// nginx.conf構文チェック
$ nginx -t

// nginxの再起動
$ systemctl reload nginx
or
$ killall nginx && nginx

// SSL証明書の半永続化
$ crontab -e
// 入力が立ち上がるので下記記述して保存
15 1 * * * /usr/bin/certbot renew --quiet
※ am1:15にSSL証明書をチェックして期限切れ間近なら更新(renew)してくれるcronを登録

さらにもう一歩

上記でHTTPSチェックを行うと多くの場合ランクB.
ですが,Aランクが欲しい場合も一手間で簡単.

degital ocean How to secure nginx with certbot
ステップ5 - Diffie-Hellmanパラメータの更新

が便利です.

お疲れ様でした.
これで全HTTPS化やでぇぇ