从Java连接到HTTPS服务器并忽略安全证书的有效性

从Java连接到HTTPS服务器并忽略安全证书的有效性,java,security,ssl,https,Java,Security,Ssl,Https,我一直在测试一个系统,该系统使用不同的密钥访问一组https服务器,其中一些密钥无效,并且所有密钥都不在JVM的本地密钥存储中。我只是在测试,所以我不关心这个阶段的安全性。有没有一种好方法可以对服务器进行POST调用并告诉Java不要担心安全证书 我的google搜索结果提供了一些代码示例,这些示例使一个类能够执行验证,但我无法让它连接到任何服务器。您需要创建一个X509TrustManager,它可以绕过所有安全检查。你可以在我对这个问题的回答中找到一个例子 根据评论: 用谷歌搜索的例子,你指

我一直在测试一个系统,该系统使用不同的密钥访问一组https服务器,其中一些密钥无效,并且所有密钥都不在JVM的本地密钥存储中。我只是在测试,所以我不关心这个阶段的安全性。有没有一种好方法可以对服务器进行POST调用并告诉Java不要担心安全证书


我的google搜索结果提供了一些代码示例,这些示例使一个类能够执行验证,但我无法让它连接到任何服务器。

您需要创建一个X509TrustManager,它可以绕过所有安全检查。你可以在我对这个问题的回答中找到一个例子

根据评论:

用谷歌搜索的例子,你指的是其他例子吗


更新:链接断开,下面是我保存的相关摘要:


在类文件中添加以下静态方法代码

静止的{

    // Create a trust manager that does not validate certificate chains

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

            public void checkClientTrusted(X509Certificate[] certs, String authType) {
            }

            public void checkServerTrusted(X509Certificate[] certs, String authType) {
            }
        }
        };

        // Install the all-trusting trust manager
        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, trustAllCerts, new java.security.SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

        // Create all-trusting host name verifier
        HostnameVerifier allHostsValid = new HostnameVerifier() {
            public boolean verify(String hostname, SSLSession session) {
                return true;
            }
        };

        // Install the all-trusting host verifier
        HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
    } catch (Exception err ){
        log.debug(err.getMessage());;
    }
}

感谢BalusC,它工作得很好。我尝试了3或4个编译并运行良好但不起作用。你能回答这个问题吗?完成了。但将来请在问题中提到你在链接中尝试了哪些示例:),然后你需要扔掉它。编写安全代码,然后在一个不安全的环境中测试它是没有意义的重新设置。解决问题。如果你不想安全,不要使用SSL。想到这个东西已经投入生产多少次,我会发抖。@Daniel,那么你的生产系统是不安全的。你需要阅读RFC2246中关于这一点的评论。这是一个非常严重的问题。@Bevor:对。我更新了答案。是的。顺便说一句,有一种方法可以改变默认值在不修改应用程序的情况下,通过命令行访问SSL工厂:
    // Create a trust manager that does not validate certificate chains

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

            public void checkClientTrusted(X509Certificate[] certs, String authType) {
            }

            public void checkServerTrusted(X509Certificate[] certs, String authType) {
            }
        }
        };

        // Install the all-trusting trust manager
        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, trustAllCerts, new java.security.SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

        // Create all-trusting host name verifier
        HostnameVerifier allHostsValid = new HostnameVerifier() {
            public boolean verify(String hostname, SSLSession session) {
                return true;
            }
        };

        // Install the all-trusting host verifier
        HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
    } catch (Exception err ){
        log.debug(err.getMessage());;
    }
}