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の「お申し込み」をクリックします。
SSLサーバ証明書お申し込み画面で、会員IDとパスワードを入力してログインします。会員IDがない、すなわち↑に書いたサービスを利用中でない場合はキャンペーン適用されませんので、いずれかのサービスを申し込みましょう。
お申し込みプランは「ラピッドSSL」を選択します。記載されている値段がキャンペーン適用価格(1年だと0円)で表示されていることを確認しましょう。あとは、支払い情報と(あれば)クーポンコードを入力し、約款に同意して「CSRの入力へ進む」をクリックします。
CSRを作成したマシンにSSHクライアントでログインし、catコマンドでCSRファイルを開いてクリップボードにコピーし、ブラウザに貼り付けます。その後、右向きのボタンをクリックすると、ディスティングイッシュネームが表示されるので、先ほどopensslコマンドで確認した中身と同じかどうか、特にコモンネームが正しいかは絶対確認しましょう。
その後、確認画面にすすんで、お申し込みプランがラピッドSSLであること、ディスティングイッシュネームが正しいことを再度確認し、「この内容で申し込む」をクリックします。
「お申し込み受付完了のお知らせ」メールをお届けいたします。 の画面が表示されてから、メールを確認します。
このように、件名が「お申し込み受付完了のお知らせ」のメールが届いていれば、最初のステップ通過です。
さくらインターネット 会員メニュー ( https://secure.sakura.ad.jp/member/ ) にログインし、「契約情報」→「契約サービスの確認」の順にクリックし、「SSL ラピッドSSL (n年)」が表示されていることを確認します。まだこの時点では状態が「申込中」で何もアクションを起こせません。少し待つと手続き欄に「サーバ証明書」が表示されるので、ここをクリックします。
↓
■ 認証ファイルのダウンロードとWEBサーバへのアップロード
会員メニューから「認証ファイルDL」をクリックすると、拡張子がhtmでファイル名がランダムなファイルをダウンロードできるようになります。ここでファイル名は変えずに保存します。
また、ファイルの内容は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証明書のダウンロード
ふたたび会員メニューにアクセスし、サーバ証明書の手続きボタンをクリックします。
先ほど「認証ファイルDL」だった箇所が「サーバ証明書DL」になっていることを確認してクリックし、ダウンロードします。また、「ジオトラスト SSLサーバ証明書発行のお知らせ」メールが届いていることも確認します。
メールを少しスクロールするとオンラインマニュアルへのリンクがあるので、これを開きます。
オンラインマニュアルに「中間CA証明書の取得」が表示されているので、ここから「ラピッドSSL」をクリックします。
ジオトラストのサイトに遷移するので、RSA SHA-2 ラピッドSSLの中間CA証明書を選択します。
中間CA証明書が表示されるので、これをコピーしてテキスト保存します。
■ 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です。
コマンドラインでリダイレクトされていることを確認するには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化するかなー。
