riina-k.net

音楽・小説・プログラミングを手がけるリイナの拠点。

riina-k.tv に SSL(HTTPS) を導入してみた

同人サークルサイトを大規模リニューアル, mod_rewrite と初めて格闘してみた に続くリニューアル第3弾。

https 通信にしないと Google から警告を食らうという噂が!
Google Chrome、HTTPSサイトの「保護された通信」を非表示に 「デフォルトで安全が前提」 – ITmedia エンタープライズ
いよいよGoogleが本気。Chrome 68から全HTTPサイトに警告! | 常時SSL Lab. by Zenlogicのファーストサーバ株式会社

そこで riina-k.tv も https を導入してみました。
普通は SSL 証明書の発行にはかなりの金額がかかるものですが、なんと無料で使える神認証局「Let’s Encryptがありました。
インフラエンジニアの友人の助けを受けながら、これを使って SSL を導入。

まず yum してきて

$ sudo yum install certbot python-certbot-apache

riina-k.tv とそのサブドメインに対して利用できる証明書を発行します。

$ sudo certbot-auto certonly --manual \
--domain riina-k.tv --domain *.riina-k.tv \
--email riinak.tv@gmail.com --agree-tos --manual-public-ip-logging-ok \
--preferred-challenges dns-01 \
--server https://acme-v02.api.letsencrypt.org/directory

最後の –server の指定が大事みたいです。

しばらくすると

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name
_acme-challenge.riina-k.tv with the following value:

ukm9iWjG-E7UlF45iWQqe3sDADRb3fspVQxD3CQTjHs

Before continuing, verify the record is deployed.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

こんなものが出てきます。利用している DNS サーバに TXT レコードを追加しろ、という内容。
私はドメイン管理に お名前.com を使っているので、コントロールパネルから DNS 設定で追加してあげます。

別のコンソールを開き、DNS が反映されるのを待ちます。

$ dig -t txt _acme-challenge.riina-k.tv

(中略)

_acme-challenge.riina-k.tv. 963 IN      TXT     "ukm9iWjG-E7UlF45iWQqe3sDADRb3fspVQxD3CQTjHs"

と反映されたら certbot-auto のほうをエンター。

また同じようなのが出てきた。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name
_acme-challenge.riina-k.tv with the following value:

YNRFA-mQ2DLrRvQDLasXGYlS6UBkY-WeKWjz-MUiWvw

Before continuing, verify the record is deployed.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

これも DNS に登録し、反映されたらエンター。

Congratulations! と表示されたら証明書のインストールに成功。

$ sudo ls -al /etc/letsencrypt/live/riina-k.tv/
total 12
drwxr-xr-x 2 root root 4096 Jul 30 17:13 .
drwx------ 5 root root 4096 Jul 30 17:13 ..
-rw-r--r-- 1 root root  682 Jul 30 17:13 README
lrwxrwxrwx 1 root root   34 Jul 30 17:13 cert.pem -> ../../archive/riina-k.tv/cert1.pem
lrwxrwxrwx 1 root root   35 Jul 30 17:13 chain.pem -> ../../archive/riina-k.tv/chain1.pem
lrwxrwxrwx 1 root root   39 Jul 30 17:13 fullchain.pem -> ../../archive/riina-k.tv/fullchain1.pem
lrwxrwxrwx 1 root root   37 Jul 30 17:13 privkey.pem -> ../../archive/riina-k.tv/privkey1.pem

/etc/letsencrypt/live/riina-k.tv/ 配下に証明書が入っています。
こいつらを httpd.conf に書き込んで

<VirtualHost *:80>
    DocumentRoot /var/www/vhosts/riina-k.tv/public
    ServerName riina-k.tv
    ErrorLog logs/vhosts/riina-k.tv/error_log
    CustomLog logs/vhosts/riina-k.tv/access_log combined env=!VLOG

    # http で来たリクエストを https に転送
    RewriteEngine on
    RewriteCond %{HTTPS} off
    RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

<VirtualHost *:443>
    DocumentRoot /var/www/vhosts/riina-k.tv/public
    ServerName riina-k.tv
    ErrorLog logs/vhosts/riina-k.tv/ssl_error_log
    CustomLog logs/vhosts/riina-k.tv/ssl_access_log combined env=!VLOG

    # SSL エンジンを有効化
    SSLEngine on
    Include /etc/letsencrypt/options-ssl-apache.conf
    # 証明書の設置
    SSLCertificateFile /etc/letsencrypt/live/riina-k.tv/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/riina-k.tv/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/riina-k.tv/chain.pem
</VirtualHost>

ついでに http でアクセスされたら https にリダイレクトされるよう rewrite も設定。

さてブラウザチェック。
……あれリダイレクトだけされて ERR_CONNECTION_TIMED_OUT エラー!?

ポート 443 が開いてないだけでした。

$ sudo firewall-cmd --permanent --add-service=https

その結果

やったー! 表示されたー!
ついでに GeoTrust のチェックツール も通してみる。

完璧!!
ワイルドカード証明書なので、 test.riina-k.tv などのサブドメインでも使えます。
ただし、どうやら test.admin.riina-k.tv のようにサブドメインからさらにドメインを切ってる場合には使えないようです。
その場合は *.admin.riina-k.tv で証明書を発行すれば行けるっぽい。

Let’s Encrypt証明書の有効期限が3ヶ月と短いようなので、自動更新する crontab を作るのが良いらしい。

このノリで持ってるドメイン全部 SSL 化してしまいましょー。
あ、このブログは一段落したらサーバ移転するので後回しで

追記:
忘れずに自動更新の crontab を書いておこう。

# 毎週月曜日の午前4時15分に自動更新
15 4 * * 1 root /usr/bin/certbot-auto renew --post-hook "service httpd restart"
  1. コメント 0

  1. トラックバック 0

return top