我在java中编写通用HTTPS客户端。 URL和参数可以是运行时的任何内容,HTTPS客户端将连接并将返回响应。但问题是某些HTTPS网址是由自签名证书保护的。有没有办法确定该连接是自签名安全的,我可以在运行时为此类HTTPS连接设置信任库吗?
答案 0 :(得分:1)
如果在自签名时绕过安全检查“ok”,则可以绕过安全性,因为无论如何,非自签名可能会被可信方签名。创建一个信任所有经理:
public static X509TrustManager createTrustAllManager() {
return new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
// do nothing
}
@Override
public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
// do nothing
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
};
}
如果您真的不想这样做,您实际上可以创建连接,从握手中检索证书,将其添加到信任库并再次连接。
设置以下“保存”信任管理器,以便您检索使用的证书:
public static class SavingTrustManager implements X509TrustManager {
private X509TrustManager parent;
private X509Certificate[] chain;
public SavingTrustManager(X509TrustManager parent) {
this.parent = parent;
}
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
parent.checkClientTrusted(chain, authType);
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
this.chain = chain;
parent.checkServerTrusted(chain, authType);
}
public X509Certificate[] getChain() {
return chain;
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return parent.getAcceptedIssuers();
}
}
答案 1 :(得分:0)
有没有办法确定该连接是自签名安全的,我可以在运行时为此类HTTPS连接设置信任库吗?
你有这个回到前面。除非您在连接之前将信任库设置为包含自签名证书,否则您将无法获得连接,因此您无法检查证书是否为自签名。
在代码方面有一个解决方案允许连接继续,并允许您接受证书并将其存储在信任存储区中,但您需要了解此过程是< em>从根本上不安全,不应该在没有得到用户确认的情况下进行,就像浏览器那样。否则你会对中间人攻击持开放态度。
我不知道'自签名安全'是什么意思。这不安全。