Contents
概要
HTTPS の利用有無が Google の検索結果にも影響を与えることは周知された感があるが、HTTPS を利用するためには SSL 証明書が必要です。無料の SSL 証明書を取得してサブドメインも 10 個まで利用できてします方法を紹介します。SEO にも効果が期待できるので少し手間ですがやっておくに越したことはありません。
無料でできることは確認済み。論より証拠、当ブログも StartSSL で取得した無料の SSL 証明書を利用していますよ!※前段に CloudFlare が入っているので StartSSL の証明書になっていないかもしれませんが気にしないでください。
無料 SSL 証明書の取得手順
サインアップ、HTTPS を利用したいドメインの登録、秘密鍵の作成、証明書のダウンロード、WEB サーバの設定、動作確認というのが大まかな流れになります。
サインアップ
まずは、StartCom Ltd. ( Start Commercial Limited社 ) が運営する StartSSL のサイトへ行ってメールアドレスを入力するとメールが送られてきます。メール本文中に Verification code が記載されているのでコピペして入力することで登録完了です。ログイン時も同様に One-time Password をメールで発行してもらい Verification code を入力してログインします。
利用ドメインの認証
サインアップが完了しログインに成功したら、SSL 証明書を取得するドメインの認証を行います。利用したいサブドメインを含む FQDN を 10 個 1 行 1 FQDN の形式で入力し、自分のサーバや利用端末上で生成した csr の内容をコピペして Submit ボタンをクリックします。
秘密鍵と公開鍵の生成
手元の Linux サーバ ( Lubuntu 16.04 ) で生成しました。未テストですが、Windows 環境しかない場合でも SmartComTool.exe というツールをダウンロードして実行することで生成できる様です。IIS を Web サーバとして利用している方も安心ですね。この例では、neoflow.jp.key と neoflow.jp.csr を生成しています。neoflow.jp.csr の内容をコピーしておきます。
$ sudo openssl req -newkey rsa:2048 -keyout neoflow.jp.key -out neoflow.jp.csr
Generating a 2048 bit RSA private key
...................................................................................+++
................................+++
writing new private key to 'neoflow.jp.key'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
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) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) []:Shibuya-Ku
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Neoflow. Co., Ltd.
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:www.neoflow.jp
Email Address []:[email protected]
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:Neoflow
$ cat neoflow.jp.csr
-----BEGIN CERTIFICATE REQUEST-----
ほげほげふがふがもごもご
-----END CERTIFICATE REQUEST-----
証明書のダウンロード
証明書のダウンロードリンクが表示されますのでダウンロードすると、1 行目に記載した FQDN がファイル名になった ZIP ファイルをダウンロードできたと思います。
内容は以下のような感じになっており、利用する Web サーバ ( IIS, Apache, Nginx ) ごとに証明書を生成してくれています。これは、とても親切設計ですね!
$ unzip -l www.neoflow.jp.zip
Archive: www.neoflow.jp.zip
Length Date Time Name
--------- ---------- ----- ----
3577 2016-10-22 17:13 IISServer.zip
3575 2016-10-22 17:13 ApacheServer.zip
3130 2016-10-22 17:13 NginxServer.zip
5581 2016-10-22 17:13 OtherServer.zip
--------- -------
15863 4 files
$ unzip www.neoflow.jp.zip
$ unzip -l NginxServer.zip
Archive: NginxServer.zip
Length Date Time Name
--------- ---------- ----- ----
4770 2016-10-22 17:13 1_www.neoflow.jp_bundle.crt
--------- -------
4770 1 file
$ unzip NginxServer.zip
Web サーバの設定
Nginx での設定例です。ssl_ciphers で指定している暗号化スイートの最新情報は Mozilla のサイトがわかりやすいので、文末にリンクしておきます。
証明書格納先の準備
証明書格納用のディレクトリを作成して出来上がった証明書と秘密鍵をコピーします。
$ sudo mkdir -p /var/www/neoflow.jp/certs
$ sudo cp 1_www.neoflow.jp_bundle.crt /var/www/neoflow.jp/certs/
$ sudo cp ~/neoflow.jp.key /var/www/neoflow.jp/certs/
パスワードの解除
秘密鍵はそのまま利用するとパスフレーズを確認されるためパスフレーズを解除しておきます。
$ sudo cp /var/www/neoflow.jp/certs/neoflow.jp.key /var/www/neoflow.jp/certs/neoflow.jp.key.bak
$ sudo openssl rsa -in /var/www/neoflow.jp/certs/neoflow.jp.key -out /var/www/neoflow.jp/certs/neoflow.jp.key
Enter pass phrase for /var/www/neoflow.jp/certs/neoflow.jp.key:
writing RSA key
Nginx の設定例
コンフィグの内容はこんな感じになります。
server {
listen 443 ssl http2 default_server;
ssl_certificate /var/www/neoflow.jp/certs/1_www.neoflow.jp_bundle.crt;
ssl_certificate_key /var/www/neoflow.jp/certs/neoflow.jp.key;
ssl_session_timeout 5m;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
ssl_prefer_server_ciphers on;
}
設定が完了したら一度 nginx を再起動しエラーがないかシスログを確認します。
$ /etc/init.d/nginx restart
パーミッション設定
設定と動作確認ができたらファイルパーミッションを必要最低限に設定します。Nginx サービスを再起動し正常に起動していれば問題ないかと思います。
$ sudo chown root:root -R /var/www/neoflow.jp/certs/
$ sudo chmod 600 /var/www/neoflow.jp/certs/*
$ sudo chmod 700 /var/www/neoflow.jp/certs/
$ sudo /etc/init.d/nginx restart
[ ok ] Restarting nginx (via systemctl): nginx.service.
トラブルシューティング
[emerg] SSL_CTX_use_PrivateKey_file(“key”) failed …
パスフレーズを解除したキーを指定していないと出力されるエラー。Nginx が起動しません。パスフレーズの解除をしたくない場合、ssl_password_file ディレクティブを利用することで外部ファイルからパスフレーズを読み込むことも可能だがその場合はファイルのパーミッションに注意する必要がある。たぶん忘れるので当記事ではパスフレーズ解除を行うやり方にしています。
Oct 22 19:23:10 vm-nfj-206 systemd[1]: Starting A high performance web server and a reverse proxy server...
Oct 22 19:23:10 vm-nfj-206 nginx[5841]: Enter PEM pass phrase:
Oct 22 19:23:10 vm-nfj-206 nginx[5841]: nginx: [emerg] SSL_CTX_use_PrivateKey_file("/var/www/neoflow.jp/certs/neoflow.jp.key") failed (SSL: error:0906406D:PEM routines:PEM_def_callback:problems getting password error:0907B068:PEM routines:PEM_READ_BIO_PRIVATEKEY:bad password read error:140B0009:SSL routines:SSL_CTX_use_PrivateKey_file:PEM lib)
Oct 22 19:23:10 vm-nfj-206 nginx[5841]: nginx: configuration file /etc/nginx/nginx.conf test failed
Oct 22 19:23:10 vm-nfj-206 systemd[1]: nginx.service: Control process exited, code=exited status=1
Oct 22 19:23:10 vm-nfj-206 systemd[1]: Failed to start A high performance web server and a reverse proxy server.
Oct 22 19:23:10 vm-nfj-206 systemd[1]: nginx.service: Unit entered failed state.
Oct 22 19:23:10 vm-nfj-206 systemd[1]: nginx.service: Failed with result 'exit-code'.
no “ssl_certificate” is defined …
結構な量が出力される。nginx の listen ディレクティブで listen 443 ssl; だけだと発生。 listen 443 ssl default_server; とすると出力されなくなった。default_server の指定を行うと、複数のバーチャルサーバ設定を行っている環境でどのサーバにも一致しない場合にリクエストの振り先をデフォルトサーバにする意味を持つ。また、ssl という指定は、TLS を有効にするために指定する必要がある。
2016/10/22 21:59:47 [error] 6991#6991: *96 no "ssl_certificate" is defined in server listening on SSL port while SSL handshaking, client: 10.1.2.55, server: 0.0.0.0:443
2016/10/22 21:59:47 [error] 6991#6991: *97 no "ssl_certificate" is defined in server listening on SSL port while SSL handshaking, client: 10.1.2.55, server: 0.0.0.0:443
2016/10/22 21:59:49 [error] 6991#6991: *98 no "ssl_certificate" is defined in server listening on SSL port while SSL handshaking, client: 10.1.2.55, server: 0.0.0.0:443
2016/10/22 21:59:49 [error] 6991#6991: *99 no "ssl_certificate" is defined in server listening on SSL port while SSL handshaking, client: 10.1.2.55, server: 0.0.0.0:443
2016/10/22 21:59:49 [error] 6991#6991: *100 no "ssl_certificate" is defined in server listening on SSL port while SSL handshaking, client: 10.1.2.55, server: 0.0.0.0:443
参考サイト
mozilla wiki の Mozilla SSL Configuration Generator を利用し利用しているサーバで最新状態の暗号化スイートリストを設定時に確認しコピペ利用するのが良い。
- Qiita – 無料のSSL証明書StartSSLを活用する by k-shogo さん
- Mozilla Wiki – Mozilla SSL Configuration Generator