先日SSL化したサイトとは別に、業務アプリを動かしているサイトもSSL化したのでメモ。自分しか使わないので、無料のSSL証明書 StartSSLで証明書を取得して、nginxに設定しました。
注
現在、StartSSLは以下の理由により使用することをおすすめしません。無償のSSL証明書はLet's Encryptをおすすめします。
- 2016年8月、中国の認証サービス会社WoSignがスタートコムを買収していたが、その後・・・
- WoSignがGitHubのドメインの1つについて許可なく証明書を発行した
- SHA-1証明書の発行日付を規定期限の2015年12月31日より前の日付にバックデートし偽装していた
- その他不正がいっぱい
参考リンク
筆者は現在、StartSSLの証明書を使用しておりません。
■ 環境
$ cat /etc/redhat-release CentOS release 6.7 (Final)
$ nginx -v nginx version: nginx/1.9.4
$ yum list installed | grep ^openssl openssl.x86_64 1.0.1e-42.el6 @base
■ StartSSL アカウント作成〜証明書取得
まずはstartcomのサイトにアクセスします。
トップページの真ん中にある「StartCOM SSL SECURED」をクリックします。
「StartSSL™ - The Swiss Officer's Knife of Digital Certificates & PKI」という画面に遷移します。
ここから「StartSSL™ Free(Class 1)」をクリックします。
以下のような画面に遷移するので、中央左下の「Certificate Control Panel」をクリックします。
「Authenticate or Sign-UP?」と聞かれるので、「Sign-UP」のボタンをクリックします。
上から名前、苗字、住所、郵便番号、市区町村を入力し、国名と都道府県をプルダウンメニューから選択し、電話番号とメールアドレスを入力します。都道府県とメールアドレスは入力必須項目です。入力したら「Continue >>>」をクリックしましょう。
以下のようなダイアログが表示されるので「OK」をクリックし、数分待った後にメールを確認してみましょう。
startcomからauthentication codeがメールで送られてきていることを確認し、以下の画面に貼り付けましょう。
秘密鍵生成の画面に遷移するので、ここでは2048bitで鍵を生成します。
「Install」をクリックします。
すると、ブラウザにStartcomのクライアント証明書が保存されます。このブラウザからしかアクセスしないサイトであれば、後にWEBサーバーへインストールするSSL証明書の他、中間CA証明書を別途インストールする必要がありません。しかし、複数のブラウザからアクセスすることを考えるとこれではいけませんので、WEBサーバーにはSSL証明書と中間CA証明書をあわせてインストールすることにします。
※ クライアント証明書はStartcomのサイトへログインするのに必要なので、エクスポートしておいて大事に保管しておきましょう。
ひとまずクライアント証明書を表示して確認します。
次に「Validations Wizard」をクリックします。
今回は「〜〜〜.ll4u.in」というサブドメインのSSL証明書が欲しいので、「Domain Name Validation(ドメイン名認証)」を選択します。
トップレベル・ドメインを右側のプルダウンメニューから選び、サブドメインごと入力するのですが・・・
いきなりサブドメインを入力するなと怒られてしまいました。
というわけで、サブドメインなしで再度入力します。
postmaster、webadmin、hostmaster、adminなどのメールアドレス宛にAuthentication Codeが送られてくるので、これらメールアドレスが受信できるようにしておきましょう。
「Continue >>>」をクリックして数分待つと、Authentication Codeがメールで送られてきます。
メール本文の「Your validation code is 〜〜〜〜」と書かれている部分をコピーしてブラウザに貼り付けましょう。
このように「Validation Success」と表示されたらドメイン認証が完了です。「Finish >>」をクリックします。
次に「Certificates Wizard」をクリックします。
プルダウンメニューから「Web Server SSL/TLS Certificate」を選択し、Continueをクリックします。
秘密鍵のパスワード(今ここで自分で決めたもの)を入力し、Keysizeは2048bit、ハッシュアルゴリズムはSHA2を選択してContinueをクリックします。
このように秘密鍵が生成されたので、テキストエディタにコピペして保存します。
保存したらContinueをクリックします。
次に、サブドメインを追加するので「Add Domains」の画面でプルダウンメニューから先ほど登録したドメインを選択し、Continueをクリックします。
ここでようやくサブドメインを入力することができます。テキストボックスにはサブドメインのみを入力し、Continueをクリックします。
Common Nameが先ほど入力したものであることを確認し、Continueをクリックします。
Additional Check Required!と表示されてしばらくすると、Startcomから「証明書発行しました」的なメールが届きます。
メールに書かれたリンク「https://www.startssl.com/?app=12」をクリックしてログインします。ログイン後、Tool Boxから「Retrieve Certificate」をクリックします。
プルダウンメニューから「〜〜〜.ドメイン名(Server - Class 1 - 期限)」を選択し、Continueをクリックします。
このように証明書が表示されるので、テキストエディタにコピペして保存します。
ブラウザでの作業はここまでです。
それではWEBサーバーにログインして、続きの作業を行いましょう。
■ WEBサーバーに証明書、中間CA証明書をインストールする
SSL証明書のインストール方法は前回とほぼ一緒です。中間CA証明書の入手方法も含み、公式サイトの手順に従うこととします。ここから「»» NGINX Server」のリンクをクリックして中身を確認しましょう。手順としては、
- 秘密鍵からパスフレーズを抜く
- 秘密鍵のパーミッションを600にする
- 中間CA証明書 http://www.startssl.com/certs/sub.class1.server.ca.pem を入手する
- 証明書と中間CA証明書をcatコマンドで結合して保存する
となります。ファイル名は前回の手順と合わせているので公式サイトと違いますが、やってることは一緒でこんな感じです。
秘密鍵からパスフレーズを抜く
$ sudo openssl rsa -in cert.key -out cert.key
秘密鍵のパーミッションを600にする
$ sudo chmod 600 cert.key
中間CA証明書を入手する
$ sudo curl -LO https://www.startssl.com/certs/sub.class1.server.ca.pem
証明書と中間CA証明書をcatコマンドで結合して保存する
$ sudo cat cert.pem.ORIG sub.class1.server.ca.pem | sudo tee cert.pem
秘密鍵だけでなく、証明書ごとパーミッションを600にしてしまいます。
$ sudo chmod 600 *
証明書を保存しているディレクトリはこんな感じです。cert.keyが秘密鍵、cert.pemが証明書と中間CA証明書を合体させたもの、cert.pem.ORIGが証明書、sub.class1.server.ca.pemが中間CA証明書です。
$ ls -l 合計 20 -rw------- 1 root root 1679 8月 28 22:29 2015 cert.key -rw------- 1 root root 4298 8月 29 19:01 2015 cert.pem -rw------- 1 root root 2208 8月 28 22:00 2015 cert.pem.ORIG -rw------- 1 root root 2090 8月 29 19:00 2015 sub.class1.server.ca.pem
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
OKですね。それではnginxを再起動します。
※CentOS6(initscriptから起動)の場合
$ sudo service nginx restart Stopping nginx: [ OK ] Starting nginx: [ OK ]
※CentOS7(systemdから起動)の場合
$ sudo systemctl restart nginx.service
あとは忘れずにTCP443番ポートのfirewallの穴をあけておきましょう。ね、簡単でしょう?
[amazonjs asin="4797382228" locale="JP" title="暗号技術入門 第3版 秘密の国のアリス"]