https上的Java web服务如何将自签名证书添加到客户端api中?
我有一个用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);
# 1 楼答案
服务器密钥存储确实包含服务器的自签名证书和私钥,服务器使用它对消息进行签名并将凭据返回给客户端
在客户端,您需要将服务器证书导入客户端信任存储(通常,您不希望在客户端信任存储中使用私钥,因此您提取一个独立的证书文件,即没有私钥,然后将服务器证书导入信任存储)
它不是密钥存储,而是信任存储,需要将证书添加到客户端信任存储,因为自签名证书不是由根CA签名的,默认情况下不受信任。所以你需要建立一个信任链
现在,您可以在客户机API的JAR中分发信任存储。在this thread中讨论了这种方法(最大的问题是,当服务器证书过期时,您必须重新分发JAR)。就我个人而言,我真的不喜欢这个解决方案
IMHO,如果您想跳过信任存储,最好的解决方案是从一个广为人知的证书供应商那里购买一个真正的证书,您已经在信任存储中拥有根CA证书(如Verisign、Thawte)
# 2 楼答案
我只想将证书添加到运行您的应用程序的JDK的cacerts文件中。如果你这样做了,那么你就不必做任何其他事情了。您上面的代码不是必需的。您可以通过运行类似于以下的命令将证书添加到密钥库: