138

我有一个 Java Web 服务客户端,它通过 HTTPS 使用 Web 服务。

import javax.xml.ws.Service;

@WebServiceClient(name = "ISomeService", targetNamespace = "http://tempuri.org/", wsdlLocation = "...")
public class ISomeService
    extends Service
{

    public ISomeService() {
        super(__getWsdlLocation(), ISOMESERVICE_QNAME);
    }

当我连接到服务 URL ( https://AAA.BBB.CCC.DDD:9443/ISomeService) 时,我得到了异常java.security.cert.CertificateException: No subject alternative names present

为了修复它,我首先运行openssl s_client -showcerts -connect AAA.BBB.CCC.DDD:9443 > certs.txt并在文件中获取以下内容certs.txt

CONNECTED(00000003)
---
Certificate chain
 0 s:/CN=someSubdomain.someorganisation.com
   i:/CN=someSubdomain.someorganisation.com
-----BEGIN CERTIFICATE-----
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-----END CERTIFICATE-----
---
Server certificate
subject=/CN=someSubdomain.someorganisation.com
issuer=/CN=someSubdomain.someorganisation.com
---
No client certificate CA names sent
---
SSL handshake has read 489 bytes and written 236 bytes
---
New, TLSv1/SSLv3, Cipher is RC4-MD5
Server public key is 512 bit
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : RC4-MD5            
    Session-ID: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    Session-ID-ctx:                 
    Master-Key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    Key-Arg   : None
    Start Time: 1382521838
    Timeout   : 300 (sec)
    Verify return code: 21 (unable to verify the first certificate)
---

AFAIK,现在我需要

  1. 提取和certs.txt之间的部分,-----BEGIN CERTIFICATE----------END CERTIFICATE-----
  2. 修改它,使证书名称等于AAA.BBB.CCC.DDD
  3. keytool -importcert -file fileWithModifiedCertificate然后使用(其中fileWithModifiedCertificate是操作 1 和 2 的结果)导入结果。

这个对吗?

如果是这样,我如何才能使步骤 1 中的证书与基于 IP 的地址 ( AAA.BBB.CCC.DDD) 一起使用?

更新 1(23.10.2013 15:37 MSK):在回答类似问题时,我阅读了以下内容:

如果您无法控制该服务器,请使用其主机名(前提是现有证书中至少有一个与该主机名匹配的 CN)。

“使用”究竟是什么意思?

4

23 回答 23

177

我通过使用此处介绍的方法禁用 HTTPS 检查来解决此问题:

我将以下代码放入ISomeService类中:

static {
    disableSslVerification();
}

private static void disableSslVerification() {
    try
    {
        // Create a trust manager that does not validate certificate chains
        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 (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (KeyManagementException e) {
        e.printStackTrace();
    }
}

由于我https://AAA.BBB.CCC.DDD:9443/ISomeService仅将 用于测试目的,这是一个足够好的解决方案,但不要在生产中这样做。

请注意,您还可以为“一次一个连接”禁用 SSL,例如:

 // don't call disableSslVerification but use its internal code:
 HttpURLConnection conn = (HttpURLConnection) url.openConnection();
 if (conn instanceof HttpsURLConnection) {
    HttpsURLConnection httpsConn = (HttpsURLConnection) conn;
    httpsConn.setHostnameVerifier(allHostsValid);
    httpsConn.setSSLSocketFactory(sc.getSocketFactory());
 }
于 2013-10-23T13:09:33.830 回答
39

我有同样的问题并用这段代码解决了。我将此代码放在第一次调用我的网络服务之前。

javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(
  new javax.net.ssl.HostnameVerifier(){

      public boolean verify(String hostname,
             javax.net.ssl.SSLSession sslSession) {
          return hostname.equals("localhost"); // or return true
      }
  });

这很简单,而且工作正常。

是原始来源。

于 2015-06-24T04:05:46.643 回答
37

这是一个老问题,但是从 JDK 1.8.0_144 迁移到 jdk 1.8.0_191 时我遇到了同样的问题

我们在更新日志中发现了一个提示:

变更日志

我们添加了以下附加系统属性,这有助于在我们的案例中解决此问题:

-Dcom.sun.jndi.ldap.object.disableEndpointIdentification=true
于 2018-11-01T13:40:16.540 回答
29

证书身份的验证是根据客户端的请求执行的。

当您的客户端使用https://xxx.xxx.xxx.xxx/something(其中xxx.xxx.xxx.xxx是 IP 地址)时,将根据该 IP 地址检查证书身份(理论上,仅使用 IP SAN 扩展)。

如果您的证书没有 IP SAN,但有 DNS SAN(或者如果没有 DNS SAN,主题 DN 中的公用名),您可以通过让您的客户端使用具有该主机名的 URL(或主机名)来使其工作如果有多个可能的值,则证书对其有效)。例如,如果您的 cert 具有 的名称www.example.com,请使用https://www.example.com/something.

当然,您需要该主机名才能解析为该 IP 地址。

此外,如果有任何 DNS SAN,主题 DN 中的 CN 将被忽略,因此在这种情况下使用与其中一个 DNS SAN 匹配的名称。

于 2013-10-23T11:56:11.663 回答
20

要导入证书:

  1. 从服务器中提取证书,例如openssl s_client -showcerts -connect AAA.BBB.CCC.DDD:9443 > certs.txt这将提取 PEM 格式的证书。
  2. 将证书转换为 DER 格式,因为这是 keytool 所期望的,例如openssl x509 -in certs.txt -out certs.der -outform DER
  3. 现在您想将此证书导入系统默认的“cacert”文件中。找到 Java 安装的系统默认“cacerts”文件。看看如何获​​取默认java安装的cacerts的位置?
  4. 将证书导入该 cacerts 文件:sudo keytool -importcert -file certs.der -keystore <path-to-cacerts>默认 cacerts 密码为“changeit”。

如果证书是为 FQDN 颁发的,并且您尝试通过 Java 代码中的 IP 地址进行连接,那么这可能应该在您的代码中修复,而不是弄乱证书本身。更改您的代码以通过 FQDN 连接。如果您的开发机器上无法解析 FQDN,只需将其添加到您的主机文件中,或使用可以解析此 FQDN 的 DNS 服务器配置您的机器。

于 2016-04-07T17:15:36.080 回答
18

我通过在证书中添加主题替代名称以正确的方式解决了这个问题,而不是像其他答案在这里建议的那样对代码进行任何更改或禁用 SSL。如果您清楚地看到异常说“缺少主题替代名称”,那么正确的方法应该是添加它们

请查看此链接以逐步了解

上述错误意味着您的 JKS 文件缺少您尝试访问应用程序所需的域。您需要使用 Open SSL 和密钥工具来添加多个域

  1. 将 openssl.cnf 复制到当前目录
  2. echo '[ subject_alt_name ]' >> openssl.cnf
  3. echo 'subjectAltName = DNS:example.mydomain1.com, DNS:example.mydomain2.com, DNS:example.mydomain3.com, DNS: localhost'>> openssl.cnf
  4. openssl req -x509 -nodes -newkey rsa:2048 -config openssl.cnf -extensions subject_alt_name -keyout private.key -out self-signed.pem -subj '/C=gb/ST=edinburgh/L=edinburgh/O=mygroup/OU=servicing/CN=www.example.com/emailAddress=postmaster@example.com' -days 365
  5. 将公钥 (.pem) 文件导出为 PKS12 格式。这将提示您输入密码

    openssl pkcs12 -export -keypbe PBE-SHA1-3DES -certpbe PBE-SHA1-3DES -export -in
    self-signed.pem -inkey private.key -name myalias -out keystore.p12
    
  6. 从自签名 PEM(密钥库)创建 a.JKS

    keytool -importkeystore -destkeystore keystore.jks -deststoretype PKCS12 -srcstoretype PKCS12 -srckeystore keystore.p12
    
  7. 从上面的 Keystore 或 JKS 文件生成证书

    keytool -export -keystore keystore.jks -alias myalias -file selfsigned.crt
    
  8. 由于上述证书是自签名证书且未经 CA 验证,因此需要将其添加到 Truststore 中(对于 MAC,Cacerts 文件位于以下位置,对于 Windows,请找出您的 JDK 安装位置。)

    sudo keytool -importcert -file selfsigned.crt -alias myalias -keystore /Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/lib/security/cacerts
    

原始答案发布在此链接上

于 2018-10-04T09:19:33.407 回答
5

您可能不想禁用所有 ssl 验证,因此您可以通过它禁用主机名验证,这比替代方案更可怕:

HttpsURLConnection.setDefaultHostnameVerifier(
    SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

[编辑]

正如 conapart3 所提到的,SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER现在已弃用,因此它可能会在以后的版本中被删除,因此您将来可能会被迫推出自己的产品,尽管我仍然会说我会避开任何关闭所有验证的解决方案。

于 2017-03-06T09:44:48.317 回答
4

通过使用完整的 URL “qtest.ourCompany.com/webService” 而不仅仅是“qatest/webService”,解决了我遇到此错误的问题。原因是我们的安全证书有一个通配符,即“*.ourCompany.com”。一旦我输入完整地址,异常就消失了。希望这可以帮助。

于 2015-07-21T22:26:05.630 回答
2

已经在https://stackoverflow.com/a/53491151/1909708中回答了。

这将失败,因为证书公用名(CN在证书中Subject)和任何备用名称(Subject Alternative Name在证书中)都与目标主机名或 IP 地址不匹配。

例如,从 JVM 中,当尝试连接到 IP 地址 ( WW.XX.YY.ZZ) 而不是 DNS 名称 ( https://stackoverflow.com ) 时,HTTPS 连接将失败,因为存储在 java 信任库中的证书cacerts需要通用名称(或证书备用名称(如 stackexchange.com 或 *.stackoverflow.com 等)以匹配目标地址。

请检查:https ://docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html#HostnameVerifier

    HttpsURLConnection urlConnection = (HttpsURLConnection) new URL("https://WW.XX.YY.ZZ/api/verify").openConnection();
    urlConnection.setSSLSocketFactory(socketFactory());
    urlConnection.setDoOutput(true);
    urlConnection.setRequestMethod("GET");
    urlConnection.setUseCaches(false);
    urlConnection.setHostnameVerifier(new HostnameVerifier() {
        @Override
        public boolean verify(String hostname, SSLSession sslSession) {
            return true;
        }
    });
    urlConnection.getOutputStream();

上面,传递了一个HostnameVerifier始终返回的实现对象true

new HostnameVerifier() {
        @Override
        public boolean verify(String hostname, SSLSession sslSession) {
            return true;
        }
    }
于 2018-11-27T01:29:26.807 回答
2

我们最近遇到了类似的问题“找不到主题替代 DNS 名称匹配”,这是一场噩梦,因为我们只能在生产服务器中重现它,而对调试的访问几乎为零。其他环境运行良好。我们的堆栈是 JDK 1.8.x+、JBoss EAP 7+、Java Spring Boot 应用程序和 Okta 作为身份提供者(从 Okta 恢复众所周知的配置时 SSL 握手失败,其中 okta 在 AWS 云中可用 - 虚拟服务器)。

最后,我们发现(没有人知道为什么)我们使用的 JBoss EAP 应用服务器有一个额外的 JVM 系统属性:

jsse.enableSNIExtension = false

这阻止了建立 TLS 连接,我们能够通过在其他环境中添加相同的系统属性/值来重现该问题。因此,解决方案很简单,可以删除不需要的属性和值

根据 Java 安全文档,对于 Java 7+,此属性默认设置为 true(请参阅https://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/JSSERefGuide.html#InstallationAndCustomization )

  • jsse.enableSNIExtension 系统属性。服务器名称指示 (SNI) 是 TLS 扩展,在 RFC 4366 中定义。它支持与虚拟服务器的 TLS 连接,其中不同网络名称的多个服务器托管在单个底层网络地址上。一些非常老的 SSL/TLS 供应商可能无法处理 SSL/TLS 扩展。在这种情况下,将此属性设置为 false 以禁用 SNI 扩展。
于 2021-05-19T21:15:49.960 回答
1

对于春季启动RestTemplate

  • 添加org.apache.httpcomponents.httpcore依赖
  • 用于NoopHostnameVerifierSSL 工厂:

    SSLContext sslContext = new SSLContextBuilder()
            .loadTrustMaterial(new URL("file:pathToServerKeyStore"), storePassword)
    //        .loadKeyMaterial(new URL("file:pathToClientKeyStore"), storePassword, storePassword)
            .build();
    SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE);
    CloseableHttpClient client = HttpClients.custom().setSSLSocketFactory(socketFactory).build();
    HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(client);
    RestTemplate restTemplate = new RestTemplate(factory);
    
于 2019-12-13T06:15:31.740 回答
1

此代码将像魅力一样工作,并将 restTemple 对象用于其余代码。

  RestTemplate restTemplate = new RestTemplate();   
  TrustStrategy acceptingTrustStrategy = new TrustStrategy() {
            @Override
            public boolean isTrusted(java.security.cert.X509Certificate[] x509Certificates, String s) {
                return true;
            }

        };

        SSLContext sslContext = null;
        try {
            sslContext = org.apache.http.ssl.SSLContexts.custom().loadTrustMaterial(null, acceptingTrustStrategy)
                    .build();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (KeyManagementException e) {
            e.printStackTrace();
        } catch (KeyStoreException e) {
            e.printStackTrace();
        }
        SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext, new NoopHostnameVerifier());
        CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(csf).build();
        HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
        requestFactory.setHttpClient(httpClient);

        restTemplate.setRequestFactory(requestFactory);
}
于 2020-03-16T12:58:07.270 回答
1

我也面临与自签名证书相同的问题。通过参考上述几个解决方案,我尝试使用正确的 CN 重新生成证书,即服务器的 IP 地址。但它仍然对我不起作用。最后我尝试通过下面提到的命令添加 SAN 地址来重新生成证书

**keytool -genkey -keyalg RSA -keystore keystore.jks -keysize 2048 -alias <IP_ADDRESS> -ext san=ip:<IP_ADDRESS>**

之后我启动了我的服务器并通过下面提到的 openssl 命令下载了客户端证书

**openssl s_client -showcerts -connect <IP_ADDRESS>:443 < /dev/null | openssl x509 -outform PEM > myCert.pem**

然后我通过下面提到的命令将此客户端证书导入到我的客户端机器的 java 默认密钥库文件 (cacerts)

**keytool -import -trustcacerts -keystore /home/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-1.el7.x86_64/jre/lib/security/cacerts -alias <IP_ADDRESS> -file ./mycert.pem**
于 2020-10-20T10:59:46.077 回答
1

正如之前有人指出的那样,我在创建 RestTemplate 对象之前添加了以下代码(使用 lambda),它工作正常。IT 仅适用于我的内部测试课程,因此我将为生产代码提供更好的解决方案。

javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(
            (hostname, sslSession) -> true);
于 2021-03-15T01:41:57.850 回答
0

如果收到相同的错误消息,我会遇到这个问题。但是,在我的情况下,我们有两个具有不同子域(http://example1.xxx.com/someservicehttp://example2.yyy.com/someservice)的 URL,它们被定向到同一服务器。此服务器只有一个 *.xxx.com 域的通配符证书。通过第二个域使用服务时,找到的证书(*.xxx.com)与请求的域(*.yyy.com)不匹配,出现错误。

在这种情况下,我们不应尝试通过降低 SSL 安全性来修复此类错误消息,而应检查服务器及其上的证书。

于 2018-11-12T13:08:14.123 回答
0

我在springboot中经历了2路SSL。我已经做了所有正确的配置服务 tomcat 服务器和服务调用者 RestTemplate。但我收到错误为“java.security.cert.CertificateException:不存在主题替代名称”

经过解决方案后,我发现 JVM 需要此证书,否则会出现握手错误。

现在,如何将它添加到 JVM。

转到 jre/lib/security/cacerts 文件。我们需要将我们的服务器证书文件添加到这个 jvm 的 cacerts 文件中。

通过 Windows 中的命令行将服务器证书添加到 cacerts 文件的命令。

C:\Program Files\Java\jdk1.8.0_191\jre\lib\security> keytool -import -noprompt -trustcacerts -alias sslserver -file E:\spring_cloud_sachin\ssl_keys\sslserver.cer -keystore cacerts -storepass changeit

检查服务器证书是否安装:

C:\Program Files\Java\jdk1.8.0_191\jre\lib\security> keytool -list -keystore cacerts

您可以看到已安装的证书列表:

更多详情:https ://sachin4java.blogspot.com/2019/08/javasecuritycertcertificateexception-no.html

于 2019-08-26T20:09:02.593 回答
0

在证书中添加与CN对应的ip的主机条目

CN=someSubdomain.someorganisation.com

现在使用您尝试访问 url 的 CN 名称更新 ip。

它对我有用。

于 2019-09-01T12:37:28.173 回答
0

当您拥有同时具有 CN 和主题备用名称 (SAN) 的证书时,如果您根据 CN 内容提出请求,则该特定内容也必须存在于 SAN 下,否则它将因相关错误而失败。

就我而言,CN 有一些东西,SAN 有一些东西。我必须使用 SAN URL,然后它工作得很好。

于 2020-05-14T10:22:07.470 回答
0

我已经解决了

MqttException (0) - javax.net.ssl.SSLHandshakeException:证书上没有 subjectAltNames 匹配

在服务器证书(具有 CN=example.com)中添加一个(可以添加多个)替代主题名称时出错,该名称在打印证书部分后如下所示:

Subject Alternative Name:
DNS: example.com

我在 Windows 上使用 KeyExplorer 来生成我的服务器证书。您可以按照此链接添加替代主题名称(按照添加它的唯一部分)。

于 2020-09-13T07:23:50.633 回答
0

No subject alternative names present我参考了 animo3991 的答案并对其进行了调整,以使我的 Bitbucket Backup Client 3.6.0 在它也遇到错误之前可以备份我的 Bitbucket 服务器。

但是第一个命令必须使用alias tomcat,否则 Bitbucket Server 将无法正常启动:

keytool -genkey -keyalg RSA -sigalg SHA256withRSA -keystore keystore.jks -keysize 2048 -alias tomcat -ext san=ip:<IP_ADDRESS>

openssl s_client -showcerts -connect <IP_ADDRESS>:443 < /dev/null | openssl x509 -outform PEM > myCert.pem

keytool -import -trustcacerts -keystore /etc/pki/ca-trust/extracted/java/cacerts -alias <IP_ADDRESS> -file ./myCert.pem
于 2021-10-10T14:48:50.270 回答
-1
public class RESTfulClientSSL {

    static TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
        @Override
        public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            // TODO Auto-generated method stub
        }

        @Override
        public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            // TODO Auto-generated method stub
        }

        @Override
        public X509Certificate[] getAcceptedIssuers() {
            // TODO Auto-generated method stub
            return null;
        }
    }};

    public class NullHostNameVerifier implements HostnameVerifier {
        /*
         * (non-Javadoc)
         *
         * @see javax.net.ssl.HostnameVerifier#verify(java.lang.String,
         * javax.net.ssl.SSLSession)
         */
        @Override
        public boolean verify(String arg0, SSLSession arg1) {
            // TODO Auto-generated method stub
            return true;
        }
    }

    public static void main(String[] args) {

        HttpURLConnection connection = null;
        try {

            HttpsURLConnection.setDefaultHostnameVerifier(new RESTfulwalkthroughCer().new NullHostNameVerifier());
            SSLContext sc = SSLContext.getInstance("SSL");
            sc.init(null, trustAllCerts, new SecureRandom());
            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());


            String uriString = "https://172.20.20.12:9443/rest/hr/exposed/service";
            URL url = new URL(uriString);
            connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            //connection.setRequestMethod("POST");

            BASE64Encoder encoder = new BASE64Encoder();
            String username = "admin";
            String password = "admin";
            String encodedCredential = encoder.encode((username + ":" + password).getBytes());
            connection.setRequestProperty("Authorization", "Basic " + encodedCredential);

            connection.connect();
            BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            int responseCode = connection.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK) {
                StringBuffer stringBuffer = new StringBuffer();
                String line = "";
                while ((line = reader.readLine()) != null) {
                    stringBuffer.append(line);
                }
                String content = stringBuffer.toString();
                System.out.println(content);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (connection != null) {
                connection.disconnect();
            }
        }
    }
}
于 2019-08-06T07:12:30.047 回答
-3

在 C:\Windows\System32\drivers\etc 文件夹中的 hosts 文件中添加您的 IP 地址。还要添加 IP 地址的 IP 和域名。示例:aaa.bbb.ccc.ddd abc@def.com

于 2016-03-02T05:31:03.937 回答
-5

我已经通过以下方式解决了这个问题。

1.创建一个类。该类有一些空的实现

class MyTrustManager implements X509TrustManager {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
    return null;
}

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

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

@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] paramArrayOfX509Certificate, String paramString)
        throws CertificateException {
    // TODO Auto-generated method stub

}

@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] paramArrayOfX509Certificate, String paramString)
        throws CertificateException {
    // TODO Auto-generated method stub

}

2. 创建方法

private static void disableSSL() {
    try {
        TrustManager[] trustAllCerts = new TrustManager[] { new MyTrustManager() };

        // Install the all-trusting trust manager
        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, trustAllCerts, new java.security.SecureRandom());
        HostnameVerifier allHostsValid = new HostnameVerifier() {
            public boolean verify(String hostname, SSLSession session) {
                return true;
            }
        };
        HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
    } catch (Exception e) {
        e.printStackTrace();
    }
}

  1. 调用引发异常的 disableSSL() 方法。它工作得很好。
于 2016-08-29T04:19:58.323 回答