我正在处理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相关的故障,或者我错过了什么?
任何帮助非常感谢。经过几天的计算,我在这里有点失落。
我将附加要求的任何相关输入。
谢谢。
其他信息:
答案 0 :(得分:0)
我明白了!
问题是,我正在使用自定义KeyManagerFactory根据SO上的其他问题选择证书(类似于http://vafer.org/blog/20061010073725/)。我认为一切都在测试环境中工作正常,因为默认的SSLContext是在我第一次使用自定义KeyManagerFactory时初始化的。
在生产方面,在我的应用程序初始化并插入所需的密钥之前,使用并初始化全局SSLContext(或类似的东西,对我的JAVA noobiness抱歉)。因此,即使我给SSLContext访问密钥对(如上所示,在日志中),它在握手期间也没有使用它。我现在可以通过首先调用其他应用程序来在测试环境中重现它。
为了解决这个问题,我还设置了-Djavax.net.keyStore参数来指向具有客户端密钥对的商店。所以strore现在用键正确初始化了。这种解决方法的缺点很明显:在tomcat上运行的每个其他应用程序现在都可以访问客户端证书密钥对。我想,我可以忍受。