- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个使用 axis2 创建的“Hello World”网络服务。我想编写一个客户端 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
协议(protocol)但没有成功:
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);
最佳答案
I would like to write a client api which could use this service over https with a self-signed certificate. I have a self-signed certificate myCertificate.cer and a keystore containing it.
服务器 keystore 确实包含服务器的自签名证书和私钥,服务器使用它来签署消息并将凭据返回给客户端。
在客户端,您需要将服务器证书导入客户端信任库(通常,您不希望客户端信任库中有私钥,因此您提取了一个 stand -单独的证书文件,即没有私钥,然后您将该服务器证书导入信任库。
It works but I would like to use myCertificate.cer and not a keystore containing it.
它不是 keystore ,而是信任库,并且需要将证书添加到客户端信任库,因为自签名证书不是由根 CA 签名的,默认情况下不受信任。所以你需要创建一个信任链。
现在,您可以在客户端 API 的 JAR 中分发信任库。 this thread 中讨论了这种方法(最大的问题是您必须在服务器证书过期时重新分发 JAR)。就个人而言,我不太喜欢这种解决方案。
恕我直言,如果您想跳过信任存储区的东西,那么好的解决方案是从广为人知的证书供应商处购买真正的证书,您已经在信任库中拥有根 CA 证书(例如 Verisign、Thawte)。
关于通过 https 的 Java Web 服务 - 如何将自签名证书添加到客户端 api 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2224030/
我是一名优秀的程序员,十分优秀!