3

我有一个使用axis2 创建的“Hello World”Web 服务。我想编写一个客户端 api,它可以通过https自签名证书使用此服务。我有一个自签名证书myCertificate.cer和一个keystore包含它的证书。

这是我的客户端 API:

public class MyApi{

public Object callMyService(){

Axis2TestStub stub = new Axis2TestStub(
"https://localhost:8443/axis2/services/Axis2Test");

System.setProperty("javax.net.ssl.trustStore",
"src/main/resources/myKeystore.jks")
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

Hello request = new Hello();
request.setMot("World");
HelloResponse response = stub.hello(request);
Object mot = response.get_return();
return mot;

它有效,但我想使用myCertificate.cer而不是keystore包含它。有人知道该怎么做吗?我试图覆盖https协议但没有成功:

HttpSecureProtocol myHttpsProtocol = new HttpSecureProtocol();
myHttpsProtocol .setCheckHostname(false);
myHttpsProtocol .addTrustMaterial(new TrustMaterial("myCertificate.cer"));
Protocol customHttps = new Protocol("https", 
(ProtocolSocketFactory) myHttpsProtocol , 8443);
Protocol.registerProtocol("https", customHttps);
4

2 回答 2

3

我想编写一个客户端 api,它可以通过带有自签名证书的 https 使用此服务。我有一个自签名证书 myCertificate.cer 和一个包含它的密钥库。

服务器密钥存储确实包含服务器的自签名证书和私钥,服务器使用它来签署消息并将凭据返回给客户端。

在客户端,您需要将服务器证书导入客户端信任存储(通常,您不希望客户端信任存储中的私钥,因此您提取一个独立的证书文件,即没有私钥和然后将该服务器证书导入到信任库中)。

它有效,但我想使用 myCertificate.cer 而不是包含它的密钥库。

它不是密钥库,而是信任库,并且需要将证书添加到客户端信任库,因为自签名证书未由根 CA 签名,默认情况下不受信任。所以你需要创建一个信任链。

现在,您可以在客户端 API 的 JAR 中分发信任库。此线程中讨论了这种方法(最大的问题是您必须在服务器证书过期时重新分发 JAR)。就个人而言,我不太喜欢这种解决方案。

恕我直言,如果您想跳过信任库的内容,一个好的解决方案是从知名证书供应商处购买真正的证书,您已经在信任库中拥有根 CA 证书(如 Verisign、Thawte)。

于 2010-02-08T20:30:06.517 回答
2

我只是将证书添加到运行您的应用程序的 JDK 的 cacerts 文件中。如果你这样做了,那么你就不必做任何其他事情了。不需要您上面的代码。您可以通过运行类似于以下的命令将证书添加到密钥库:

C:/<jdk-version/bin/keytool -import -alias myalias -file mycert.crt -keystore C:/<jdk-version>/jre/lib/security/cacerts
于 2010-02-08T18:59:00.913 回答