SSL証明書をECDSAで取得してみた。

同人サークル(もじずり技術会)の共同開発をスムーズにするべく自前のGitサーバを立てることにしました。
身内だけで使うものですので、多少互換性は低くともECDSAなSSL証明書を取得してみることにします。

まずは先例にならって使用可能なリストを確認します。


$ openssl ecparam -list_curves
  secp384r1 : NIST/SECG curve over a 384 bit prime field
  secp521r1 : NIST/SECG curve over a 521 bit prime field
  prime256v1: X9.62/SECG curve over a 256 bit prime field

今回はsecp384r1を選択して、秘密鍵とCSRを生成します。


$ openssl ecparam -out <秘密鍵の名前>.key -name secp384r1 -genkey
$ openssl req -new -sha384 -key <秘密鍵の名前>.key -out .csr

CSRが意図通り作成されているか確認します。


$ openssl req -in .csr -text

作成したcsrをコピーアンドペーストで、今回はCOMODOさんのPositiveSSLで申請。
数分後、送られてきたサーバ証明書と中間証明書をサーバにインストールして完了。

Perfect Forward Secrecyにしたいので、SSLCipherSuiteに設定できる値を調べてみる。


$ openssl ciphers -v 'EECDH+AESGCM:AES256+EECDH:AES128+EECDH'
  ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AESGCM(256) Mac=AEAD
  ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESGCM(256) Mac=AEAD
  ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AESGCM(128) Mac=AEAD
  ECDHE-ECDSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESGCM(128) Mac=AEAD
  ECDHE-RSA-AES256-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AES(256)  Mac=SHA384
  ECDHE-ECDSA-AES256-SHA384 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AES(256)  Mac=SHA384
  ECDHE-RSA-AES256-SHA    SSLv3 Kx=ECDH     Au=RSA  Enc=AES(256)  Mac=SHA1
  ECDHE-ECDSA-AES256-SHA  SSLv3 Kx=ECDH     Au=ECDSA Enc=AES(256)  Mac=SHA1
  ECDHE-RSA-AES128-SHA256 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AES(128)  Mac=SHA256
  ECDHE-ECDSA-AES128-SHA256 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AES(128)  Mac=SHA256
  ECDHE-RSA-AES128-SHA    SSLv3 Kx=ECDH     Au=RSA  Enc=AES(128)  Mac=SHA1
  ECDHE-ECDSA-AES128-SHA  SSLv3 Kx=ECDH     Au=ECDSA Enc=AES(128)  Mac=SHA1

実験のために一つに絞る形で以下のように設定してみました。


SSLProtocol -all +TLSv1.2
SSLHonorCipherOrder on
SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384
SSLCompression off

# OCSP Stapling
SSLUseStapling on
SSLStaplingResponderTimeout 5
SSLStaplingReturnResponderErrors off
SSLStaplingCache shmcb:/run/httpd/ocsp(128000)


Header always set Strict-Transport-Security "max-age=15768000"

上手く動いてくれているようです。