コアダンプの数だけ強くなれるよ

見習いエンジニアの備忘log

さくらVPS + nginx + SSL証明書でHTTPS通信

さくらVPSにnginx + wordpressの環境を構築してちょこちょこ遊んでおります。近いうちにHTTPSで接続できるようにもしたいなぁと思ってたのですが、手つかずのまま大分時間が経過してしまいました。

www.segmentation-fault.xyz

今回はSSL証明書を導入してHTTPSで接続できるように設定していきます。

環境(前提)

  • CentOS 7 (さくらVPS)
  • Wordpressの環境を設定済み(httpでアクセス可能)


全体の流れ

作業的には下記3ステップとなります。

 1.サーバ上で秘密鍵とCSRの作成
 2.SSL証明書の購入
 3.サーバに証明書を設置


事前準備

まずは事前準備です。下記ソフトをインストールします。

$ sudo yum install openssl
$ sudo yum install mod_ssl


秘密鍵とCSRの作成

ココでは下記作業を行います。

  1. 秘密鍵作成のための擬似乱数ファイル(rand.dat)を生成
  2. 疑似乱数ファイルから秘密鍵を生成
  3. 秘密鍵からCSRを作成
# 疑似乱数ファイルを生成
$ cd /etc/pki/nginx
$ sudo openssl md5 /usr/bin/* > rand.dat
# 秘密鍵を生成
$ sudo openssl genrsa -rand rand.dat -des3 2048 > newkey.pem
61643 semi-random bytes loaded
Generating RSA private key, 2048 bit long modulus
.......................................+++
........................................................+++
e is 65537 (0x10001)
Enter pass phrase: <任意のパスワードを入力>
Verifying - Enter pass phrase: <再度同じパスワードを入力>
# CSRを生成 (入力内容は仮だよ)
$ sudo openssl req -new -key newkey.pem -out newcsr.pem
Enter pass phrase for newkey.pem: <秘密鍵生成時のパスワードを入力>
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Tokyo
Locality Name (eg, city) [Default City]:Arakawa
Organization Name (eg, company) [Default Company Ltd]:Sakura
Organizational Unit Name (eg, section) []:VPS
Common Name (eg, your name or your server's hostname) []:centos7.com
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
$
$ cat newcsr.pem
-----BEGIN CERTIFICATE REQUEST-----
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAA            AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAA  秘密だよ  AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAA            AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAA
-----END CERTIFICATE REQUEST-----


CSR生成時の設定項目は下記です。下記以外の項目については入力は任意です(Enter連打でOK)。

CSR生成時の入力項目 記載内容 設定例
Country Name (2 letter code) [XX]: 国別番号 JP
State or Province Name (full name) : 都道府県名 Tokyo
Locality Name (eg, city) [Default City]: 市区町村名 Arakawa
Organization Name (eg, company) [Default Company Ltd]: 組織名 Sakura
Organizational Unit Name (eg, section) : 部門名 VPS
Common Name (eg, your name or your server’s hostname) []: コモンネーム(FQDN) centos7.com


入力内容はご自身の環境に合わせて変更ください。作成した秘密鍵はなくさないように。
ここで生成したnewcsr.pemの中身がSSL証明書の購入時に必要になりますのでtextファイル等にコピペしましょう。

SSL証明書の購入

こちらからSSL証明書を購入します。今回はRapidSSLを選択します。

ssl.sakura.ad.jp

f:id:segmentation-fault:20170923232146p:plain

f:id:segmentation-fault:20170923232318p:plain

プランと決済方法を選択します。私は3年プランを選択しました。

f:id:segmentation-fault:20170923232457p:plain

続いて先ほど生成したCSRの内容を入力します。

f:id:segmentation-fault:20170923234858p:plain


後はさくらインターネットさんからメールが来るのを待ちます。

サーバー証明書の設置

サーバー認証


SSL証明書の購入手続きが完了すると下記のようなメールが届きます(抜粋)。会員ページより認証ファイルを取得して指定のパスに配置しましょう。

お申込みいただきましたSSLサーバ証明書の申請が完了いたしましたので、お知
らせいたします。

  ================================================================
  《 SSLサーバ証明書の情報 》

     サーバ証明書種別:SSL ラピッドSSL(3年)
     サービスコード  :xxxxxxxxxxxx
     コモンネーム    :xxxxxxxxxxxxxxxxx
  ================================================================

引き続き、認証局より申請いただいたドメインの使用権の確認がございますので、
以下の手順をご確認の上、認証ファイルのアップロードをお願いいたします。



    ※認証ファイルは以下のいずれかのURLに配置
      認証ファイル名は、fileauth.txtです

    例)
      http://<申請時に指定したFQDN(コモンネーム)>/.well-known/pki-validation/fileauth.txt

まず、認証ファイルを取りに行きます。

f:id:segmentation-fault:20170924101124p:plain

f:id:segmentation-fault:20170924100038p:plain

続いて認証ファイルを設置します。

# 環境により変わる

$ sudo mkdir -p /var/www/wordpress/.well-known/pki-validation/
$ sudo mv fileauth.txt /var/www/wordpress/.well-known/pki-validation/


設置後にブラウザからアクセスして中身が見えたらOKです。この状態でしばらく待つと認証が完了し再度メールが届きます。認証が終ったらサーバー上からファイルは削除しましょう。

証明書の設置


認証が完了すると下記のような、SSLサーバ証明書が発行された旨のメールが届きます。

お申込みいただきましたSSLサーバ証明書の発行が完了いたしましたので、以下
の通りお知らせいたします。

  ================================================================
  《 SSLサーバ証明書の情報 》

     サーバ証明書種別:SSL ラピッドSSL(3年)
     サービスコード  :xxxxxxxxxxxx
     コモンネーム  :xxxxxxxxxxxxxxxxxxx
     証明書有効期限 :2020年09月23日
  ================================================================

つきましては、以下に手順を記載いたしますので、お客様にてご利用サーバへ
の導入作業を行っていただきますよう、お願いいたします。
  • SSLサーバ証明書
  • 中間CA証明書

メールの記載に従って上記2点を取ってきます。会員ページよりSSLサーバ証明書、メールに記載されているリンクから中間CA証明書をそれぞれ取得します。



SSLサーバ証明書

f:id:segmentation-fault:20170924102936p:plain

f:id:segmentation-fault:20170924113101p:plain

認証が完了していると状態が変わり利用期間が表示されています。


中間CA証明書

f:id:segmentation-fault:20170924103442p:plain

取得した証明書をサーバー上で結合し配置します。

$ sudo cat server.crt ca.crt > serverca.crt
$ vim serverca.crt # 証明書の間に改行を入れる
$ cat serverca.crt
-----BEGIN CERTIFICATE-----

SSLサーバ証明書

-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----

中間CA証明書

-----END CERTIFICATE-----


これで必要なファイルはそろいました。

nginxの設定


秘密鍵とSSLサーバ証明書をnginxのコンフィグに合わせて配置します。

# 環境により異なる

$ sudo mkdir -p /etc/pki/nginx/private/
$ sudo cp serverca.crt /etc/pki/nginx/server.crt
$ sudo cp newkey.pem /etc/pki/nginx/private/server.key
$
$ cat /etc/nginx/conf.d/wordpress.conf
server {
    listen       80;
    server_name  .<あなたのサーバ>;
    rewrite     ^ https://<あなたのサーバ>$request_uri?;
}

server {
    listen       443 ssl http2;
    #listen       [::]:443 ssl http2;
    server_name  <あなたのサーバ>;
    root         /var/www/wordpress;

    ssl_certificate "/etc/pki/nginx/server.crt";
    ssl_certificate_key "/etc/pki/nginx/private/server.key";

    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout  5m;

    ssl_protocols TLSv1.1 TLSv1.2;

    ssl_prefer_server_ciphers on;
    ssl_ciphers 'kEECDH+ECDSA+AES128 kEECDH+ECDSA+AES256 kEECDH+AES128 kEECDH+AES256 kEDH+AES128 kEDH+AES256 DES-CBC3-SHA +SHA !aNULL !eNULL !LOW !kECDH !DSS !MD5 !EXP !PSK !SRP !CAMELLIA !SEED';

    index index.php;

    location ~* /wp-config.php {
        deny all;
    }


    location ~ \.php$ {
        fastcgi_pass    127.0.0.1:9000;
        fastcgi_index   index.php;
        fastcgi_param   SCRIPT_FILENAME /var/www/wordpress$fastcgi_script_name;
        fastcgi_param   PATH_INFO $fastcgi_script_name;
        include         fastcgi_params;
    }
}


このままnginxを再起動すると秘密鍵のパスワード入力が出来ずに失敗します。なので秘密鍵からパスフレーズを削除します。

$ sudo cd /etc/pki/nginx/private/
$ sudo cp server.key server.key.orig
$ sudo openssl rsa -in server.key -out server.key


nginxの設定が完了したらコンフィグ内容を確認して再起動します。

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
$
$ sudo systemctl restart nginx.service 



接続確認

nginxを再起動後にhttps付きでサイトにアクセスし、緑色の鍵マークが表示されればOKです。

f:id:segmentation-fault:20170924110532p:plain


鍵マークが表示されない(ブラウザに怒られる)、アクセスできない等が発生した場合はnginxのコンフィグ、ファイアウォールの設定、Wordpressの設定を見直してみてください。