無料のSSL証明書StartSSLを活用する

# 背景

自前のサービスでhttps通信をサポートするには、SSL証明書が必要になります。  
自分で使用するだけなら、SSL証明書も自前で作成するいわゆるオレオレ証明書を用いても良いのですが、外部に公開するサービスの場合そうとも行きません。
SSL証明書というと値段が高い印象がありましたが、[StartSSL](https://www.startssl.com/)というサービスで無料でSSL証明書の発行を受けられると言うことで試してみました。

# StartSSLにユーザー登録する

証明書の発行を行う前に、StartSSLにユーザー登録する必要があります。  
[StartSSL](https://www.startssl.com/)から、"StartSSL Free (Class1)"を選択します。

![01](http://k-shogo.github.io/images/2013-10-07-start-ssl/01.jpg)

Certificate Control Panelを選択。

![02](http://k-shogo.github.io/images/2013-10-07-start-ssl/02.jpg)

Sign-upに進みます。

![03](http://k-shogo.github.io/images/2013-10-07-start-ssl/03.jpg)

名前、住所、メールアドレスなど
個人情報の登録を行います。

![04](http://k-shogo.github.io/images/2013-10-07-start-ssl/04.jpg)

登録したメールアドレスに本人確認のメールが届くので、受信したメールのauthentication codeを入力して登録を完了させます。
この時、「もっと詳細な住所を教えて欲しい」と言う旨のメールが送られてくることがあります。
その場合はStartSSLの担当者とメールをやりとりして登録を完了させましょう。

![05](http://k-shogo.github.io/images/2013-10-07-start-ssl/05.jpg)

登録を完了すると、StartSSLへのログイン用SSL証明書発行のためのURLが送られてきます。
そのリンクからブラウザに証明書をインストールしましょう。
暗号化セキュリティーレベルはデフォルトの2048（高）で良いと思います。
この時にインストールした証明書が無いとStartSSLにログインできません。 
他の端末や、ブラウザでアクセスする場合は証明書のエクスポートが必要になります。

![06](http://k-shogo.github.io/images/2013-10-07-start-ssl/06.jpg)

# ドメインの認証

ユーザー登録が完了したら、次はドメインの認証です。
Validations Wizardタブを選択します。

![07](http://k-shogo.github.io/images/2013-10-07-start-ssl/07.jpg)

証明書を発行したいドメインを登録します。

![08](http://k-shogo.github.io/images/2013-10-07-start-ssl/08.jpg)

自分が管理しているドメインであることを示すために、登録したドメインのpostmaster, hostmaster, webmasterなど、いずれかのメールアドレスでメールを受け取る必要があります。
メールを受信できるように事前に設定しておきましょう。

![09](http://k-shogo.github.io/images/2013-10-07-start-ssl/09.jpg)

先ほど指定した名前に確認用メールが送られてくるので、メールに記載されているコードを入力して進みます。

![10](http://k-shogo.github.io/images/2013-10-07-start-ssl/10.jpg)

# 秘密鍵の発行

ドメインの認証が終わったら、秘密鍵の発行です。
Certificates Wizardタブを選択し、Certificate TargetはWeb Server SSL/TLS Certificateを指定します。

![11](http://k-shogo.github.io/images/2013-10-07-start-ssl/11.jpg)

パスワードを設定して進みます。

![12](http://k-shogo.github.io/images/2013-10-07-start-ssl/12.jpg)

private keyが作成されたので、テキストエリアの情報を保存します。

![13](http://k-shogo.github.io/images/2013-10-07-start-ssl/13.jpg)

# 公開鍵の発行

登録したドメインを選択します。

![14](http://k-shogo.github.io/images/2013-10-07-start-ssl/14.jpg)

サブドメインを登録します。

![15](http://k-shogo.github.io/images/2013-10-07-start-ssl/15.jpg)

次に進むとメールを送信するという表示がされるので、メールが来るのを待ちます。
メールを受信したら、Tool Boxタブに移動し、Retrieve Certificateを選択します。

![16](http://k-shogo.github.io/images/2013-10-07-start-ssl/16.jpg)

すると公開鍵が表示されるので、テキストエリアの内容を保存しておきます。

![17](http://k-shogo.github.io/images/2013-10-07-start-ssl/17.jpg)

# 証明書の設置

サーバーにSSL証明書を設置し、HTTPSでの通信を出来るようにします。
今回はnginxでSSL証明書を利用できるようにしてみます。

SSL証明書を設置するディレクトリに移動します。

```
cd /etc/pki/tls/certs/
```

StartSSLの証明書をダウンロードします。

```
wget https://www.startssl.com/certs/ca.pem
wget https://www.startssl.com/certs/sub.class1.server.ca.pem
```

先ほど保存しておいた秘密鍵と公開鍵を配置します。
今回はそれぞれ`startssl.key`と`startssl.crt`と言う名前で設置しました。
例えばvimでファイルを作成して鍵の中身を貼り付けます。

```
vim startssl.key
vim startssl.crt
```

証明書と鍵のパーミッションを変更します。

```
chmod 400 startssl.crt startssl.key ca.pem sub.class1.server.ca.pem
```

Apacheを使用する場合は中間証明書を指定するディレクティブがありますが、nginxには中間証明書を直接指定するディレクティブが用意されていません。
そこでサーバ証明書と中間証明書を結合します。
証明書は順に辿らないと駄目なので、結合の順番には注意しましょう。

```
cat sub.class1.server.ca.pem >> startssl.crt
```

秘密鍵にはパスワードが設定されているため、nginxのstart/restart時にそのパスワードを入力する必要が出てきます。
自動起動する場合には不便なので、パスワードを解除する場合は以下のようにバックアップを作成した後、パスワードがない鍵を作成します。

```
cp startssl.key startssl.key.org
openssl rsa -in startssl.key -out startssl.key
```

nginxの設定を一部抜粋します。
`ssl_certificate`で中間証明書と結合した証明書を、`ssl_certificate_key `で秘密鍵を指定します。
オプションとしてSSLダウングレード攻撃を考慮して、SSLバージョン指定`ssl_protocols`,暗号スイート指定`ssl_ciphers `,暗号選択方式指定`ssl_prefer_server_ciphers `を変更しました。

```nginx
server {

    listen       443 ssl;

    ssl_certificate      /etc/pki/tls/certs/startssl.crt;
    ssl_certificate_key  /etc/pki/tls/certs/startssl.key;
    ssl_session_timeout  5m;
    # SSLv2以下は利用しない
    ssl_protocols  SSLv3 TLSv1;
    # 暗号スイートの指定
    ssl_ciphers  RC4-SHA:HIGH:!ADH;
    # 暗号の選択をサーバ側で決定
    ssl_prefer_server_ciphers   on;
    
}
```

# まとめ

無料のSSL証明書ではありますが、PCブラウザおよびiPhoneからのアクセス等でも警告なくHTTPSでの接続が可能になるので便利に活用できるのではないでしょうか。