web-dev-qa-db-ja.com

CAを検証せずに、不明なCAを使用してApacheにクライアント証明書を信頼させる方法

次のような状況です。外部システムとの双方向統合をセットアップする必要があります。外部システムの管理者は、2つのCSRを送信する必要がありました。1つはクライアント証明書の生成に使用され、もう1つはサーバー証明書の生成に使用されます。彼らは私に対応する証明書を送った。私はチャネルをセットアップしましたが、成功しました(つまり、クライアント証明書を提供するサービスを呼び出すことができます)が、逆チャネルを正しくセットアップできません(つまり、Apacheにクライアント証明書を受け入れさせることができません)文句なしに)。

私のサーバー証明書(my-server.pemと呼びましょう)とともに、彼らは私に自分のクライアント証明書(their-client.pemと呼びましょう)も送ってきました。この証明書(their-client.pem)は「自己署名」CAによって発行されます。これは、私のLinuxシステムですでに利用可能な既知のCAには含まれていないCAです。私はこの証明書を持っていないので、外部システム管理者からまだ証明書を取得できませんでした(彼らは不本意です...これについてのコメントは控えておいてください...>-|)

これは、ApacheでVirtualHostを設定する方法です。

SSLEngine on
SSLCertificateFile /path/to/my-server.pem
SSLCertificateKeyFile /path/to/my-server-secret-key.key
SSLVerifyClient require
SSLCACertificateFile /path/to/their-client.pem
SSLVerifyDepth 0

私はCA証明書を持っていないので、「そのクライアント証明書を信頼し、他の誰も信用しない!」と言ってもまったく問題ないので、クライアント証明書自体をSSLCACertificateFileとして置きます。 to: https://security.stackexchange.com/questions/36069/use-client-certificate-using-self-signed-ca-while-using-web-certificate-of-a -pub

ただし、これは機能していないようです。彼らが彼らの側で見るエラーは:

javax.net.ssl.SSLException: Received fatal alert: unknown_ca

SSLログを有効にしてデバッグするように設定すると、私の側に次のように表示されます。

[ssl:debug] [pid 3396] ssl_engine_kernel.c(1381): [client <their-ip>:41474] AH02275: Certificate Verification, depth 1, CRL checking mode: none [subject: CN=Test CA,OU=Foo,O=Bar,C=it / issuer: CN=Test CA,OU=Foo,O=Bar,C=it / serial: 1BFE / notbefore: Dec  6 15:22:45 2010 GMT / notafter: Dec  6 15:21:52 2020 GMT]
[ssl:info] [pid 3396] [client <their-IP>:41474] AH02276: Certificate Verification: Error (19): self signed certificate in certificate chain [subject: CN=Test CA,OU=Foo,O=Bar,C=it / issuer: CN=Test CA,OU=Foo,O=Bar,C=it / serial: 1BFE / notbefore: Dec  6 15:22:45 2010 GMT / notafter: Dec  6 15:21:52 2020 GMT]
[ssl:info] [pid 3396] [client <their-IP>:41474] AH02008: SSL library error 1 in handshake (server my-server.com:443)
[ssl:info] [pid 3396] SSL Library Error: error:140890B2:SSL routines:SSL3_GET_CLIENT_CERTIFICATE:no certificate returned
[ssl:info] [pid 3396] [client <their-IP>:41474] AH01998: Connection closed to child 54 with abortive shutdown (server my-server.com:443)

つまり、クライアント証明書のダミーCAを検証しようとしています。また、SSLVerifyDepthを1に変更しようとしましたが、運がありませんでした(同じエラー)。 (SSLVerifyClientの値を変更して)クライアント証明書要求を無効にすると、呼び出しは問題なく実行されますが、正しい方法ではないと思います。

非常によく似た質問は次のとおりです: 既知のCAで検証することなく、ApacheにクライアントSSL証明書を要求させるにはどうすればよいですか?

しかし、私は受け入れられた解決策を理解しているのかわかりません。まず、検証する必要があるクライアント証明書は自己署名されていません(不明なCAによって発行されています)。

第二に、Apache/mod_sslのドキュメントから理解したことから、SSLVerifyCLient optional_no_caは、強力なクライアント証明書認証をオプションにするため、実際には無効にします。

3番目に、不足しているルートCA証明書と同じDNを使用して偽の証明書を作成する可能性は、クライアントにクライアント証明書を送信することを強制するための回避策のように聞こえますが、私の場合、クライアントが私を送信しないことが問題ではないと思います証明書ではなく、Apacheが完全に正しく検証できない。

このトピックに関する提案は非常に役立ちます。

5
Mauro Molinari

エラーメッセージには、ここに原因が明確に示されています:「深さ1」。 SSLVerifyDepth 0を設定しました。これは、マニュアルごとに次のことを意味します。

自己署名のクライアント証明書のみが受け入れられます

クライアント証明書が期待どおりであり、チェーン検証なしであるかどうかを確認するには、次のようにします。

SSLVerify none
SSLRequire (   %{SSL_CLIENT_S_DN_O} eq "Snake Oil, Ltd."  and %{REMOTE_ADDR} =~ m/^192\.76\.162\.[0-9]+$/  )
2
kubanczyk

私は実際には質問に答えない代替案を提案する応答が本当に嫌いです...しかし、証明書のCAを受け入れたくない(または提供しないためにできない)場合は、発行する必要がありますそれらはあなた自身のCAからの証明書です。これにより、署名者証明書を提供しないという問題だけでなく、奇妙なCAを信頼する必要もなくなります。

1
apocalysque

これはApache 2.4向けです。

# Unchanged:
SSLEngine on
SSLCertificateFile /path/to/my-server.pem
SSLCertificateKeyFile /path/to/my-server-secret-key.key
SSLCACertificateFile /path/to/their-client.pem
SSLVerifyDepth 0

# Changed:
SSLVerifyClient optional_no_ca
Require expr "%{SSL_CLIENT_I_DN_CN} -eq 'www.example.com'"

既知のCAに対して検証することなく、ApacheにクライアントSSL証明書を要求させるにはどうすればよいですか?

1
Jari Turkia