是否可以为https禁用ssl?

时间:2019-05-22 13:14:25

标签: java ssl https okhttp

在Java上的应用程序。使用OkHttp版本2.7.5。向另一个服务发出请求,并且发生错误。

SSLHandshakeException: sun.security.validator.ValidatorException: 
PKIX path building failed: 
sun.security.provider.certpath.SunCertPathBuilderException: 
unable to find valid certification path to requested target

我没有证书。似乎有okHttp3版本的解决方案。但是版本不能更改。如何解决问题?

2 个答案:

答案 0 :(得分:1)

  

是否可以为https禁用ssl?

从字面上看,不是。

使用SSL是HTTPS协议的基础。如果您根本不想使用SSL,请为服务器配置一个HTTP端点,然后使用它代替HTTPS。

进一步使用SSL需要(至少)在语法上格式正确的证书。这也是HTTPS协议的基础。

现在,如果问题是您的服务器证书已过期,则可能的解决方案是使用以下方法:

如果问题是您无法获得服务器的适当证书(例如,您负担不起),那么另一种解决方案是:

  1. 生成self-signed certificate;参见How to generate a self-signed certificate using Java Keytool
  2. 将其安装在服务器端,
  3. 如上配置客户端以忽略证书有效性。

但是请注意,执行上述任一操作都存在安全问题。

第三种解决方案更安全。

  1. 生成自签名证书(如上所述)
  2. 将其安装在服务器端,
  3. 使用Keytool将证书作为受信任的证书添加到客户端应用程序的密钥库中。

答案 1 :(得分:0)

为什么要使用HTTPS但没有证书,您应该按照上面提到的Stephen进行操作。但是,如果您真的想忘记https的含义,则可以考虑覆盖此行为

 private static OkHttpClient getUnprotectedClient() {
    try {
        // Create a trust manager that does not validate certificate chains
        final TrustManager[] trustAllCerts = new TrustManager[]{
            new X509TrustManager() {
                @Override
                public void checkClientTrusted(java.security.cert.X509Certificate[] chain,
                                               String authType) throws CertificateException {
                }

                @Override
                public void checkServerTrusted(java.security.cert.X509Certificate[] chain,
                                               String authType) throws CertificateException {
                }

                @Override
                public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                    return new X509Certificate[0];
                }
            }
        };

        // Install the all-trusting trust manager
        final SSLContext sslContext = SSLContext.getInstance("SSL");
        sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
        // Create an ssl socket factory with our all-trusting manager
        final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();


        return new okhttp3.OkHttpClient.Builder()
                .sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0])
                .hostnameVerifier(new HostnameVerifier() {
                    @Override
                    public boolean verify(String hostname, SSLSession session) {
                        return true;
                    }
                }).build();

    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}