如何知道服务器正在使用自签名证书

时间:2014-03-11 06:13:39

标签: java ssl https

我在java中编写通用HTTPS客户端。 URL和参数可以是运行时的任何内容,HTTPS客户端将连接并将返回响应。但问题是某些HTTPS网址是由自签名证书保护的。有没有办法确定该连接是自签名安全的,我可以在运行时为此类HTTPS连接设置信任库吗?

2 个答案:

答案 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>从根本上不安全,不应该在没有得到用户确认的情况下进行,就像浏览器那样。否则你会对中间人攻击持开放态度。

我不知道'自签名安全'是什么意思。这不安全。