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

Java(Java8)如何修复WhiteHat“证书验证不当”(CWE-295)安全漏洞

袁旻
2023-03-14
    null
// http://www.nakov.com/blog/2009/07/16/disable-certificate-validation-in-java-ssl-connections/
public class JavaCertificationUtils {

    private static final SanitizedLogger LOG = new SanitizedLogger(JavaCertificationUtils.class);

    public static void javaTrustAllCerts() {
        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 (Exception e) {
            LOG.error("Java Certificate All Certs Exception.", e);
        }
    }
}

共有1个答案

姜胤
2023-03-14

您显示的代码有两个功能:

  1. 它禁用TLS证书链验证(使用TrustAllCerts)。
  2. 并禁用主机名验证(使用AllHostsValid)。

怎么解决这个?首先-删除代码。全部都是。造成损害的确切线路是:

sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);

您可能会注意到(90%的概率),代码将停止工作。这可能是由于不同的原因。

  1. 您正在尝试连接到使用自签名证书的服务(可能是某人首先进行这样的黑客攻击的原因)。服务需要修复此问题。
  2. 信任存储区中没有验证信任链所需的所有证书。在这种情况下,您需要扩展信任存储并添加必要的根CA证书。
  3. 通过SSH隧道连接到TLS安全服务。一旦将正确的域名转换为本地主机,TLS主机名验证将失败。
  4. 其他部分将失败。

那就让我们知道错误是什么。

 类似资料:
  • 最近,我在这里问我的pip有问题,这也影响了我的easy_安装和py2app。根据我在这里得到的答案,我尝试了“安装证书”。昨天晚上的命令。现在,我的pip开始工作了!但是我的easy_install、pip3、easy_install3和py2app仍然无法处理此错误(

  • 问题内容: 假设我编写了两个Java应用程序:并且它们被部署并在两个单独的服务器上运行(部署到和部署到),并且这两个应用程序需要通过SSL相互通信(双向)。我们还假设每个应用程序都有自己的SSL证书。 我(Java程序员)如何编码并验证彼此的SSL证书?每个CA是否都提供某种我可以使用的RESTful API ?Java是否有自己的证书验证API?我可以使用开放源代码的第三方JAR或服务吗? 当我

  • 这里是我的pom.xml 4.0.0 org.springframework.Boot spring-boot-starter-parent 2.3.2.release com.king Gestpeacesecurity 0.0.1-snapshot Gestpeacesecurity用于Spring Boot的和平安全项目 我的实体代理,我使用lomback作为getter和setter 这是

  • 我越来越不正常了 太阳安全验证器。ValidatorException:PKIX路径生成失败:sun。安全供应商。certpath。SunCertPathBuilderException:找不到请求目标的有效证书路径 我已在该位置设置SSL证书 C:\Program Files\AdoptOpenJDK\jdk-11.0.9.11-hotspot\lib\security 但我在点击服务器时遇到了

  • 我正在尝试使用wsse:BinarySecurityToken(ValueType=)验证来自windows密钥库的CA证书http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3),但它通过一个异常失败:java.security.cert.CertPathValidatorExce

  • 我不必去修复一些不起作用的东西,但我试着去理解为什么有些东西会起作用,因为我认为它不应该起作用。 我使用的是OpenJDK11/Ubuntu 16.04。我打了个HTTPS电话。SSL握手成功。 证书链包含3个证书: 当然是API证书。由中间CA发行(issuer=CN=DigiCert TLS RSA SHA256 2020 CA1,O=DigiCert Inc,C=US) 中级CA证书。由根C