iPadのSafariでオレオレSSLクライアント証明書を使っていると動画再生できない

イントラ案件だけどiPadで動画を見たいという話があったので、videoタグを使ったHTMLページを作り、Safariから動画を視聴できるようにした。
動画自体は社外秘ではないのだけど、サイト内の他のコンテンツは社外秘なので、SSLクライアント証明書を配布してSSL経由でのアクセスのみ許可するようにしている。(関連: Apache2.2でリモートアドレスベースでの制限 "または" SSLクライアント証明書による認証を行う - terazzoの日記)
ところが、どうやってもSSL経由で動画が再生できない。同じHTML/動画ファイルでも、SSLを使わない場合や、クライアント証明書を使わない場合には再生できたので、どうやら証明書周りが怪しい。

確認したバージョンはこの辺:

結論

videoタグでhttpsを使用した際に、端末にそのドメインに対するクライアント証明書がインストールされている場合、インストールされている証明書の代わりに誤ってApple独自のクライアント証明書が使用されてしまう不具合っぽい。
iOS 7ではまだ調べてないので、直ってなかったら不具合報告しときます。

調べたこと

まずApacheのエラーログを見てみた。以下のように、証明書チェーンが長すぎるとのエラーが出ていた。

[Sun Oct 06 19:20:49 2013] [error] Certificate Verification: Error (19): self signed certificate in certificate chain
[Sun Oct 06 19:20:49 2013] [error] Certificate Verification: Certificate Chain too long (chain has 3 certificates, but maximum allowed are only 1)

今回使用したSSLクライアント証明書は独自に認証局を立てて発行したもので、証明書のチェーンがそんなに長いはずはない。

まあでもチェーン数の最大を増やしてみた。
/etc/httpd/conf.d/ssl.conf:

SSLVerifyDepth 3

もう一度アクセスしてログを確認したところ……

[Sun Oct 06 19:21:39 2013] [error] Certificate Verification: Error (19): self signed certificate in certificate chain

証明書チェーン検証が失敗しているようだ。

確かにオレオレ認証局で署名した証明書なのだが、ちゃんと認証局の証明書ファイルはインストールしているし、動画以外はちゃんと見れる。

/etc/httpd/conf.d/ssl.conf:

SSLCACertificateFile /etc/pki/CA/cacert.pem

どうにも分からないので、ログレベルを上げてもう少し詳しい内容を出力してみた。
/etc/httpd/conf.d/ssl.conf:

ErrorLog logs/ssl_error_log
LogLevel debug

再度アクセスしてログを確認……

[Sun Oct 06 19:22:20 2013] [debug] ssl_engine_kernel.c(1259): Certificate Verification: depth: 3, subject: /C=US/O=Apple Inc./OU=Apple Certification Authority/CN=Apple Root CA, issuer: /C=US/O=Apple Inc./OU=Apple Certification Authority/CN=Apple Root CA

"CN=Apple Root CA"という知らない認証局の署名に使われてるのでエラーということらしい。
今回用意したSSLクライアント証明書はもちろんApple Root CAで署名されたりしていない。なんでだ???

エラーログ内のダンプの中に"http://www.apple.com/appleca/"というURLがあったので、試しにアクセスしてみたところ、「Apple PKI - Apple」というサイトに飛ばされた。アプリやソフトウェアアップデートの署名に使われている証明書ではないのかな?

試しにこのページにある"Apple Inc. Root Certificate"をサーバに配置してみて、アクセスできるかどうかを確認してみる。

ダウンロードしたAppleIncRootCertificate.cerはX.509のDER形式なのでPEMに変換する。

# openssl x509 -inform der -in AppleIncRootCertificate.cer -outform pem -out AppleIncRootCertificate.pem

元々の認証局の証明書ファイルとコンカチする。

# cat cacert.pem AppleIncRootCertificate.pem >concat.pem

新しく作った証明書ファイルを使うように設定変更してやると……
/etc/httpd/conf.d/ssl.conf

SSLCACertificateFile /etc/pki/CA/concat.pem

アクセスしてみると、無事にSSL経由でvideoタグに指定された動画を再生できた!

但し本来のクライアント証明書は使用されていないので、このままではセキュリティが保てず本質的な解決にはなっていない。(Appleが署名した証明書を使えば大切な社外秘の情報まで見られてしまう。)

Safariの不具合だと思うので直してほしいかも。