在使用tomcat的SSL握手过程中ServerHelloDone之后没有“匹配别名”

问题描述:

我正面临着SSL握手的一个问题,当我在tomcat上托管应用程序时,客户端不提供客户端证书,但相同的代码在独立的java应用程序上正常工作。我认为这可能是Tomcat没有正确加载密钥库的问题,所以我按照https://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html#Configuration创建了密钥库,然后添加-Djavax.net.ssl.trustStore =“C:\ Users \ xyz.keystore” -Djavax.net .ssl.trustStorePassword =“changeit”但这并不能解决问题。不知道我在这里错过了什么。在使用tomcat的SSL握手过程中ServerHelloDone之后没有“匹配别名”

施药代码:

SSLContext ctx = null; 
SSLSocketFactory socketFactory = null; 
     KeyManagerFactory kmf; 
KeyStore ks; 
char[] passphrase = "abcd".toCharArray(); 

ctx = SSLContext.getInstance("TLS"); 
kmf = KeyManagerFactory.getInstance("SunX509"); 
ks = KeyStore.getInstance("JKS"); 

ks.load(new FileInputStream("C:/goahead.jks"), passphrase); 

kmf.init(ks, passphrase); 

ctx.init(kmf.getKeyManagers(), null, null); 

socketFactory = ctx.getSocketFactory(); 
String endpoint = "https://myurl/goahead"; 
BindingProvider bindingProvider = (BindingProvider) goSOAP; //goSOAP is derived from wsdl soap class 
bindingProvider.getRequestContext() 
.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpoint); 
bindingProvider.getRequestContext() 
.put("com.sun.xml.internal.ws.transport.https.client.SSLSocketFactory", socketFactory); 

为了比较两者的日志我加了调试日志SSL握手,我看到的唯一区别是如下: Tomcat应用表明:

Accept: application/soap+xml, multipart/related 
Content-Type: application/soap+xml; charset=utf-8;action="/Address" 
User-Agent: JAX-WS RI 2.2.10 svn-revision#919b322c92f13ad085a933e8dd6dd35d4947364b 

其中作为独立应用程序显示

Accept: [application/soap+xml, multipart/related] 
Content-Type: [application/soap+xml; charset=utf-8;action="/Address"] 
User-Agent: [JAX-WS RI 2.2.4-b01] 

而且临近年底独立的应用程序具有基于

*** ServerHelloDone 
matching alias: goaheaduat 
*** Certificate chain 

Tomcat应用程序没有匹配的别名:

客户证书没有被提交到服务器进行身份验证。

***我的证书链。 发现键:goaheaduat 链[0] = [ [ 版本:V3 主题:CN = WebKYCTest.servicepartnerconsumer.com,OU = ISS-3PTY,O = JabongS 签名算法:SHA256withRSA,OID = 1.3.340.314509 .9.0.32

重点:孙RSA公共密钥,2048位 模量:275738191479462130432161081938716544079220291818654230702403883900822032392032764845339983991419373383667127975836064368746692711361843274046781724718005537256619298828627117831479919800077840942286042579877044123770102209420712925254888076222457868480326030652107674237105960791191759860389586794859851739141834009862327049526841942916917717471003480117796063344791549027575880183573641396237230657564915067671489943 46890208737770932855458704848837399114296416887151154418561578978073777312232789403716198956145390511813892730740350579365196627658126157277478693917625969224935645208986859585794507961203141704075579 公开指数:65537 有效性:[来源:星期二05月03日15时03分50秒EDT 2016年, 为:周一04月22日15点33分49秒EDT 2019] 发行人:CN =委托证书颁发机构 - L1K,OU = “(c)2012 Entrust,Inc. - 仅限授权使用”,OU =请参阅www.entrust.net/legal-terms,O =“Entrust,Inc.”,C = US 的SerialNumber:[1051555d 65348b53 00000000 50d7ff44]

***的ClientHello,使用TLSv1 RandomCookie:GMT:1451756012个字节= {109,25,125,234,72,78,180,84,205 ,146,231,249,138,99,17,184,171,146,144,41,1,15,203,209,38,255,236,148} 会话ID:{} 密码套件:[ TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA,TLS_ECDH_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_DSS_WITH_AES_128_CBC_SHA,TLS_ECDHE_ECDSA_WITH_RC4_128_SHA,TLS_ECDHE_RSA_WITH_RC4_128_SHA,SSL_RSA_WITH_RC4_128_SHA,TLS_ECDH_ECDSA_WITH_RC4_128_SHA,TLS_ECDH_RSA_WITH_RC4_128_SHA,TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA,TLS_ECDHE_RSA_WITH_3DES_ED E_CBC_SHA,SSL_RSA_WITH_3DES_EDE_CBC_SHA,TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA,TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA,SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA,SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA,SSL_RSA_WITH_RC4_128_MD5,TLS_EMPTY_RENEGOTIATION_INFO_SCSV] 压缩方法:{0} 扩展elliptic_curves,曲线名称:{secp256r1,sect163k1,sect163r2,secp192r1,secp224r1,sect233k1,sect233r1,sect283k1,sect283r1,secp384r1 ,sect409k1,sect409r1,secp521r1,sect571k1,sect571r1,secp160k1,secp160r1,secp160r2,sect163r1,secp192k1,sect193r1,sect193r2,secp224k1,sect239k1,secp256k1} 扩展ec_point_formats,格式:[非压缩]


找到的关键:goaheaduat 链[0] = [ [ 版本:V3 主题:CN = WebKYCTest.servicepartnerconsumer.com,OU = ISS-3PTY,O = JabongS 签名算法:SHA256withRSA,OID = 1.3.340.314509.9.0.32

重点:孙RSA公共密钥,2048位 模量:27573819147946213043216108193871654407922029181865423070240388390082203239203276484533998399141937338366712797583606436874669271136184327404678172471800553725661929882862711783147991980007784094228604257987704412377010220942071292525488807622245786848032603065210767423710596079119175986038958679485985173914183400986232704952684194291691771747100348011779606334479154902757588018357364139623723065756491506767148994346890208737770932855458704848837399114296416887151154418561578978073777312232789 403716198956145390511813892730740350579365196627658126157277478693917625969224935645208986859585794507961203141704075579 公开指数:65537 有效性:[来源:星期二05月03日15点03分50秒EDT 2016年, 为:周一04月22日15时33分49秒EDT 2019] 发行人:CN =委托证书颁发机构 - L1K,OU = “(c)2012 Entrust,Inc. - 仅限授权使用”,OU =请参阅www.entrust.net/legal-terms,O =“Entrust,Inc.”,C = US 序列号:[1051555d 65348b53 00000000 50d7ff44]

服务器名,服务器名:[HOST_NAME:it-internalservicepartner.jabong-dns.com]


http-bio-127.0.0.1-80-exec-1,WRITE:TLSv1 Handshake,length = 199 http-bio-127.0.0。1-80-exec-1,READ:TLSv1握手,长度= 16384 *** ServerHello,TLSv1 RandomCookie:GMT:1451756012 bytes = {33,109,178,249,102,30,1,105, 42,88,10,247,104,93,45,166,230,141,49,180,154,198,251,76,170,162,49}会话ID:{87,136,10,236, ,32,220,206,169,30,219,131,106,24,37,117,192,116,56,195,254,29,197,185,155,141,192,95,152,23 ,143,14,114} 密码套件:TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA 压缩方法:0 扩展renegotiation_info,renegotiated_connection:


%%初始化:[会话-17,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA ] ** TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA ***证书链

* ECDH ServerKeyExchange 服务器密钥:孙EC公共密钥,256位 公共X坐标:68950688134319531882901065943858827597037420392341729344093733189994857259424 公共Ÿ坐标:103565436179130252254673183632021691038591576368603542556238032190750005197048个 参数:secp256r1 [NIST P- 256,X9.62 prime256v1](1.2.840.10045.3.1.7) http-bio-127.0.0.1-80-exec-1,READ:TLSv1 Handshake,length = 1760 * CertificateRequest Cert Types:RSA,DSS ,ECDSA 名证书颁发机构: *** ServerHelloDone

+0

必须有另一个不同之处。比较'CertificateRequest'消息。 – EJP

+0

@EJP随机Cookie和会话ID不同。所有的证书链,serverhello在两种情况下都是相同的。这是与tomcat配置有关的地方,其中tomcat使用它自己的一组密钥库/信任库? – Ashish

+0

我没有提到cookies或会话ID。当然他们是不同的。请发布CertificateRequest。 – EJP

服务器有信任,这里面信任是客户端的公证书。只有当信任库内的客户端的公共证书没有颁发者时,或者至少有一个颁发者在信任库内时,它才与别名相匹配。

查看源代码在https://github.com/openjdk-mirror/jdk7u-jdk/blob/master/src/share/classes/sun/security/ssl/SunX509KeyManagerImpl.java#L374

 if (issuers.length == 0) { 
      // no issuer specified, match all 
      aliases.add(alias); <--- this is important 
      if (debug != null && Debug.isOn("keymanager")) { 
       System.out.println("matching alias: " + alias); 
      }