首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java (Java8)如何修复WhiteHat“不正确的证书验证”(CWE-295)安全漏洞

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

Stack Overflow用户
提问于 2020-02-21 00:21:02
回答 1查看 1.1K关注 0票数 1

我们使用WhiteHat源扫描仪扫描我们的源代码。该工具在2种方法中发现“不正确的证书验证”(CWE-295)安全问题。这是一个真正积极的安全问题吗?如果是,我们如何在Java 8中修复它,我们有解决方案来解决这样的问题吗?非常感谢。

  • public void checkClientTrusted(X509 Certificate[] certs,String authType)

代码语言:javascript
运行
复制
// 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);
        }
    }
}
EN

回答 1

Stack Overflow用户

发布于 2020-02-21 19:37:18

您显示的代码做了两件事:

它禁用TLS证书链验证(使用trustAllCerts).

  • And而不是禁用主机名验证(使用allHostsValid).

))。

怎么解决这个问题?首先-删除代码。所有的一切。造成损害的确切线条如下:

代码语言:javascript
运行
复制
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);

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

  1. --您正试图连接到使用自签名证书的服务(可能是有人首先进行了这样的攻击的原因之一)。服务需要修复这个问题。

  1. ,您在信任存储区中没有所有必要的证书来验证信任链。在这种情况下,您需要扩展您的信任存储,并通过SSH隧道向TLS安全服务添加必要的根CA certificates.
  2. You连接。一旦您将正确的域名转换为本地主机: TLS主机名验证将失败,否则fail.
  3. Something .

将失败。

然后让我们知道错误是什么。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60330475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档