前から気になっていたお手軽HTTPS化に挑戦する。

  • Let's encryptとは?
    • 公式サイト https://letsencrypt.org/
    • 目的はこんな感じ。

      Let's Encrypt is a free, automated, and open certificate authority brought to youby the Internet Security Research Group (ISRG). ISRG is a California public benefit corporation, and is recognized by the IRS as a tax-exempt organization under Section 501(c)(3) of the Internal Revenue Code. ISRG’s mission is to reduce financial, technological, and education barriers to secure communication over the Internet.

ちなみに、この証明書は現在(2016/5/8)だとLINE botには使用できないらしい。
ドメインの所有証明にだけで、運用者の証明ができていないからだろうか。 ところで最近モバイルでよく話題になるZero Ratingですが、HTTPSの場合はどうしてるんでしょうね。

Lets's Encryptのインストール

$ git clone https://github.com/letsencrypt/letsencrypt
$ cd letsencrypt

結構色々インストールされます。raspberrypiだと時間が掛かるかも。

証明書のインストール
ちなみに、既にこのブログが動いているnginxで取得しています。
apacheなどは自動で設定できるようですが、nginxは未対応なので証明書のみ取得。

$ ./letsencrypt-auto certonly --webroot --webroot-path /var/www/html/grav-admin -d blog.watabohh.info

nginxに設定

  • DHパラメータを生成。(非力だからか30分程度かかった)
    $ openssl dhparam -out /etc/ssl/private/dhparam.pem 2048

以下、nginxのコンフィグ

  • port 80へのアクセスは443にリダイレクトする。
  • server {
    listen 80;
    server_name blog.wataboh.info;
    rewrite ^ https://$server_name$request_uri? permanent;
    }
    server {
    listen 443 ssl;
    server_name blog.wataboh.info;
    root /var/www/html/grav-admin;
    
    ssl_certificate /etc/letsencrypt/live/blog.wataboh.info/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/blog.wataboh.info/privkey.pem;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    # 環境によっては off にすると動かないので注意 (default は on)
    ssl_session_tickets on;
    
    # 2048bit 推奨
    ssl_dhparam /etc/ssl/private/dhparam.pem;
    
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
    ssl_prefer_server_ciphers on;
    
    # HTTPS のみでサービスを提供する場合にだけ設定します
    add_header Strict-Transport-Security max-age=15768000;
    
    index index.html index.html index.php;
    
    charset utf-8;
    
    access_log  /var/log/nginx/blog.wataboh.info.access.log;
    error_log   /var/log/nginx/blog.wataboh.info.error.log;
    
    location = /favicon.ico {
    log_not_found off;
    access_log off;
    }
    
    location / {
        try_files $uri $uri/ /index.html;
        if (!-e $request_filename){ rewrite ^(.*)$ /index.php last; }
    }
    
    sendfile off;
    location ~ \.php$ {
    include fastcgi_params;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
    fastcgi_pass 127.0.0.1:9000;
    }
    }

あとは、nginxを再起動すればhttps化の完了。

$ nginx -t
$ systemctl restart nginx 

完了と言いつつ、この後RTX1200のフィルタに見事に引っかかっていたことに 1時間ほど試行錯誤する羽目になった。最終的にtcpdumpしたりして。

証明書の自動更新
証明書の期限が3ヶ月と短いので月1で更新するようにcronに設定

$ crontab -e
00 05 01 * * /root/work/letsencrypt/letsencrypt-auto renew --force-renew && /bin/systemctl reload nginx

最近dotfilesを整備しているのだけれど、どうしてもcygwinが足を引っ張る。
会社で使っているPCがwindows 7な上にまさかの32bitだったので、VM噛ませるのも辛いしどうしようホント。
bash on ubuntu on windowsには期待してます。

Previous Post