X509TrustManager重写而不允许所有证书通过?

8

我目前正在覆盖X509TrustManager以允许所有证书作为临时“解决方案”(这是不安全的)。 我正在尝试弄清楚如何添加使其接受只有一个特定的证书,直到可以完成正确的修复(目前超出我的控制范围)。 这里是当前代码。

TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
    @Override
    public java.security.cert.X509Certificate[] getAcceptedIssuers() {
        return null;
    }

    @Override
    public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {
    }

    @Override
    public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {
    }
}};

try {
    SSLContext sc = SSLContext.getInstance("SSL");
    sc.init(null, trustAllCerts, new java.security.SecureRandom());
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (GeneralSecurityException e) {
    System.out.println(e.getStackTrace());
}

为什么要返回null而不是一个空数组?规范要求返回非空数组。 - Jayen
2个回答

7

你只需要从getAcceptedIssuers返回证书。请参见这里

 InputStream inStream = new FileInputStream("fileName-of-cert");
 CertificateFactory cf = CertificateFactory.getInstance("X.509");
 X509Certificate cert = (X509Certificate)cf.generateCertificate(inStream);
 inStream.close();

然后在方法中以数组形式返回。

我能够从连接的URL返回收到的证书吗?目前,当我访问另一个服务器上的另一个URL时,我只会遇到证书错误。 - user1015523
我所做的是使用浏览器通过浏览器从该网站下载证书(当您看到错误时,每个主要浏览器都应该有一个选项将其保存到磁盘),然后按照StephenC所说的要么将其添加到密钥库中,要么使用上面的代码从文件中读取。上面的解决方案可能会稍微少些麻烦(尽管不太灵活),因为如果我没记错的话,生成密钥库可能有点费劲。 - dfb
1
如果openssl可用,则可以在命令行上下载证书链: openssl s_client -host www.webservicehost.com -port 443 -showcerts > output_certificate.crt - IcedDante

0

一个可能的解决方法是将有问题的证书暂时添加到JVM密钥库中,作为受信任的证书。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接