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