この記事は最後に更新してから1年以上経過しています。

常時SSL接続に変更しました

説明

先週末、本サイトを常時SSL接続に変更しました。本サイトは「さくらのVPS」(CentOS 6系、Apache 2.2系)上にWordPressのマルチサイト機能を使って構築しており、無償で使用できる「Let's Encrypt」を使って常時SSL接続に切り替えた手順をメモとして残しそうと思います。

作業の流れは次の通りです。この作業にはroot権限が必要になります。

  • 「Certbotクライアント」のインストール
  • 「Certbotクライアント」でサーバー証明書を発行
  • Apacheのssl.confを修正してApacheを再起動
  • ブラウザでSSL接続を確認
  • WordPressの管理画面でサイトURLを修正
  • 通常のリクエストをSSL接続にリダイレクト
  • サーバー証明書の自動更新設定

なおサイト(WordPressのプラグインを含む)でキャッシュを利用している場合は、作業前にキャッシュをオフにしてクリアしてから作業します。

「Certbotクライアント」のインストール

「Certbotクライアント(旧Let's Encryptクライアント)=certbot-auto」は「Let's Encrypt」が発行するサーバー証明書の発行・更新などを行うプログラムです。

  • このプログラムではEPELリポジトリの一部のパッケージを利用しているのでEPELリポジトリを有効にします(ここはOSによって異なる部分)。
    yum install epel-release
  • 「Certbotクライアント」をダウンロードします(1行目でダウンロード、2~4行目でダウンロードしたファイルの整合性を確認しています)。インストール先は任意で問題ないと考えますので、ここでは/user/local/certbotディレクトリにダウンロードしています。
    cd /usr/local
    mkdir certbot
    cd certbot
    wget https://dl.eff.org/certbot-auto
    wget -N https://dl.eff.org/certbot-auto.asc
    gpg2 --recv-key A2CFB51FA275A7286234E7B24D17C995CD9775F2
    gpg2 --trusted-key 4D17C995CD9775F2 --verify certbot-auto.asc certbot-auto
    chmod a + x ./certbot-auto
    ./certbot-auto --help
    

「Certbotクライアント」でサーバー証明書を発行

「Certbotクライアント」でサーバー証明書を発行します。サーバー証明書を発行するオプションはいくつか選択肢がありますが、ここでは「standalone」を選択しています。

  • 「Certbotクライアント」を実行してサーバー証明書を発行します。
    ./certbot-auto certonly --standalone -d elearn.jp
  • 問1 メールアドレスを入力します。
    Enter email address (used for urgent renewal and security notices) (Enter 'c' to 
    cancel): メールアドレス
    
  • 問2 規約の確認します。
    -------------------------------------------------------------------------------
    Please read the Terms of Service at
    https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.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
    
  • 問3 メールアドレスの共有を確認します。
    -------------------------------------------------------------------------------
    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
    
  • 作成されたサーバー証明書(4つの.pemファイル)を確認します。
    ls -l /etc/letsencrypt/live/elearn.jp/

Apacheのssl.confを修正してApacheを再起動

前項で作成したサーバー証明書の関連ファイルをApacheのssl.confに記載するほか、SSLProtocolおよびSSLCipherSuiteの内容を修正しています。

  • ssl.confを編集します。
    vi /etc/httpd/conf.d/ssl.conf

    編集(修正)内容は次の通りです。

    ServerName elearn.jp
    
    SSLProtocol All -SSLv2 -SSLv3
    
    SSLCipherSuite DEFAULT:!RC4:!EXP:!SSLv2:!DES:!IDEA:!SEED:+3DES
    
    SSLCertificateFile /etc/letsencrypt/live/elearn.jp/cert.pem
    
    SSLCertificateKeyFile /etc/letsencrypt/live/elearn.jp/privkey.pem
    
    SSLCertificateChainFile /etc/letsencrypt/live/elearn.jp/chain.pem
    
  • Apache(httpd)を再起動します。
    service httpd stop
    service httpd start
    

ブラウザでSSL接続を確認

Apacheが再起動したら、ブラウザでサイトにアクセスしてSSL接続できているか確認します。

  • 「https://elearn.jp/」「https://elearn.jp/wpman/」にアクセスしてSSL接続できているか確認します。最新のChromeであればURLの左側が「保護された通信」になります。
  • SSL接続でWordPressの管理画面にログインし、問題なくダッシュボードが表示されることを確認します。
  • 「https://www.ssllabs.com/ssltest/index.html」にアクセスし、Hostnameに「elearn.jp」を入力して、SSL接続状況の詳しい内容を確認します。

WordPressの管理画面でサイトURLを修正

本サイトはマルチサイト機能(サブディレクトリ型)を使っており、メインの管理画面に管理者でログインし、各ネットワーク(サブサイト)の「サイトアドレス(URL)」のスキーマを「http」から「https」に変更します(一般的なシングルサイトの場合は「一般設定」の「サイトアドレス(URL)」を変更します)。

通常のリクエストをSSL接続にリダイレクト

通常のリクエストをSSL接続にリダイレクトさせ、常時SSL接続になるようにドキュメントルートディレクトリの.htaccessファイルを変更します。

  • ドキュメントルートの.htaccessファイルを編集します。
    vi .htaccess

    「RewriteBase /」の次行に以下を追加して保存します。

    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://elearn.jp/$1 [R=301,L]
    

サーバー証明書の自動更新設定

Let's Encryptのサーバー証明書は、有効期間が3か月となっています。一般的なサーバー証明書と比較すると短めですが、「Certbotクライアント」によって更新可能です。

  • サーバー証明書の有効期間を確認します。
    openssl x509 -in /etc/letsencrypt/live/elearn.jp/cert.pem -noout -dates
  • バッチファイルcertbot-renewを作成します。
    cd /usr/local/certbot
    vi certbot-renew
    

    バッチファイルの内容は次の通りです。

    #! /bin/bash
    service httpd stop
    cd /usr/local/certbot
    /usr/local/certbot/certbot-auto renew --quiet > /var/log/certbot.renew.log 2>&1
    service httpd start
    
  • バッチファイルcertbot-renewを作成します。
    chmod +x certbot-renew
  • バッチファイルcertbot-renewを週1回実行するように設定します。
    crontab -e

    バッチファイルの内容は次の通りです。

    15 3 * * 1 /usr/local/certbot/certbot-renew

もし「保護された通信」にならなかったら

ブラウザでSSL接続を確認した際に「保護された通信」と表示されないケースがあります。そんな場合はアドレスバーの「i」アイコンをクリックして理由を確認します。

今回のケースでは、トップページは問題なかったのですが、この「WordPress私的マニュアル」などは「保護された通信」にならず少し焦りました。出力されたソースコードを見るなどして確認したところ、「はてなブックマーク」の画像のリンクで直接「http」で指定していたのが原因でした。SSL接続して「保護された通信」にならない場合は、そのページ内で使用されている各種画像ファイルのほか、CSSやJavaScriptファイルのアドレス指定が「http」になっていないか確認するとよいでしょう。

追記1:前作業としてキャッシュを無効にしていた場合は有効に戻しましょう。またSitemapファイルの更新を忘れずに。


最終更新 : 2018年05月27日 10:44

お勧め

wp_get_post_terms(2014年7月4日 更新)

mixed wp_get_post_terms( [ int $post_id = 0 [ , string $taxonomy = 'post_tag' [ , array $args = array() ] ] ] )
投稿記事のタクソノミー情報を取得する。

add_action(2023年7月28日 更新)

bool add_action( string $tag, mixed $function_to_add [ , int $priority = 10 [ , int $accepted_args = 1 ] ] )
WordPressシステムの関数にアクション関数を追加する。

get_editor_stylesheets(2014年9月5日 更新)

array get_editor_stylesheets( )
エディタ向けのスタイルシートURLを取得する。

wp_count_terms(2020年12月14日 更新)

array | int | WP_Error wp_count_terms( array | string $args = array() [ , array | string $deprecated = '' ] )
タクソノミーのターム数を取得する。

the_comments_navigation(2018年5月27日 更新)

void the_comments_navigation( [ array $args = array() ] )
コメントナビゲーションを表示する。