WordPress を動かしているリバースプロキシとWebサーバの Nginx で、Let’s Encrypt と certbot で SSL/TLS の発行、導入をしました記録♪

スポンサードリンク


はじめに

本ブログをやっと、SSL/TLS 化しました。

Let’s Encrypt を認証局として、これの公式ツールである certbot を使用して、リバースプロキシもWebサーバも構築している Nginx に SSL/TLS を導入しましたので、その記録を試行錯誤も含めて記録してまいります。

まとめ

  • nginx 設定ファイルの書き換えも certbot に委ねたい場合、nginx 設定ファイルに日本語を入れるとエラーとなるため事前に削除しておく。
  • 作業前に、ファイアーウォール設定を変更して https の 443 ポートは開けておくとよい。
  • WordPress データベースの URL を修正するには、wp-cli を使えるようにして wp search-replace 'beforeurl' 'afterurl' とするのが楽。

進め方

にしたがって進めました。次のようなことを行いました。

  1. certbot の実行(認証局(CA:Certification Authority) が Let’s Encrypt である証明書をインストール)。そしてエラー
  2. エラー対処。nginx 設定ファイル修正し、certbot 再実行。成功!
  3. SSL/TLS の URL にアクセス。エラー発生><。ファイアーウォール設定
  4. SSL/TLS の URL にアクセス。表示が変><。CSS、JavaScript の URL 修正
  5. SSL/TLS の管理者 URL にアクセス。エラー発生><。リバースプロキシ使用時の WordPress 設定ファイル修正

certbot の実行(認証局(CA:Certification Authority) が Let’s Encrypt である証明書をインストール)。そしてエラー

# root ユーザで作業
su -

# certbot インストール
yum --enablerepo=epel install python2-certbot-nginx
# 指定したパッケージ以外にも、certbot もきちんとインストールされました。

# 証明書のインストール
certbot --nginx

結果、以下のようなエラーとなりました><。

なお、次の質問は No で良かったように感じます。

Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let’s Encrypt project and the non-profit
organization that develops Certbot? We’d like to send you email about EFF and
our work to encrypt the web, protect its users and defend digital rights.

# certbot --nginx
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator nginx, Installer nginx
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): oki2a24@gmail.com
Starting new HTTPS connection (1): acme-v01.api.letsencrypt.org

-------------------------------------------------------------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v01.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel: A

-------------------------------------------------------------------------------
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about EFF and
our work to encrypt the web, protect its users and defend digital rights.
-------------------------------------------------------------------------------
(Y)es/(N)o: Y
Starting new HTTPS connection (1): supporters.eff.org
No names were found in your configuration files. Please enter in your domain
name(s) (comma and/or space separated)  (Enter 'c' to cancel): oki2a24.com
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for oki2a24.com
Cleaning up challenges
An unexpected error occurred:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 2: ordinal not in range(128)
Please see the logfiles in /var/log/letsencrypt for more details.

IMPORTANT NOTES:
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
#

エラー対処。nginx 設定ファイル修正し、certbot 再実行。成功!

エラー内容を読んでみると、nginx 設定ファイルに日本語が入っているのが原因のようです。

python を対応できるようにするか、日本語を消し去るかのどちらかの対処法を思いつきましたけれども、今回は、コメントとして記述した日本語を削除することとしました。

手順は次のとおりです。

  1. vim で対象ファイルを開く。
    • /etc/nginx/nginx.conf
    • /etc/nginx/conf.d/default.conf
  2. /# でコメント行を検索
  3. :g//d で検索にヒットした行を削除

もう一度実行してみますと、うまくいきました♪

# certbot --nginx
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator nginx, Installer nginx
Starting new HTTPS connection (1): acme-v01.api.letsencrypt.org
No names were found in your configuration files. Please enter in your domain
name(s) (comma and/or space separated)  (Enter 'c' to cancel): oki2a24.com
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for oki2a24.com
Waiting for verification...
Cleaning up challenges
Deploying Certificate to VirtualHost /etc/nginx/conf.d/default.conf

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
-------------------------------------------------------------------------------
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
Redirecting all traffic on port 80 to ssl in /etc/nginx/conf.d/default.conf

-------------------------------------------------------------------------------
Congratulations! You have successfully enabled https://oki2a24.com

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

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/oki2a24.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/oki2a24.com/privkey.pem
   Your cert will expire on 2018-09-20. 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

#

SSL/TLS の URL にアクセス。エラー発生><。ファイアーウォール設定

http://oki2a24.com ヘアクセスすると、早速リダイレクトされ、https://oki2a24.com へとアクセスしました。

だがしかし、接続が拒否され、エラー。。。

それもそのはず、ファイアーウォール設定で、https (443) ポートを開放していませんでした。。。次のコマンドで開放しました。

firewall-cmd --permanent --add-service=https
firewall-cmd --reload
firewall-cmd --list-all
# services: ssh dhcpv6-client http https と出力されていれば、OK

そしてふたたび https://oki2a24.com へとアクセスすると、、、

SSL/TLS の URL にアクセス。表示が変><。CSS、JavaScript の URL 修正

ページは表示されたものの、デザインがとても変です。

CSS、JavaScript が効いていないのでしょう。

これはおそらく、WordPress 側のアドレス(URL)設定です。

wp-cli コマンドでまるっと置換します。

cd /srv/wordpress/
wp search-replace 'http://oki2a24.com' 'https://oki2a24.com' --dry-run
wp search-replace 'http://oki2a24.com' 'https://oki2a24.com'

実施ログは次のようになりました。

# wp search-replace 'http://oki2a24.com' 'https://oki2a24.com'
+-------------------------+-----------------------+--------------+------+
| Table                   | Column                | Replacements | Type |
+-------------------------+-----------------------+--------------+------+
| wpoki2a24_commentmeta   | meta_key              | 0            | SQL  |
| wpoki2a24_commentmeta   | meta_value            | 35           | PHP  |
| wpoki2a24_comments      | comment_author        | 0            | SQL  |
| wpoki2a24_comments      | comment_author_email  | 0            | SQL  |
| wpoki2a24_comments      | comment_author_url    | 349          | SQL  |
| wpoki2a24_comments      | comment_author_IP     | 0            | SQL  |
| wpoki2a24_comments      | comment_content       | 21           | SQL  |
| wpoki2a24_comments      | comment_approved      | 0            | SQL  |
| wpoki2a24_comments      | comment_agent         | 0            | SQL  |
| wpoki2a24_comments      | comment_type          | 0            | SQL  |
| wpoki2a24_links         | link_url              | 0            | SQL  |
| wpoki2a24_links         | link_name             | 0            | SQL  |
| wpoki2a24_links         | link_image            | 0            | SQL  |
| wpoki2a24_links         | link_target           | 0            | SQL  |
| wpoki2a24_links         | link_description      | 0            | SQL  |
| wpoki2a24_links         | link_visible          | 0            | SQL  |
| wpoki2a24_links         | link_rel              | 0            | SQL  |
| wpoki2a24_links         | link_notes            | 0            | SQL  |
| wpoki2a24_links         | link_rss              | 0            | SQL  |
| wpoki2a24_options       | option_name           | 0            | SQL  |
| wpoki2a24_options       | option_value          | 11           | PHP  |
| wpoki2a24_options       | autoload              | 0            | SQL  |
| wpoki2a24_postmeta      | meta_key              | 0            | SQL  |
| wpoki2a24_postmeta      | meta_value            | 1            | PHP  |
| wpoki2a24_posts         | post_content          | 2302         | SQL  |
| wpoki2a24_posts         | post_title            | 0            | SQL  |
| wpoki2a24_posts         | post_excerpt          | 0            | SQL  |
| wpoki2a24_posts         | post_status           | 0            | SQL  |
| wpoki2a24_posts         | comment_status        | 0            | SQL  |
| wpoki2a24_posts         | ping_status           | 0            | SQL  |
| wpoki2a24_posts         | post_password         | 0            | SQL  |
| wpoki2a24_posts         | post_name             | 0            | SQL  |
| wpoki2a24_posts         | to_ping               | 0            | SQL  |
| wpoki2a24_posts         | pinged                | 112          | SQL  |
| wpoki2a24_posts         | post_content_filtered | 578          | SQL  |
| wpoki2a24_posts         | guid                  | 5859         | SQL  |
| wpoki2a24_posts         | post_type             | 0            | SQL  |
| wpoki2a24_posts         | post_mime_type        | 0            | SQL  |
| wpoki2a24_term_taxonomy | taxonomy              | 0            | SQL  |
| wpoki2a24_term_taxonomy | description           | 0            | SQL  |
| wpoki2a24_termmeta      | meta_key              | 0            | SQL  |
| wpoki2a24_termmeta      | meta_value            | 0            | SQL  |
| wpoki2a24_terms         | name                  | 0            | SQL  |
| wpoki2a24_terms         | slug                  | 0            | SQL  |
| wpoki2a24_usermeta      | meta_key              | 0            | SQL  |
| wpoki2a24_usermeta      | meta_value            | 0            | PHP  |
| wpoki2a24_users         | user_login            | 0            | SQL  |
| wpoki2a24_users         | user_nicename         | 0            | SQL  |
| wpoki2a24_users         | user_email            | 0            | SQL  |
| wpoki2a24_users         | user_url              | 1            | SQL  |
| wpoki2a24_users         | user_activation_key   | 0            | SQL  |
| wpoki2a24_users         | display_name          | 0            | SQL  |
+-------------------------+-----------------------+--------------+------+
Success: Made 9269 replacements.
#

まだダメです><。

SSL/TLS の管理者 URL にアクセス。エラー発生><。リバースプロキシ使用時の WordPress 設定ファイル修正

管理画面にアクセスしようとすると、表示できず、リダイレクトが繰り返し行われました、とエラーです。

これは、難しそうです。検索し、調べました。次のページが解決方法と当たりをつけました。

WordPress 設定ファイルを修正し、次の 2 つを追加しました。

/** SSL ログイン・管理画面アクセスを強制する */
define('FORCE_SSL_ADMIN', true);
/** リバースプロキシの使用時に、無限リダイレクトループを避ける */
$_SERVER['HTTPS'] = 'on';

上記のように設定し、無事管理画面にログインすることができました。

ブログのページは崩れたままでしたので、Nginx Cache を削除し、再表示してみたところ、うまくいきました!

おわりに

certbot を導入し、Let’s Encrypt の SSL 証明証 をインストールするところまでをやってみる予定でした。

けれども、certbot が nginx の設定まで書き換えてくれましたので、それによるエラー対処を行っているうちに、TLS/SSL 導入が最後まで完了してしまいました。

ただし、まだ残っている作業や、振り返りたいことがありますので、引き続き作業して行きたいと思います。

  • 残作業
    • certbot renew 設定
  • 確認したいこと
    • certbot によって作られた作成ファイルの確認
    • 書き換えられた設定ファイルの中身。/etc/nginx…
    • 外部サービスの修正

最後に、参考ページです。ありがとうございます!

以上です。

コメントを残す