当前位置: 首页 > 知识库问答 >
问题:

Java-标准SSL证书所有信任代码均失败

羊毅庵
2023-03-14

我认为,到目前为止,几乎每个有SSL证书信任错误经验的Java程序员都使用过或至少遇到过以下代码:

    // Create a trust manager that does not validate certificate chains
    TrustManager[] trustAllCerts;
    trustAllCerts = new TrustManager[] {
        new X509TrustManager() {
            @Override
            public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                return null;
            }
            @Override
            public void checkClientTrusted(X509Certificate[] certs, String authType) {
            }
            @Override
            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() {
        @Override
        public boolean verify(String hostname, SSLSession session) {
    return true;
        }
};

    // Install the all-trusting host verifier
    HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);

到目前为止,我已经成功地使用了这段代码来忽略通过其IP地址访问HTTPs站点时的证书不匹配(不要问我为什么这样做,这是一个完全不同的故事)。然而,我尝试对另一个HTTPs站点执行相同的操作,发现此代码失败,出现以下异常:

javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: Certificates does not conform to algorithm constraints

所以,问题是,出了什么问题,我能做些什么?

共有1个答案

荀学文
2023-03-14

我已经解决了这个问题。看起来服务器在其证书中使用了MD2。到目前为止,我知道的解决这个问题的唯一方法是定位jre/lib/security/java。JDK路径中的安全文件,并更改JDK.certpath。disabledAlgorithms=MD2到jdk.certpath。disabledAlgorithms=这样MD2算法就不会被禁用。这看起来真的很糟糕,但遗憾的是,我找不到以编程方式启用MD2的方法。

现在回想起来,我记得我可以访问它,但只是在我更新Java之前,Java被杀了。安全文件编辑。

 类似资料:
  • 我已经看到了一些使用X509TrustManager实现TrustManager的示例,尽管显然Java7不支持这些约定,X509TrustManager本身也被弃用。 感谢您的建议和任何在Java7上工作的代码示例。

  • 我已经在我的spring boot应用程序中启用了ssl,并且任何时候我想使用像GooglePis或facebook这样的Rest服务,我都必须在TrustStore中添加证书。 我使用openssl获取证书: openssl s_client-connect googleapis.com:443 并将其导入truststore: keytool.exe-import-noprompt-trust

  • 我已经安装了WAMP3.0.4,并试图编写一个连接到外部HTTPS web服务的PHP脚本。但这将返回错误: 从上面可以清楚地看出,我是Apache/WAMP的新手。也许有人能解释一下我错过了什么吗?

  • 我在Weblogic服务器上有一个web应用程序,它通过HTTPS接受带有自签名证书的连接。Weblogic服务器URL上的Web应用https://server1.com:7122/webapp1/ 我还在同一台服务器上安装了ngnix,该服务器上的证书充当服务器上所有Web应用程序的前端。Nginx服务器URLhttps://server1.com:443/ 我希望用户通过nginx访问Web

  • 我们需要显式地将受信任的CA证书导入java密钥库吗?如果是,为什么? 我可以理解,我们应该始终将自签名SSL证书导入密钥库,因为它们不是经过验证的证书,除非密钥库中有java,否则无法信任。但是,即使对于可信CA生产证书,我们也需要执行同样的操作吗? 注意:我使用的是jdk v1。6.x。