3

我目前正在使用 Java 开发 SSL 客户端,需要与需要客户端身份验证的第三方服务器建立 https 连接。服务器人员给了我一个受信任的根 CA 证书,用于签署客户端和服务器证书。我已将此证书放在我身边的信任库中。服务器人员也有这个根 CA 证书,他们用它来验证客户端证书。

当我尝试建立 SSL 连接服务器时,我看到当服务器发送它的证书并且我的客户端能够成功验证它时,握手顺利进行。但作为“证书请求”消息的一部分,服务器不会在“证书权限”参数中返回任何根 CA 证书。因此,我的客户端不会将客户端证书发送回服务器并且握手失败。

我正在使用 WSDL 存根编写标准 Java 代码。我正在利用 wsdl2Java ant 任务生成的 wsdl 存根。

所以我的问题是:即使服务器在请求客户端身份验证时发送空的“证书颁发机构”列表,我是否可以让我的 java 客户端将预设的客户端证书发送回服务器。(我阅读了 TLS RFC,我发现服务器发送这样的空列表是合法的,在这种情况下,客户端可以发回它认为合适的任何证书。我正在尝试实现完全相同的行为)。

4

3 回答 3

2

很抱歉回复这个古老的帖子,但我无法抗拒。

我已经看到这种握手工作得很好:

根据 javax.net.debug=all

*** CertificateRequest
Cert Types: RSA, DSS, ECDSA
Supported Signature Algorithms: SHA512withRSA, Unknown (hash:0x6, signature:0x2), SHA512withECDSA, SHA384withRSA, Unknown (hash:0x5, signature:0x2), SHA384withECDSA, SHA256withRSA, Unknown (hash:0x4, signature:0x2), SHA256withECDSA, SHA224withRSA, Unknown (hash:0x3, signature:0x2), SHA224withECDSA, SHA1withRSA, SHA1withDSA, SHA1withECDSA
Cert Authorities:
<Empty>
*** ServerHelloDone
matching alias: our_client_cert_alias
*** Certificate chain
chain [0] = [
[
  Version: V3
  Subject: CN=

但这可能取决于您的 HTTP 客户端库以及它如何处理 SSL/TLS(重新)协商。这是使用 Java 8 和http://spray.io/documentation/1.2.4/spray-client/

于 2017-11-22T10:53:38.087 回答
1

这没有任何意义。服务器仍然不会接受它。至少它不应该接受它,如果它使用任何常用的 SSL 实现,它就不会接受它。他们根本不可能调整自己的 SSL 实现。

问题出在服务器端。它配置错误。您无法在客户端修复它。它应该在消息中向您发送该根 CA 证书或其签名者之一CertificateRequest

编辑此答案适用于 TLS 1.0。它已被TLS 1.1和后续版本淘汰。

于 2013-05-28T21:31:42.547 回答
1

我们遇到了类似的问题,有点意思,我们使用的库是 spring-ws 和 spring-ws-support,在那里你可以创建一个 HttpsUrlMessagenSender bean 来进行soap调用,通过设置自定义 KeyStoreFactoryBean,你可以设置你的 jks keystore(client证书)位置。但是我们在这里提到了同样的问题。

但是,如果我们使用默认行为(没有 HttpsUrlMessagenSender bean),并通过 java.net.ssl.keyStore 传递密钥库,它可以工作,并且证书权限列表为空,它无论如何都会发送客户端证书。

在我看来,jvm arg 触发了一些不同的行为。有些软件甚至有标志来处理这个http://techcommunity.softwareag.com/web/guest/pwiki/-/wiki/Main/Debugging+TLS+SSL+connections+in+Integration+Server

于 2019-08-10T14:53:12.890 回答