h2o/1.5.2です。
(たいていそうだと思いますが)中間CAから発行されたサーバー証明書の場合は、h2oではcertificate-fileで指定するファイルの内容を
- サーバー証明書
- 中間CAの証明書
という順序でcatで結合したものにします。順序があるので注意してください。参考: スマートフォン等、携帯端末の一部のみ「証明書が信頼できない」と警告が表示されます | Symantec
さて、h2oは起動時にOCSPレスポンダからレスポンスを得て、それのverifyが成功すればOCSP Staplingを有効にします。
具体的には、share/h2o/fetch-ocsp-response の中でopensslコマンドを使ってこの様にしています。
# certificate-fileで指定されたサーバー証明書からOCSPレスポンダのURIを得る openssl x509 -in $certificate_file -noout -ocsp_uri # certificate-fileから中間CAの証明書を得て($intermediate_file)、OCSPレスポンダにリクエストしてレスポンスを保存する openssl ocsp -issuer $intermediate_file -cert $certificate_file -url $ocsp_uri -header Host $ocsp_host -noverify -respout resp.der # OCSPレスポンスのverify。3つのうちどれかが通ればよい。 # 「for comodo」らしい openssl ocsp -respin resp.der -VAfile $intermediate_file # OpenSSL >= 1.0.2 で実装されたオプションを使用 openssl ocsp -respin resp.der -partial_chain -trusted_first -CAfile $intermediate_file # OpenSSL <= 1.0.1 だとこれになる openssl ocsp -respin resp.der -CAfile $intermediate_file
CentOS 6のOpenSSLは1.0.1なので、最後の3つめの方法でverifyすることになります。
さてさて、opensslはローカルにあるファイルからroot CA群の証明書(trust anchors)を得るのですが、オプションによって探す場所が変わります。
- -CAfile が指定されていない場合
- -CAfile が指定されている場合
先ほどCentOS 6の場合は
openssl ocsp -respin resp.der -CAfile $intermediate_file
でverifyすると書きました。
resp.derのissuerは中間CAです。中間CAの証明書は-CAfileで指定しているのでパスします。
が、中間CA証明書のissuer (=root CA) の証明書は見つけることができないので、エラーとなってしまいます。これがCentOS 6でOCSP Staplingが有効にならない原因です。
ちなみに、-CAfileで指定するファイルの内容を、中間CA+root CAの証明書、にすればパスします。
ちなみにちなみに、Ubuntu 14.04では(パスが /usr/lib/ssl/certs/
で、CentOS 6でOCSP Staplingを有効にするにはどうすればいいか?なのですが、自分のサーバー証明書のroot CAの証明書を別途入手して、どこかに置いて /etc/pki/tls/certs/ の下にhash linkを作るのがいいのではないかと思います。
オマケ
hash linkを作るコマンドライン(ln)を吐く便利関数
cert_hashlink() { [ -r $1 ] || { echo "cannot read file: $1"; return 1; } echo "ln -snf $1 $(openssl x509 -noout -hash < $1).0" }