未发送JavaSSL相互身份验证证书
我正在开发Tomcat中托管的web应用程序。此应用程序使用需要客户端证书的SOAP WS(托管在IIS上)。我已经准备好了所有的东西,但是在生产环境中,握手并不正确 下面是javax.net.debug=ssl输出的相关部分 1) 找到客户端证书和私钥未发送JavaSSL相互身份验证证书,java,web-services,tomcat,ssl,client-certificates,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@EX
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 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-server终结点上找到受信任的证书
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>
整个过程以WS-server上的http 403结束(不提供客户机证书的正确行为),没有关于握手的异常。客户端是由wsimport生成的javax.xml.ws.Service
最让我困惑的是,在开发/测试环境中,完全相同的证书通过得很好(使用完全相同的trustore和WS-client)。因此,客户端应用程序和证书似乎工作正常
也许其他环境中存在一些与java相关的故障,或者我遗漏了什么
非常感谢您的帮助。经过几天的思考,我在这里有点迷路了
我将附加任何相关的输入,将被要求
多谢各位
其他信息:
- 试图通过浏览器访问Web服务导致证书 选择对话框。选择后(使用正确的证书),将显示标准页面“此服务的元数据发布当前已禁用”
- 我想出来了
问题是,我使用CustomKeyManagerFactory根据此处的其他问题选择证书(类似于)。我认为在测试环境中一切都可以正常工作,因为默认的SSLContext是在我将其与自定义KeyManagerFactory一起使用时第一次初始化的
在生产tho上,在我的应用程序可以初始化全局SSLContext并插入所需的密钥之前,会使用并初始化全局SSLContext(或类似的东西,对不起我的JAVA noobiness)。因此,即使我让SSLContext访问密钥对(如上所示,在日志中),它在握手时也没有使用它。现在,我只需首先调用其他应用程序,就可以在testenv上重现这一点
为了解决这个问题,我还将-Djavax.net.keyStore参数设置为指向具有客户端密钥对的存储。因此,strore现在已使用键正确初始化。这种解决方法的缺点很明显:在tomcat上运行的所有其他应用程序现在都可以访问客户端证书密钥对。我想我可以接受。如果将证书导入浏览器,然后手动点击WS-server端点,会发生什么?浏览器是否提示您输入客户端证书?是的。选择证书后,我可以看到“元数据发布信息已禁用”页面。谢谢你的评论。
ServerHelloDone
Certificate chain
ClientKeyExchange, RSA PreMasterSecret, TLSv1
...