[さくらのSSL]nginxにRapidSSLの証明書をインストールした


2015/07/30 よりさくらのSSL ラピッドSSL提供開始記念キャンペーンが始まったのですが、あまりの安さに飛びついてみました。今なら(2015/09/30まで)RapidSSLの証明書が1年ぶん0円なので、さくらのVPSにあるぼくの仕事用サイト ( http://ll4u.in ) のドメインで3年ぶん申し込んでインストールするまでの作業手順を書いておきます。

■ 環境

[root@www ~]# cat /etc/redhat-release 
CentOS Linux release 7.1.1503 (Core)
[root@www ~]# rpm -q openssl
openssl-1.0.1e-42.el7.9.x86_64
[root@www ~]# rpm -q nginx
nginx-1.9.3-1.el7.ngx.x86_64

■ 前提条件

ドメイン認証SSLなので、SSLでアクセスさせたいホストのドメインを取得済みであることは勿論のこと、 admin@ドメイン名 宛に外部から送られるメールが受信可能であること、 httpでも構わないのでWEBサイトが公開されていること、ドキュメントルートにhtmlファイルをアップロード可能なことが条件となります。これは、ジオトラストのhttpクライアントが自動でドメインの存在確認を行うためです。なので、ベーシック認証がかかっていたりIPアドレス制限がかかっていたりするとスムーズに認証されない可能性があります。

■ 秘密鍵作成

秘密鍵、CSR、証明書を置くディレクトリを先に作成しておきます。

[root@www ~]# mkdir -p /etc/nginx/ll4u.in/2015/

次に、秘密鍵の鍵長を2048bitで作成します。

[root@www ~]# openssl genrsa -out /etc/nginx/ll4u.in/2015/cert.key 2048

秘密鍵が2048bitで作成されていることを確認します。

[root@www ~]# openssl rsa -text -noout -in /etc/nginx/ll4u.in/2015/cert.key | head -n 1
Private-Key: (2048 bit)

■ CSR作成

公式yumリポジトリ(のmainline)からインストールしたnginxはSNIが有効化されているので、今後ほかのバーチャルホストのSSL証明書をインストールする際にも応用がきくよう、ディスティングイッシュネームを変数にして一撃でCSRを生成しています。

[root@www ~]# DN_C=JP # 国名
[root@www ~]# DN_ST=Tokyo # 都道府県
[root@www ~]# DN_L=Shinagawa-ku # 市区町村
[root@www ~]# DN_O="ll4u.in" # 組織名
[root@www ~]# DN_CN=ll4u.in #Common Name
[root@www ~]# CSRFILE=/etc/nginx/${DN_CN}/$(date +%Y)/cert.csr
[root@www ~]# openssl req -new -key ${KEYFILE} -out ${CSRFILE} -subj "/C=${DN_C}/ST=${DN_ST}/L=${DN_L}/O=${DN_O}/CN=${DN_CN}"

CSRができたら中身を確認してみましょう。

[root@www ~]# openssl req -text -noout -in ${CSRFILE} | egrep '(Subject:)'
        Subject: C=JP, ST=Tokyo, L=Shinagawa-ku, O=ll4u.in, CN=ll4u.in

こんな感じでSubjectの行に想定通りのディスティングイッシュネームが入っていればOKです。

■ さくらのSSL お申し込み

RapidSSL 1年ぶん0円キャンペーンが適用されるには、以下のサービスのうちいずれかを利用中であることが条件となります。

  • レンタルサーバサービス
  • VPSサービス
  • 専用サーバサービス
  • クラウドサービス
  • ハウジングサービス

キャンペーン期間などは必ず http://www.sakura.ad.jp/campaign/rapid_ssl/ から確認してくださいね。それでは申し込んでみましょう。

さくらのSSL お申し込みサイトからRapid SSLの「お申し込み」をクリックします。

20150801_SAKURA-RAPIDSSL_001

20150801_SAKURA-RAPIDSSL_002

SSLサーバ証明書お申し込み画面で、会員IDとパスワードを入力してログインします。会員IDがない、すなわち↑に書いたサービスを利用中でない場合はキャンペーン適用されませんので、いずれかのサービスを申し込みましょう。

20150801_SAKURA-RAPIDSSL_003

お申し込みプランは「ラピッドSSL」を選択します。記載されている値段がキャンペーン適用価格(1年だと0円)で表示されていることを確認しましょう。あとは、支払い情報と(あれば)クーポンコードを入力し、約款に同意して「CSRの入力へ進む」をクリックします。

20150801_SAKURA-RAPIDSSL_004

CSRを作成したマシンにSSHクライアントでログインし、catコマンドでCSRファイルを開いてクリップボードにコピーし、ブラウザに貼り付けます。その後、右向きのボタンをクリックすると、ディスティングイッシュネームが表示されるので、先ほどopensslコマンドで確認した中身と同じかどうか、特にコモンネームが正しいかは絶対確認しましょう

20150801_SAKURA-RAPIDSSL_005

その後、確認画面にすすんで、お申し込みプランがラピッドSSLであること、ディスティングイッシュネームが正しいことを再度確認し、「この内容で申し込む」をクリックします。

20150801_SAKURA-RAPIDSSL_006

「お申し込み受付完了のお知らせ」メールをお届けいたします。 の画面が表示されてから、メールを確認します。

20150801_SAKURA-RAPIDSSL_007

20150801_SAKURA-RAPIDSSL_008

このように、件名が「お申し込み受付完了のお知らせ」のメールが届いていれば、最初のステップ通過です。

さくらインターネット 会員メニュー ( https://secure.sakura.ad.jp/member/ ) にログインし、「契約情報」→「契約サービスの確認」の順にクリックし、「SSL ラピッドSSL (n年)」が表示されていることを確認します。まだこの時点では状態が「申込中」で何もアクションを起こせません。少し待つと手続き欄に「サーバ証明書」が表示されるので、ここをクリックします。

20150801_SAKURA-RAPIDSSL_009

20150801_SAKURA-RAPIDSSL_010

■ 認証ファイルのダウンロードとWEBサーバへのアップロード

会員メニューから「認証ファイルDL」をクリックすると、拡張子がhtmでファイル名がランダムなファイルをダウンロードできるようになります。ここでファイル名は変えずに保存します。

20150801_SAKURA-RAPIDSSL_011

 

20150801_SAKURA-RAPIDSSL_012

また、ファイルの内容は1行のテキストですが、これも中身を変えずにWEBサーバへアップロードします。アクセスログを見てみましょう。(接続元IPアドレスとユーザーエージェントの部分は伏せています)

$ cat access_log | grep /aBcDeFg.htm
***.***.***.*** - - [01/Aug/2015:03:52:12 +0900] "GET /aBcDeFg.htm HTTP/1.1" 404 8921 "-" "XXXXXXXX" "-"
***.***.***.*** - - [01/Aug/2015:03:53:34 +0900] "GET /aBcDeFg.htm HTTP/1.1" 404 8949 "-" "XXXXXXXX" "-"
***.***.***.*** - - [01/Aug/2015:03:55:20 +0900] "GET /aBcDeFg.htm HTTP/1.1" 404 8921 "-" "XXXXXXXX" "-"
***.***.***.*** - - [01/Aug/2015:03:56:36 +0900] "GET /aBcDeFg.htm HTTP/1.1" 404 8949 "-" "XXXXXXXX" "-"
***.***.***.*** - - [01/Aug/2015:03:57:57 +0900] "GET /aBcDeFg.htm HTTP/1.1" 404 8949 "-" "XXXXXXXX" "-"
***.***.***.*** - - [01/Aug/2015:03:59:09 +0900] "GET /aBcDeFg.htm HTTP/1.1" 404 8921 "-" "XXXXXXXX" "-"
***.***.***.*** - - [01/Aug/2015:04:00:22 +0900] "GET /aBcDeFg.htm HTTP/1.1" 200 21 "-" "XXXXXXXX" "-"

ほぼ1分強おきにアクセスがありましたが、WEBサーバへアップロードし終わって、ステータスコードが200の行が1行表示されたら、もうアクセスに来ないようなので、証明書が発行された旨メールが来ているか確認してみましょう。

■ サーバ証明書と中間CA証明書のダウンロード

ふたたび会員メニューにアクセスし、サーバ証明書の手続きボタンをクリックします。

20150801_SAKURA-RAPIDSSL_013

 

先ほど「認証ファイルDL」だった箇所が「サーバ証明書DL」になっていることを確認してクリックし、ダウンロードします。また、「ジオトラスト SSLサーバ証明書発行のお知らせ」メールが届いていることも確認します。

20150801_SAKURA-RAPIDSSL_014

20150801_SAKURA-RAPIDSSL_015-01

メールを少しスクロールするとオンラインマニュアルへのリンクがあるので、これを開きます。

20150801_SAKURA-RAPIDSSL_015-02

オンラインマニュアルに「中間CA証明書の取得」が表示されているので、ここから「ラピッドSSL」をクリックします。

20150801_SAKURA-RAPIDSSL_016-01

ジオトラストのサイトに遷移するので、RSA SHA-2 ラピッドSSLの中間CA証明書を選択します。

20150801_SAKURA-RAPIDSSL_016-02

中間CA証明書が表示されるので、これをコピーしてテキスト保存します。

20150801_SAKURA-RAPIDSSL_016-03

■ firewalld設定

今までhttpsのアクセスを許可していなかったので、firewall-cmdコマンドでhttpsの穴をあけておきます。

[root@www ~]# firewall-cmd --zone=public --add-service https
success
[root@www ~]# firewall-cmd --zone=public --add-service https --permanent
success

■ nginx設定

/etc/nginx/ll4u.in/2015/ (ll4u.inの部分は読み替えてくださいね) に証明書ファイルをアップロードします。nginxは中間証明書を直接指定するディレクティブが用意されていないので、サーバ証明書と中間CA証明書を1つのファイル ( /etc/nginx/ll4u.in/2015/cert.pem ) にまとめます。書式はこんな感じです。

-----BEGIN CERTIFICATE-----
[サーバ証明書]
-----END CERTIFICATE-----

-----BEGIN CERTIFICATE-----
[中間証明書]
-----END CERTIFICATE-----

/etc/nginx/ll4u.in/2015/cert.pem にサーバ証明書と中間証明書が並ぶようにします。上の段がサーバ証明書、下の段が中間証明書です。こんな感じで保存し、後述するバーチャルホスト設定を行ってから「nginx -t」で構文確認しようとすると

nginx: [emerg] PEM_read_bio_X509_AUX("/etc/nginx/ll4u.in/2015/cert.crt") failed (SSL: error:0906D06C:PEM routines:PEM_read_bio:no start line:Expecting: TRUSTED CERTIFICATE)

のようなエラーが出てしまいました。。。どうやらここによるとファイルの編集に気をつけろみたいなこと言っていますが、試しにサーバ証明書のEND CERTIFICATE行と中間証明書のBEGIN CERTIFICATEを1行開けて保存、再度nginx -tしてみると

[root@www ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

今度はOKですね。

それではopensslコマンドで証明書の中身を確認してみましょう。

[root@www ~]# openssl x509 -text -noout -in /etc/nginx/ll4u.in/2015/cert.pem | egrep '(Issuer:|Not Before|Not After|Subject:|Public-Key:)'
        Issuer: C=US, O=GeoTrust Inc., CN=RapidSSL SHA256 CA - G3
            Not Before: Jul 30 04:59:16 2015 GMT
            Not After : Jul 31 20:32:20 2018 GMT
        Subject: OU=GT30484522, OU=See www.rapidssl.com/resources/cps (c)15, OU=Domain Control Validated - RapidSSL(R), CN=ll4u.in
                Public-Key: (2048 bit)

Issuerのディスティングイッシュネームがジオトラストのものになっていること、Not Afterがお申し込み通りの期限になっていること(表示はGMTなのでJSTの期限より短い!と騒がないでねw)、SubjectのCN(Common Name)欄がお申し込み通りのホスト名になっていること、Public-Keyが2048bitであることを確認します。

さて、順番が前後してしまいましたが、ll4u.inのバーチャルホスト設定ファイルも修正します。今まであったserverディレクティブのlistenを80から443 sslに変更し、新たに以下を追記して、httpでのアクセスをすべてhttpsに変更します。

server {
    listen       80;
    server_name  ll4u.in;
    return 301 https://$host$request_uri;
}

そして、今までhttpでアクセスさせていた方のserverディレクティブはこんな感じにします。

server {
    listen       443 ssl;
    server_name  ll4u.in;
    access_log  /home/logs/ll4u.in/access_log  main;
    error_log  /home/logs/ll4u.in/error_log;

    ssl_certificate             /etc/nginx/ll4u.in/2015/cert.pem;
    ssl_certificate_key         /etc/nginx/ll4u.in/2015/cert.key;

    # https://kjur.github.io/jsrsasign/tool_httpscfg.html
    # Mozilla Intermediate Compatibility Profile - 中セキュリティ(デフォルト) / nginx を選択
    ssl_session_timeout  5m;
    ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA;
    ssl_prefer_server_ciphers on;

    location / {
(略)

以上の設定が終わったところで、nginx -tで構文確認してOKであれば、nginxを再起動します。

[root@www ~]# systemctl restart nginx.service

それでは http://ll4u.in/ (あえてhttpsではなくhttp) にアクセスしてみましょう。https://ll4u.in/ にリダイレクトされていればOKです。

20150801_SAKURA-RAPIDSSL_017

20150801_SAKURA-RAPIDSSL_018

コマンドラインでリダイレクトされていることを確認するにはcurlが便利です。

[(っ´∀`)っ ゃー@ぽぽぽマシン ~]$ curl -LIs http://ll4u.in/
HTTP/1.1 301 Moved Permanently
Server: nginx/1.9.3
Date: Fri, 31 Jul 2015 22:34:57 GMT
Content-Type: text/html
Content-Length: 184
Connection: keep-alive
Location: https://ll4u.in/

HTTP/1.1 200 OK
Server: nginx/1.9.3
Date: Fri, 31 Jul 2015 22:34:57 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.6.9
Last-Modified: Fri, 31 Jul 2015 22:10:02 GMT
X-Pingback: https://ll4u.in/xmlrpc.php

以上で、さくらのVPSにインストールしたnginxのサイトをSSL化する手順はおしまいです。もっと儲かったらnullpopopoもSSL化するかなー。