【问题标题】:Why client cert is not sent during SSL connection? CXF 2.7.9为什么在 SSL 连接期间不发送客户端证书? CXF 2.7.9
【发布时间】:2016-11-25 06:59:37
【问题描述】:

背景

我的应用程序部署在 jboss 5 中,与需要 MASSL 的 Web 服务服务器通信。 (2 路 SSL)

问题

通过查看 SSL 连接的日志,客户端证书即使在开始时已经加载,也没有发送。

日志详情如下,客户端证书应该在服务器问候完成后发送

[编辑]根据回复添加了更多详细信息

  1. 在日志中添加了 CertificateRequest

  2. Cient 证书实际上与上述请求匹配 - (a) 算法是 RSA,(b) 由请求中指定的 CA 签名

日志:

2016-11-25 09:32:38,434 INFO  [STDOUT] (http-0.0.0.0-8080-4) keyStore is : /XX/XX/my.jks
2016-11-25 09:32:38,434 INFO  [STDOUT] (http-0.0.0.0-8080-4) keyStore type is : jks
2016-11-25 09:32:38,434 INFO  [STDOUT] (http-0.0.0.0-8080-4) keyStore provider is :
2016-11-25 09:32:38,434 INFO  [STDOUT] (http-0.0.0.0-8080-4) init keystore
2016-11-25 09:32:38,440 INFO  [STDOUT] (http-0.0.0.0-8080-4) init keymanager of type SunX509
2016-11-25 12:00:04,420 INFO  [STDOUT] (http-0.0.0.0-8080-4) ***
2016-11-25 12:00:04,421 INFO  [STDOUT] (http-0.0.0.0-8080-4) found key for : mykey
2016-11-25 12:00:04,432 INFO  [STDOUT] (http-0.0.0.0-8080-4) chain [0] = [
[
  Version: V3
  Subject: CN=xx.xxx.xxx.com, OU=xxxxxxxx, O=xxxx, L=xxxx, ST=xxx, C=xx
  Signature Algorithm: SHA1withRSA, OID = 1.2.840.113549.1.1.5

 Issuer: CN=abc AD Object CA1, DC=core, DC=dir, DC=def, DC=com

...

2016-11-25 12:00:05,520 INFO  [STDOUT] (http-0.0.0.0-8080-4) *** CertificateRequest
2016-11-25 12:00:05,521 INFO  [STDOUT] (http-0.0.0.0-8080-4) Cert Types:
2016-11-25 12:00:05,521 INFO  [STDOUT] (http-0.0.0.0-8080-4) RSA
2016-11-25 12:00:05,521 INFO  [STDOUT] (http-0.0.0.0-8080-4) Cert Authorities:
2016-11-25 12:00:05,521 INFO  [STDOUT] (http-0.0.0.0-8080-4) <CN=abc AD Object CA1, DC=core, DC=dir, DC=def, DC=com>
2016-11-25 12:00:05,521 INFO  [STDOUT] (http-0.0.0.0-8080-4) <CN=abc Policy CA1, O=gh Corporation Limited>
2016-11-25 12:00:05,522 INFO  [STDOUT] (http-0.0.0.0-8080-4) <CN=abc Root CA>

2016-11-25 09:32:39,475 INFO  [STDOUT] (http-0.0.0.0-8080-4) *** ServerHelloDone
2016-11-25 09:32:39,475 INFO  [STDOUT] (http-0.0.0.0-8080-4) *** Certificate chain
2016-11-25 09:32:39,475 INFO  [STDOUT] (http-0.0.0.0-8080-4) ***
2016-11-25 09:32:39,482 INFO  [STDOUT] (http-0.0.0.0-8080-4) *** ClientKeyExchange, RSA PreMasterSecret, TLSv1
2016-11-25 09:32:39,482 INFO  [STDOUT] (http-0.0.0.0-8080-4) http-0.0.0.0-8080-4, WRITE: TLSv1 Handshake, length = 269
2016-11-25 09:32:39,482 INFO  [STDOUT] (http-0.0.0.0-8080-4) SESSION KEYGEN:
2016-11-25 09:32:39,483 INFO  [STDOUT] (http-0.0.0.0-8080-4) PreMaster Secret:

问题

我在这里遗漏了什么吗?

【问题讨论】:

  • 我猜找不到与 CertificateRequest 中表达的约束匹配的证书。请注意,客户端发送的是一个空的CertificateChain
  • 是的,我注意到了。那是客户端发送证书的地方,现在它是空的。

标签: java ssl


【解决方案1】:

客户端证书应该在服务器问候完成后发送。

不,不是。仅应在以下情况下发送:

  • 服务器已请求它,并带有 CertificateRequest 消息
  • 客户端拥有由服务器指定的 CA 之一签署的证书
  • 客户端的证书与服务器指定的证书类型相匹配。

您的问题中没有证据表明所有这些条件都适用。

【讨论】:

  • 感谢您的信息,我已经用答案更新了我的问题。
【解决方案2】:

对于在使用 CXF (2.7.9) 时遇到相同问题的任何人,这是 CXF 引入的狗问题。

CXF 不获取由 VM 参数“-Djavax.net.ssl.keyStore”配置的密钥库,但有自己的解决方案。见http://cxf.apache.org/docs/client-http-transport-including-ssl-support.html#ClientHTTPTransport(includingSSLsupport)-ConfiguringSSLSupport

【讨论】:

    猜你喜欢
    • 2012-03-07
    • 2012-03-27
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    相关资源
    最近更新 更多