Java 具有客户端Axis2存根的truststore专用密钥库

Java 具有客户端Axis2存根的truststore专用密钥库,java,axis2,Java,Axis2,我需要调用使用客户端证书的Web服务。 该程序将由不同的客户端使用,每个客户端都有自己的证书。 客户端证书用于身份验证,因此客户端只能看到自己的数据。 因此,对该Web服务的每次调用都必须使用其特定的密钥库 Axis2用于生成客户端代码。 我发现这段代码用于将SocketFactory设置为存根的特定实例 int x = 9443; Protocol authProtocol; authProtocol = new Protocol("https",

我需要调用使用客户端证书的Web服务。 该程序将由不同的客户端使用,每个客户端都有自己的证书。 客户端证书用于身份验证,因此客户端只能看到自己的数据。 因此,对该Web服务的每次调用都必须使用其特定的密钥库

Axis2用于生成客户端代码。 我发现这段代码用于将SocketFactory设置为存根的特定实例

int x = 9443;
Protocol authProtocol;
authProtocol = 
      new Protocol("https",
                   setPrivateKey(keyStoreFileName,keyStoreType, keyStorePassword),
                   x
                  );
stub._getServiceClient().getOptions().setProperty(HTTPConstants.CUSTOM_PROTOCOL_HANDLER, authProtocol);
然后袜子工厂就会被关闭

private static SSLSocketFactory setPrivateKey
  (String keyStoreFileName,
   String keyStoreType,
   String keyStorePassword
  ) 
  throws FileNotFoundException, 
         KeyStoreException, 
         IOException, 
         NoSuchAlgorithmException, 
         CertificateException, 
         UnrecoverableKeyException, 
         KeyManagementException
  {
    // Load the key store: change store type if needed
    KeyStore ks = KeyStore.getInstance(keyStoreType);
    FileInputStream fis = new FileInputStream(keyStoreFileName);
    try {
        ks.load(fis, keyStorePassword.toCharArray());
    } finally {
        if (fis != null) { fis.close(); }
    }
    // Get the default Key Manager
    KeyManagerFactory kmf = KeyManagerFactory.getInstance(
       KeyManagerFactory.getDefaultAlgorithm());   
    kmf.init(ks, keyStorePassword.toCharArray());
     X509KeyManager origKm = (X509KeyManager)kmf.getKeyManagers()[0];
    SSLContext sslContext = SSLContext.getInstance("TLS");
    sslContext.init(new KeyManager[] {origKm }, null, null);

    return sslContext.getSocketFactory();
}
使用以下导入

import com.sun.net.ssl.KeyManager;
import com.sun.net.ssl.SSLContext;
import com.sun.net.ssl.X509KeyManager;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;

import javax.net.SocketFactory;
import javax.net.ssl.KeyManagerFactory;

import javax.net.ssl.SSLSocketFactory;

import org.apache.axis2.transport.http.HTTPConstants;
import org.apache.commons.httpclient.protocol.Protocol;
import org.apache.commons.httpclient.protocol.ProtocolSocketFactory;
import org.apache.xmlbeans.XmlException;
我得到的消息是X509KeyManager和SSLContext已被弃用。 甚至是来自此的代码 (我在有关该主题的官方AXIS2文档中发现)使用了此不推荐使用的代码。 其次,该代码使用SSLSocketFactory,而协议需要ProtocolSocketFactory

X509KeyManager和SSLContext的替代品是什么? 如何从密钥库到ProtocolSocketFactory? 还是有更好的办法

使用AXIS2 1.6.2 爪哇5 工具jdeveloper 10.1.3

编辑日期:22-01-2013 正在调用的Web服务属于不同的组织,我无法控制Web服务的服务器端

“不同客户使用的”是我们软件的不同用户。位于1个中心点的

我假设“由不同的客户端使用”意味着不同的部署。在这种情况下,是否真的需要以编程方式选择正确的密钥库?是否可以使用多个不同的密钥库(每个密钥库用于一个客户机)并让应用程序服务器/servlet容器处理客户机证书? 例如,对于Apache Tomcat,在启动服务器之前,可以通过设置
CATALINA_OPTS=“$CATALINA_OPTS-Djavax.net.ssl.keystore=“
”来实现。然后,您可以像往常一样在未经授权的情况下为简单的http web服务创建客户端WS。Tomcat使用证书以完全透明的方式处理与客户端身份验证的SSL连接。

该博客在标题“方法2”下给出了问题的答案:

“Apache commons提供了一种工具,允许我们自定义负责创建安全套接字的SSL套接字工厂。所谓自定义,我指的是在SSL握手中使用用户信任库/密钥库的能力。要实现这一点,我们需要扩展SecureProtocolSocketFactory接口。在我们的自定义套接字工厂实现中,用户参考其密钥库针对默认密钥存储的e/Truststore。 Apache commons为此提供了一个名为AuthSSLProtocolSocketFactory的参考实现类

此类将Truststore/Keystore作为构造函数的参数,该构造函数将在稍后启动SSLContext时引用。SSLContext用于创建SSL套接字工厂。 在axis2客户端代码中,需要添加以下内容: 协议authhttps=新协议(“https”,新AuthSSLProtocolSocketFactory(新url(“密钥库url”),“pwd”,新url(“信任库url”),“pwd”),443)


在以存根开头的行中使用authhttps对象。\u getServiceClient().getOptions().setProperty(HTTPConsta…

web服务属于不同的组织。因此,我无法控制web服务的服务器端。对于客户端,我指的是位于一个中心点的软件的不同用户。我描述的方法适用于web服务客户端,无需更改web服务的服务器端。但是在ca中您提到的,您似乎需要使用rampart()。这里可以找到一个示例:truststore是使用“javax.net.ssl.keystore”环境变量指定的。