Apache2.2系でECC版SSL証明書を導入してみる

[小悪魔女子大生のサーバーエンジニア日記](https://co-akuma.directorz.jp/blog/2013/07/ecc%e7%89%88ssl%e8%a8%bc%e6%98%8e%e6%9b%b8%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e4%bd%93%e9%a8%93%e8%a8%98%e3%81%9d%e3%81%ae1/)でECC対応版SSL証明書の設定方法が書かれてて、文中に「ベリサインではテスト用のECC版SSL証明書の提供が行われている」っていうのを見つけたので、自分の環境でも試してみました。

小悪魔さんの手順をトレースするだけだと芸がないので、Apache v2.2.26([release note](http://www.apache.jp/news/apache-http-server-2.2.26-released))からECC対応がバックポートされてるので、Apache 2.2系で頑張ってみます。

### 0. **環境**
> CentOS 6.5(x64)
> openssl 1.0.1e-16

### 1. **Apacheのインストール**
CentALTレポジトリを使って、2.2系の新しいパッケージをインストします。

```bash
$ wget http://centos.alt.ru/repository/centos/6/x86_64/centalt-release-6-1.noarch.rpm
$ sudo rpm -ivh centalt-release-6-1.noarch.rpm
$ sudo yum -y install httpd mod_ssl
$ rpm -qa |  egrep "httpd|mod_ssl"
httpd-2.2.26-2.el6.x86_64
httpd-tools-2.2.26-2.el6.x86_64
mod_ssl-2.2.26-2.el6.x86_64

$ sudo /sbin/service httpd start
```

無事にApache 2.2.26がインストされました。
iptablesで穴あけしましょう、とかchkconfigで自動起動設定しましょう、というのは端折りますね。

### 2. **ECC版SSL証明書の作成**
まずはECC版の秘密鍵とCSRを作成します。
[小悪魔さんサイト](https://co-akuma.directorz.jp/blog/2013/07/ecc%E7%89%88ssl%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E4%BD%93%E9%A8%93%E8%A8%98%E3%81%9D%E3%81%AE3/)とベリサインの[→ここ←](https://knowledge.verisign.co.jp/support/mpki-for-ssl-support/index?vproductcat=V_C_M&vdomain=VERISIGN.JP&page=content&id=SO24070&actp=LIST&viewlocale=ja_JP&locale=ja_JP&redirected=true)も参考にしました。

```
$ openssl ecparam -out ecc_private.key -name prime256v1 -genkey
$ openssl req -new -key ecc_private.key -out ecc_request.csr
~~ この後、対話式で国、地域、社名、CommonNameなど聞かれるので入力します ~~

$ cat ecc_request.csr
-----BEGIN CERTIFICATE REQUEST-----
MIIBlDCCATwCAQAwgb4xCzAJBgNVBAYTAkpQMQ4wDAYDVQQIDAVUb2t5bzEVMBMG
~~snip~~
af9iFYXTbGBX+NcmGEFdOaIogIg/mZyx
-----END CERTIFICATE REQUEST-----
```

CSRができたので、[お試しECC版証明書発行サイト](https://www.verisign.co.jp/cgi-bin/mf.cgi?n=ecctrial)に ecc_request.csr の文字列と、個人情報系を入力しましょう。ちなみに私の場合だと、夕方に申し込んで、翌日昼前にECC証明書が届きました！（公式には5営業日かかるとのこと）
証明書の有効期限は14日なので、届いたらさっさとインスト&確認を進めましょう。

### 3. **Apacheに証明書の取り込み**
メールで届いた署名済みの公開鍵をペタっとコピペで作成します。

```
$ sudo vim /etc/pki/tls/certs/ecc_common.crt
```

opensslコマンドで作成した秘密鍵も配置しましょう

```
$ sudo cp -p ~/ecc_private.key /etc/pki/tls/private/.
$ sudo chmod 600 /etc/pki/tls/private/ecc_private.key
```

中間証明書も[→ここ←](https://www.verisign.co.jp/repository/trial_root/ECCTrialInterRoot.html
)から取得してペタっと作成しましょう。
**ちなみに上記のリンクはテスト用の中間証明書です。有償(正規)版とは異なるものを使う必要あります。**

```
$ sudo vim /etc/pki/tls/certs/ecc_ca_test.crt
```

ここまでで証明書の配置は完了したので、次はApacheのconfを仕込みましょう。

```ssl.conf
SSLCertificateFile /etc/pki/tls/certs/ecc_common.crt
SSLCertificateKeyFile /etc/pki/tls/private/ecc_private.key
SSLCertificateChainFile /etc/pki/tls/certs/ecc_ca_test.crt
```
上記の3行に配置したファイルを指定するだけです！
443をListenとかmod_sslをLoadModuleするとかSNIでVirtualHost毎に証明書を、とかは端折ってますからねー

### 4. **Apacheを再起動して確認！**
Apacheに反映です。一応configtestしてから再起動しましょう！

```bash
$ sudo /sbin/service httpd configtest && sudo /sbin/service httpd restart
```

んで、ブラウザで確認ですね
### !!証明書エラー!! (ﾟдﾟ)！
![証明書エラー.jpg](https://qiita-image-store.s3.amazonaws.com/0/38926/95dcbb78-2b27-a968-6864-afb3eee5f1fc.jpeg)

なんと証明書エラー発生しちゃいました。アルゴリズムはECCで接続できてるんですが・・・。

で、よくよく調べてみると、 **テスト版の証明書はテスト用のルート証明書をブラウザにインポート** しておかなければならないとのこと。。。 (´・ω・`)

[→こちら←](https://www.verisign.co.jp/repository/trial_root/ECCTrialRoot.html)のルート証明書をブラウザにインポートしましょう。

そして、ブラウザを起動しなおして再接続すると・・・

### ｷﾀ━(ﾟ∀ﾟ)━!
![証明書OK.jpg](https://qiita-image-store.s3.amazonaws.com/0/38926/416319e0-5b3c-38ac-c944-4035aa371bd4.jpeg)


エラーもなく無事にECCの証明書でhttps接続できました！メッセージの署名もSHA256ですよ、お客さん。

まとめると、下記ですかねー。

+ Apache 2.2系でもさくっとECC版証明書が動いた
+ 小悪魔さんのサイトだと、テスト版ではないのでECC版とRSA版の2つの証明書を仕込んでいましたが、テスト版は本当にECC版のみの証明書だった
+ テスト用の証明書を使う時は、テスト用の中間証明書、ルート証明書を用いなければならなかった

正直なところ、有効期限短いんだし、有償版と同じ中間証明書、ルート証明書で発行して欲しいものですねー。

ではでは。