2014-02-10 39 views
1

我有以下情形:两个Java应用程序在同一Tomcat服务器上运行 - 我们姑且称之为应用程序A和应用B - 他们需要跟每个其他通过已经启动并运行在App A上的web服务。此webservice只接受已认证的客户端(clientAuth =“true”)。同一Tomcat服务器上的两个应用程序之间的双向SSL

毕竟被配置,我的Tomcat,作为客户端,发送一个空证书链到服务器(其是在同一Tomcat)。这是我所做的。

keytool -genkeypair -keyalg RSA -keysize 2048 -keystore keystore.jks -alias server 

然后导出该证书:

keytool -exportcert -keystore keystore.jsk -alias server -file server.crt 

并把它添加到信任:

keytool -importcert -keystore truststore.jsk -alias server -file server.crt 

我使用密钥工具生成的服务器使用自签名证书SSL协商如下:

  1. 客户打招呼
  2. 服务器打招呼,并提供其证书(以上生成)为 客户
  3. 客户接受它(因为它是在信任)
  4. 服务器通过提供的名单,需要客户端证书有效的DNS(包含单个条目,上面生成的证书)
  5. 客户端不知何故决定它不具有有效证书,并发送一个空的证书链
  6. SSL握手失败

我没有张贴实际的SSL日志,因为客户端和服务器都是一样的Tomcat,所以一切都是混在一起的混乱。

我做了什么错在这里?请记住,这两个应用程序位于同一台服务器上,且证书是自签名的。我还做了一个测试,在其中生成了另一个自签名证书,将其导出到.p12文件并将其安装到浏览器中,然后通过URL直接将该web服务调用到地址框中,其工作完美无瑕。

谢谢!

+0

问题不在于关键字,而在于如何初始化App B使用的HTTPS连接/ Web服务客户端。 – Robert

+0

@Robert我使用wsimport命令生成的存根使用WSDL URL(以“ https“并使用端口8443,正确配置)。在我的代码中,我使用这个:'MyWebService service = new MyWebService(url); IMyWebService client = service.getMyWebServicePort(); client.myMethod(...);'这个类MyWebService扩展了javax.xml.ws.Service。 – Khand

回答

0

对于任何人来到这里的记录...

我能够以两种方式做到这一点。一个是为我的客户端应用程序准备一个名为cxf.xml的特殊配置文件,如in this link所解释的。另一种是使用代码强制配置的加载,如下所示:

@WebEndpoint(name = "MyWebServicePort") 
public IMyWebService getMyWebServicePort() { 
    IMyWebService port = super.getPort(new QName("http://my.namespace/", "MyWebServicePort"), IMyWebService.class); 
    try { 
     // loads keymanager 
     File keyStoreFile = new File(System.getProperty("javax.net.ssl.keyStore")); 
     String keyStorePass = System.getProperty("javax.net.ssl.keyStorePassword"); 

     KeyStore keyStore = KeyStore.getInstance("JKS"); 
     keyStore.load(new FileInputStream(keyStoreFile), keyStorePass.toCharArray()); 

     KeyManagerFactory keyFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
     keyFactory.init(keyStore, keyStorePass.toCharArray()); 

     KeyManager[] km = keyFactory.getKeyManagers(); 


     // loads trustmanager 
     File trustStoreFile = new File(System.getProperty("javax.net.ssl.trustStore")); 
     String trustStorePass = System.getProperty("javax.net.ssl.trustStorePassword"); 

     KeyStore trustStore = KeyStore.getInstance("JKS"); 
     trustStore.load(new FileInputStream(trustStoreFile), trustStorePass.toCharArray()); 

     TrustManagerFactory trustFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
     trustFactory.init(trustStore); 

     TrustManager[] tm = trustFactory.getTrustManagers(); 

     // configuring the connection 
     Client cxfClient = ClientProxy.getClient(port); 
     HTTPConduit httpConduit = (HTTPConduit) cxfClient.getConduit(); 

     TLSClientParameters tlsParams = httpConduit.getTlsClientParameters(); 
     if (tlsParams == null) { 
      tlsParams = new TLSClientParameters(); 
     } 
     tlsParams.setKeyManagers(km); 
     tlsParams.setTrustManagers(tm); 

     httpConduit.setTlsClientParameters(tlsParams); 
    } catch (Exception e) { 
     ... 
    } 

    return port; 
} 

我真的不知道为什么没有加载默认配置(与JVM PARAMS)。这是一个神秘的问题:调试,我发现在构建SSL连接时,它实际上使用了DummyX509KeyManager,这意味着配置未加载。可能是一个错误?我不知道。

相关问题