Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
未发送JavaSSL相互身份验证证书_Java_Web Services_Tomcat_Ssl_Client Certificates - Fatal编程技术网

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

未发送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

我正在开发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 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
      ...