如何使Apache使用未知CA来信任客户端证书,而不validationCA.

我处于以下情况。 我需要build立一个与外部系统的双向集成。 外部系统的pipe理员要求我发送两个CSR,一个用于生成客户端证书,另一个生成服务器证书。 他们给了我相应的证书。 我设置了频道我 – >他们成功(即:我可以调用他们的服务提供我的客户端证书),但我不能正确设置反向频道(即:我不能让我的Apache接受他们的客户端证书没有抱怨)。

再加上我的服务器证书(我们称之为my-server.pem),他们也给我发送了自己的客户端证书(我们称之为“客户端.pem”)。 这个证书(their-client.pem)是由一个“自签名的”CA发出的,这个CA是不在我的Linux系统中已经可用的那些知名的CA之中的。 我没有这个证书,我还没有从外部系统pipe理员那里得到它(他们不愿意…让我们搁置这个请求…> – |)

这是我如何在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 ,正如答案中的build议: 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 

启用S​​SL日志并将其设置为debugging后,我在我身边看到的是:

 [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) 

换句话说,它仍然试图validation客户证书的伪CA。 我也尝试将SSLVerifyDepth更改为1,没有运气(同样的错误)。 如果我禁用客户端证书请求(通过更改SSLVerifyClient值),调用会很好,但我不认为这是正确的方法。

一个非常类似的问题是: 如何使apache请求一个客户端的SSL证书,而无需validation它与一个已知的CA?

但是我不确定我是否理解可接受的解决scheme。 首先,我必须validation的客户端证书不是自签名的(由未知的CA颁发)。

其次,从我从Apache / mod_ssl文档中SSLVerifyCLient optional_no_caSSLVerifyCLient optional_no_ca实际上禁用了强大的客户端证书authentication,因为它使它成为可选的。

第三,使用缺less的根CA证书的相同DN创build假证书的可能性听起来像是强制客户端发送其客户端证书的解决方法,但在我的情况下,我不认为我的问题是客户端不发送给我证书,而是Apache无法完全validation它的正确。

任何关于这个话题的build议都会非常有帮助。

我不是Apache的专家,但是从证书的angular度来看,如果他们不想为你提供根CA的公钥,只要求他们从一个知名的CA获得他们的客户证书,而不是他们自己的CA 。 例如,StartSSL提供免费的1年证书。 你正在构build一个噩梦,因为合作伙伴不明白它是如何工作的。 另一种方法是安装自己的CA(Linux) https://jamielinux.com/docs/openssl-certificate-authority/ (Windows) http://datacenteroverlords.com/2012/03/01/creating-your-own- ssl-certificate-authority /并要求他们提供一个CSR以replace(their-client.pem)

你的错误信息在这里清楚地显示了原因:“深度1”。 您已经设置了SSLVerifyDepth 0 ,每个手册意味着:

自签名客户端证书只接受

要检查客户端证书是否符合预期,并且没有链接validation,请尝试如下所示:

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

我真的很讨厌那些build议替代品不能真正回答这个问题的反应,但是如果你不想(或者不能,因为他们不提供它)接受他们的CA作为他们的证书,那么你应该发出他们从你自己的CAauthentication。 这将解决他们不仅不提供签署者证书的问题,而且还会阻止你不得不相信一个奇怪的CA.