未发送JavaSSL相互身份验证证书

时间:2013-11-22 08:39:14

标签: java web-services tomcat ssl client-certificates

我正在处理Tomcat中托管的Web应用程序。此应用程序使用需要客户端证书的SOAP WS(托管在IIS上)。我已经准备好了所有东西,但在生产环境中,握手不正确。

以下是javax.net.debug = ssl

的输出的相对部分

1)找到客户端证书和私钥

found key for : authentication service client company2
chain [0] = [
[
  Version: V3
  Subject: EMAILADDRESS=john.smith@EXAMPLE1.cz, CN=EXAMPLE1, OU=Web Service App, O=My Company, ST=Czech Republic, C=CZ
  Signature Algorithm: SHA1withRSA, OID = 1.2.840.113549.1.1.5

  Key:  Sun RSA public key, 2048 bits
  modulus: ...... 
  public exponent: 65537
  Validity: [From: Mon Nov 04 17:55:55 CET 2013,
               To: Sun Nov 04 17:55:55 CET 2018]
  Issuer: EMAILADDRESS=peter.smith@EXAMPLE2.cz, CN=CA, OU=Web Service App, O=My Company, L=Prague, ST=Czech Republic, C=CZ
  SerialNumber: [ ...... ]

Certificate Extensions: 4
[1]: ObjectId: 2.16.840.1.113730.1.13 Criticality=false
Extension unknown: DER encoded OCTET string = ...... 


[2]: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [ ..... ]
]

[3]: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
[EMAILADDRESS=peter.smith@EXAMPLE2.cz, CN=CA, OU=Web Service App, O=My Company, L=Prague, ST=Czech Republic, C=CZ]
SerialNumber: [ .... ]
]

[4]: ObjectId: 2.5.29.19 Criticality=false
BasicConstraints:[
  CA:false
  PathLen: undefined
]

]
  Algorithm: [SHA1withRSA]
  Signature: .......

]

2)Truststore init

trustStore is: ......
trustStore type is : jks
trustStore provider is : 
init truststore
...
adding as trusted cert:
  Subject: EMAILADDRESS=peter.smith@EXAMPLE2.cz, CN=CA, OU=Web Service App, O=My Company, L=Prague, ST=Czech Republic, C=CZ
  Issuer:  EMAILADDRESS=peter.smith@EXAMPLE2.cz, CN=CA, OU=Web Service App, O=My Company, L=Prague, ST=Czech Republic, C=CZ
  Algorithm: RSA; Serial number: 0x......
  Valid from Mon Nov 04 15:35:23 CET 2013 until Sat Nov 04 15:35:23 CET 2023
...

3)在WS服务器端点找到可信证书

Found trusted certificate:
[
[
  Version: V3
  Subject: CN=Thawte SSL CA, O="Thawte, Inc.", C=US
  Signature Algorithm: SHA1withRSA, OID = 1.2.840.113549.1.1.5

  Key:  Sun RSA public key, 2048 bits
  modulus: .....
  public exponent: 65537
  Validity: [From: Mon Feb 08 01:00:00 CET 2010,
               To: Sat Feb 08 00:59:59 CET 2020]
  Issuer: CN=thawte Primary Root CA, OU="(c) 2006 thawte, Inc. - For authorized use only", OU=Certification Services Division, O="thawte, Inc.", C=US
  SerialNumber: [ ..... ]

4)服务器要求客户端证书

CertificateRequest
Cert Types: RSA, DSS, ECDSA
Cert Authorities:
...
<EMAILADDRESS=peter.smith@EXAMPLE2.cz, CN=CA, OU=Web Service App, O=My Company, L=Prague, ST=Czech Republic, C=CZ> 

5)客户提供NOTHING: - (

ServerHelloDone
Certificate chain

ClientKeyExchange, RSA PreMasterSecret, TLSv1
...  

整个事情最终由WS服务器上的http 403结束(不提供客户端证书的正确行为),没有关于握手的例外。客户端是wsimport生成的javax.xml.ws.Service。

最让我困惑的是,在开发/测试环境中完全相同的证书传递正确(使用完全相同的trustore和WS客户端)。所以客户端应用程序和证书似乎工作正常。

也许在其他环境中存在一些与java相关的故障,或者我错过了什么?

任何帮助非常感谢。经过几天的计算,我在这里有点失落。

我将附加要求的任何相关输入。

谢谢。

其他信息:

  • 尝试通过浏览器访问webservice导致证书 选择对话框。选择后(使用正确的证书),显示标准页面“当前禁用此服务的元数据发布”

1 个答案:

答案 0 :(得分:0)

我明白了!

问题是,我正在使用自定义KeyManagerFactory根据SO上的其他问题选择证书(类似于http://vafer.org/blog/20061010073725/)。我认为一切都在测试环境中工作正常,因为默认的SSLContext是在我第一次使用自定义KeyManagerFactory时初始化的。

在生产方面,在我的应用程序初始化并插入所需的密钥之前,使用并初始化全局SSLContext(或类似的东西,对我的JAVA noobiness抱歉)。因此,即使我给SSLContext访问密钥对(如上所示,在日志中),它在握手期间也没有使用它。我现在可以通过首先调用其他应用程序来在测试环境中重现它。

为了解决这个问题,我还设置了-Djavax.net.keyStore参数来指向具有客户端密钥对的商店。所以strore现在用键正确初始化了。这种解决方法的缺点很明显:在tomcat上运行的每个其他应用程序现在都可以访问客户端证书密钥对。我想,我可以忍受。