
自己署名 CA と iOS および MacOS 上のテスト クライアントを使用して、Apache 2.4.54 で TLS 1.2 相互認証を実行しています。すべて正常に動作しますが、クライアントは CertificateRequest の「受け入れ可能なクライアント証明書 CA」を認識しないため、ユーザー/アプリはどれを選択するかを知る必要があります。iOS アプリでは、URLAuthenticationChallenge.protectionSpace.distinguishedNames
このリストを提供するフィールドが空です。MacOS Safari では、インストールされているすべての証明書の中から 1 つを選択するように求められますが、正しい発行者 CA を持つ証明書は 1 つだけです。
openssl s_client -connect myserver.com:443 -prexit
戻り値
Acceptable client certificate CA names
/C=US/ST=x/L=x/O=x/OU=x/CN=myca.com/emailAddress=x
関連する Apache 設定は次のようになります。
SSLCACertificateFile /etc/pki/CA/cacert.pem
SSLCADNRequestFile /etc/pki/CA/cacert.pem
SSLVerifyClient require
SSLVerifyDepth 1
なしでも同じ結果になりますSSLCADNRequestFile
。 Apache ログを見ると、LogLevel trace8
CertificateRequest に適切な識別名が書き込まれているようです。 これは生のダンプなので、バイナリ フィールドを読み取ることはできませんが、CA CN の正しい ASCII を確認できます。 iOS/MacOS はこのデータを見ているものの、使用できないと判断しているのだと思います。
CA 証明書には がありますX509v3 Basic Constraints: CA:TRUE
が、keyUsage 仕様がありません。認証が機能するので、クライアントが正しい証明書を選択する限り、証明書は問題ないと考えられます。
何が間違っているのか、あるいはさらにデバッグするにはどうしたらよいのか、何かアイデアはありますか?
答え1
私は間違っていました。許容可能な CA リストは、iOS アプリに配信されています (SSLCADNRequestFile を含めるかどうかに関係なく)。接続の開始時に 2 つのアプリ コールバックがあり、DER エンコードされた CA リストは 2 番目に配信されます。MacOS Safari で間違った CA の証明書を選択するオプションが表示された理由をまだ理解する必要がありますが、少なくともリストは配信されています。