Nginxで稼働中のWordPressをLet’s EncryptでSSL化する流れとその時に起こりがちなエラー

エラーだ。なんてこったい!

アドレスバーに鍵マーク欲しいよね

欲しいです。そしてLet’s Encryptで無料のSSL(正確にはTLS)を提供してくれるようになってサイトのHTTPS化に余念がない私です。

過去記事: SSLが無料で使えるCertbot(Let’s Encrypt)

アドレスバーに鍵をつける

アクセスが拒否され、証明書が作成できない場合の理由と対処法

早速certbotコマンドを叩いてSSL証明書を作成しようとしました。

ルート権限が必要になるので管理者として実行
# ./certbot-auto certonly --webroot -d mydomain.com -w /path/to/wp-root

しかしながら、以下のようなエラーが出て証明書が作成できません

Domain: mydomain.com
Type: unauthorized
Detail: Invalid response from
http://mydomain.com/.well-known/acme-challenge/うんたらかんたら:
"<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>

Nginxのlocationで除外されている

このエラーは、WordPressを稼働させる際に編集した、Nginxの設定ファイルによるものです。(WordPress Codexを参照)

そのため、certbotからのアクセス(http://mydomain.com/.well-known/acme-challenge/うんたらかんたら)が拒否され、証明書の作成ができなかったのです。

locationディレクティブで.well-known以下へのアクセスを制御

Githubで多くの例が挙げられていましたのでそちらを参考にします。

参考: Github – letsencrypt / acme-spec : .well-known ACME challenge files blocked 403 Forbidden in some Nginx configurations

.well-known以下にアクセスされた時のみ、rootディレクトリをWordPress外にする方法などが書かれていましたが、何となく嫌だった(好みの問題です)ので、下記のとおりにしました。

2通りありますが、どちらでも問題なく動作します。

location ^~ /.well-known/ {
  try_files  $uri $uri/ =404;
}

# OR

location ^~ /.well-known/ {
  allow  all;
}

これで先程のcertbotコマンドを走らすと無事証明書が作成されるはずです。

# service nginx restart
# ./certbot-auto certonly --webroot -d mydomain.com -w /path/to/wp-root

HTTPS用に設定の書き換え

書き換えるのは次の2点。

  • NginxのserverディレクティブにSSLの設定を追記
  • WordPressの設定画面でサイトURLをhttps://にする

serverディレクティブ

ssl仕様にします。Let’s Encryptで出来た証明書は、/etc/letsencrypt/ドメイン名/live以下にあります。

server {
  listen       443 ssl http2;
  server_name  mydomain.com;

  # 最低限の設定でご容赦ください
  ssl                  on;
  ssl_certificate      /etc/letsencrypt/mydomain.com/live/fullchain.pem;
  ssl_certificate_key  /etc/letsencrypt/mydomain.com/live/privkey.pem;

  ssl_protocols        TLSv1 TLSv1.1 TLSv1.2;
}

ssl_protocolsについては、Let’s EncryptではTLSを使用していますので、SSLは指定しません。

参考:
Let’s Encrypt総合ポータル
Symantec – SSLとTLSの違いと脆弱性

WordPressサイトURLの書き換え

設定画面からサイトのURLをhttpsに変更します。この場合、Nginxを上述の設定で再起動しているとサイトが開けなくなってしまいます。

httpから(もしくはhttpsどちらからでも)アクセスできるようにしておき、WordPressの設定が完了次第、httpsのアクセスのみ受け付けるようにしましょう。

設定画面からURLを変更する

とは言うものの、サーバー上のMySQLが直接触れる状態であるならば、正直なところ直接データベースを書き換えた方が早くて楽です。

サイトURLは、wp_optionsテーブルに登録されています。

wp_optionsでサイトURLを調べる

UPDATE文を実行してURLを変更します。

mysql> UPDATE wp_options SET option_value = 'https://mydomain.com' WHERE option_name IN ('siteurl', 'home');

これで稼働中WordPressサイトのSSL化が完了しました。

SSL用のポート(443)を開放しておくように

はい、すみません。忘れてました…。てっきり前に開放しておいたと思っていたら、全くしていないというおっちょこちょいぶりをここでも発揮(恥)。

iptablesを修正する

/etc/sysconfig/iptablesをviで開き、次の一文を追加します。

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT

保存したら、iptableを再起動させます。これでSSL用のポートが開放され、「https://サイトアドレス」でアクセスできるようになりました。

# service iptables restart

(Visited 140 times, 1 visits today)