我的情况如下。我需要与外部系统建立双向集成。外部系统的管理员要求我发送两个 CSR,一个用于生成客户端证书,另一个用于生成服务器证书。他们向我发送了相应的证书。我成功设置了“我->他们”通道(即:我可以调用他们的服务来提供我的客户端证书),但我无法正确设置反向通道(即:我无法让我的 Apache 毫无怨言地接受他们的客户端证书)。
除了我的服务器证书(我们称之为 my-server.pem)外,他们还向我发送了他们自己的客户端证书(我们称之为 their-client.pem)。此证书(their-client.pem)由“自签名”CA 颁发,该 CA 不属于我的 Linux 系统中已有的那些知名 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
,如以下回答中所建议的那样:
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
),调用会很顺利,但我认为这不是正确的方法。
关于这个主题的任何建议都会非常有帮助。
答案1
从错误来看,他们那边的应用程序是基于 Java 的。我可能错了,这是有点儿我的第一次冒险。但是他们是否需要将他们的 CA 导入到他们的 Java 密钥存储中?
我记得在 Java 应用程序 (Atlassian Crowd) 和 Novel LDAP 服务器之间建立了受信任 (安全) 的连接。LDAP 服务器也使用自签名证书。它会因类似错误而失败。答案是将证书导入 Java 密钥存储区。
高血压