今回の騒ぎで “Qualys SSL Labs – Projects / SSL Server Test” をやったとき,テスト結果に赤やらオレンジやらが乱舞していた (^_^;)。
||赤いの||
- Trusted : No NOT TRUSTED <<---- これは,自前認証局を使っているせいなので,自信をもって無視する(笑)。
- IE 6 / XP No FS 1 No SNI 2 : Protocol or cipher suite mismatch : Fail3 <<---- うちの SSL サーバのユーザは私だけで,私は IE 6 / XP なんぞ使わないので,これも無視。
- Fail3 “Only first connection attempt simulated. Browsers tend to retry with a lower protocol version.” なんだそうだ。うちの SSL サーバはより低レベルのプロトコルは受けつけないが,これも別に問題なし。
というわけで,赤いのについては何もやらなくてよし。
||オレンジの||
- Prefix handling : Not valid for “www.o6asan.com” :CONFUSING
- Signature algorithm : SHA1withRSA : WEAK
- Chain issues : Contains anchor <<---- Ivan Ristić が “Chain issues Contains anchor” で書いていたことを根拠に,無視。
- Not in trust store <<---- これも自前認証局のせいなので,無視。
- Downgrade attack prevention : No, TLS_FALLBACK_SCSV not supported
- Forward Secrecy : With some browsers
オレンジのについては, 1, 2, 5, 6 について対処する必要がありそうだ。まずは, 5 と 6 から。 1 と 2 は証明書そのものを作り変えないといけないので,後回し。
- Apache 2.4.10 (httpd-2.4.10-win32-VC11.zip) を 10/20 バージョンにアップデートした。この版は openssl-1.0.1j を使ってビルドされてて,1.0.1j は TLS_FALLBACK_SCSV をサポートしたから。
- httpd-ssl.conf において, SSLHonorCipherOrder on をアンコメントし, SSLCipherSuite Directive の値を変更。
HIGH:MEDIUM:!aNULL:!MD5
↓
EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384
EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256
EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP
!PSK !SRP !DSS
参考 : Configuring Apache, Nginx, and OpenSSL for Forward Secrecy
↓ RC4 関連で, 12/23 に下記に変更した。
EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384
EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH
EDH+aRSA !RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS"
Ref : RC4 in TLS is Broken: Now What?
SSL サーバがモバイルや旧世代の OS/browser をサポートしなくてはいけない場合は,それらに合わせた設定もする必要が生じる。うちのは,関係ないけど。
この作業後,テストしたら, “Downgrade attack prevention : Yes, TLS_FALLBACK_SCSV supported” と “Forward Secrecy : Yes (with most browsers) ROBUST” に変わった。
次は, 1 と 2。
1 は自前認証局の Common Name が o6asan.com だけだからだ。で,新しいのは, o6asan.com も www.o6asan.com もサポートさせないといけない。しかし,我が家の SSL サーバ用の IP は,一つしか割り当てる気がないよという問題がある。これに対処するために, SNI(Server Name Indication) を使う。 8 月ごろに,くりくりさんが取り組まれていた。まあ,まだすべての OS/browser がサポート完了しているわけではないが……それでも,かなりましになってきたのは確か。ワイルドカード証明書か SAN かということになるが, SANs で行くことにした。だって,うちの SSL サーバに任意のサブドメインを受け入れさせる必要はないでしょ。これについては Apache からも制限できるとはいえ,必要のない扉を大きく開けるのはポリシーに反する。
2 は前の証明書を作ったときに OpenSSL の default を使ったからである。デフォルトだと,今もかわらず SHA1 を使うようになっている。今回は, default_md = sha256
にして,こさえるワ。
28 日,改めて Server Name Indication を読み込んでいたのだが, SNI と ワイルドカード証明書か SAN は次元の違う話のようだ。難しいなぁ。
openssl.cnf (← この標準の名称のままで行く) を Apche24conf から c:openssl-1.0.1x-winxxssl (← OpenSSL をフルでインストールすると,ここがデフォルト) にコピーして,以下のようにカスタマイズする。
- 一行アンコメントし,いくつか値を変更する。
dir = ./demoCA
—->>dir = X:/demoCA
<<----絶対パスdefault_crl_days = 30
—->>default_crl_days = 365
default_md = default
—->>default_md = sha256
default_bits = 1024
—->>default_bits = 2048
# req_extensions = v3_req
—->>req_extensions = v3_req
- [ v3_req ] のエリアに
subjectAltName = @alt_names
を追加。 - [ v3_ca ] エリアの直前に以下を追加。
[ alt_names ]
DNS.1 = example.com
DNS.2 = www.example.com
必要なドメインを DNS.1, DNS.2, DNS.3, … のように追加できる。 - クライアント証明書も必要な場合は, openssl.cnf の最後に以下を追加する。
[ ssl_client ]
basicConstraints = CA:FALSE
nsCertType = client
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = clientAuth
nsComment = "OpenSSL Certificate for SSL Client"
さて,新自前認証局の作成をしよう。(参考 : 本家のお世話-#68)
- ||自前 CA 作成||
- X:/ に myCA フォルダを作る。
- private と newcerts という 2 つのフォルダと index.txt を myCA に作る。
- cmd.exe を 管理者として実行。
pushd X:myCA
echo 01 > serial
openssl req -new -keyout privatecakey.pem -out careq.pem
openssl ca -selfsign -in careq.pem -extensions v3_ca -out cacert.pem
copy cacert.pem (Drive_SV):Apache24confssl.crt
copy cacert.pem my_ca.crt注)(Drive_SV) というのは,自宅サーバ上のサーバウェア用パーティションである。
- ||Server 証明書作成||
pushd X:myCA
openssl genrsa -out server.key 2048
openssl req -new -out server.csr -key server.key- 次のコマンドで CSR 内の SANs を確認する。(中にちゃんと ‘Subject Alternative Name’ があるかな?)
openssl req -text -noout -in server.csr
openssl ca -in server.csr -out server.crt -extensions v3_req
copy server.key cp_server.key
openssl rsa <cp_server.key> server.key
copy server.key (Drive_SV):Apache24conf
copy server.crt (Drive_SV):Apache24conf
- ||Client 証明書作成||
pushd X:myCA
openssl req -new -keyout client.key -out client.csr
openssl ca -policy policy_anything -extensions ssl_client -in client.csr -out client.crt
openssl pkcs12 -export -in client.crt -inkey client.key -out clientcert.p12
SANs 作成参考リンク : FAQ/subjectAltName (SAN), Multiple Names on One Certificate.
やっと,「 SANs 対応かつ SHA256 使用の自前認証局」が出来た。満足じゃ!!