Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SSL证书验证:javax.net.SSL.SSLHandshakeException_Java_Security_Ssl_Https - Fatal编程技术网

SSL证书验证:javax.net.SSL.SSLHandshakeException

SSL证书验证:javax.net.SSL.SSLHandshakeException,java,security,ssl,https,Java,Security,Ssl,Https,我正试图通过Jersey客户端调用HTTPS REST API。在发展过程中,我偶然发现了以下错误: Exception in thread "main" com.sun.jersey.api.client.ClientHandlerException: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No name matching mvn.signify.abc.c

我正试图通过
Jersey客户端
调用HTTPS REST API。在发展过程中,我偶然发现了以下错误:

Exception in thread "main" com.sun.jersey.api.client.ClientHandlerException: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No name matching mvn.signify.abc.com found
    at com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:149)
    at com.sun.jersey.api.client.Client.handle(Client.java:648)
    at com.sun.jersey.api.client.WebResource.handle(WebResource.java:670)
    at com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74)
    at com.sun.jersey.api.client.WebResource$Builder.get(WebResource.java:503)
    at com.lftechnology.sbworkbench.utility.utils.PingFederateUtility.main(PingFederateUtility.java:32)
Caused by: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No name matching mvn.signify.abc.com found
所以我在谷歌上搜索了一下,找到了大量的解决方案,这确实有效

  • 他们在不同的领域,但他们有一个共同的解决方案

    脚本 我目前正在开发环境中使用自行创建的自签名证书。因此,它必然会出现这个问题

    问题: 上述解决方案的重点是跳过/允许验证所有证书

    但当我将其移动到生产环境中时,我就可以访问来自可靠来源的有效签名证书

  • 那么,这些解决方案在我进入生产阶段时有帮助吗

  • 跳过SSL验证可以吗
  • 实现通用解决方案的其他替代方法是什么 开发和生产环境
  • 附言

    我使用的解决方案是

    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();
    }
    
    然后我与泽西公司合作,使其发挥作用。而且效果很好

    所以,
    问题再次出现此解决方案可用于生产环境吗?
    但是,您不想修改返回的实体,最好以只读模式获取实体。这将允许Hibernate丢弃关联的分离状态,脏检查机制使用该状态检测实体状态修改。此外,刷新期间将跳过只读实体

    我当前正在中使用自行创建的自签名证书 发展环境。。。javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException:没有名称匹配 dev.ppc.lftechnology.com找到

    自签名证书似乎不正确

    下面是OpenSSL
    CONF
    文件,我用来创建自签名证书和测试期间使用的证书请求。将其另存为
    example com.conf
    。更改
    [备用名称]
    下的DNS名称以符合您的喜好。您甚至可以将
    localhost
    localhost.localdomain
    127.0.0.1
    放入其中进行测试

    如果要创建自签名证书,请使用:

    openssl req -config example-com.conf -new -x509 -newkey rsa:2048 \
        -nodes -keyout example-com.key.pem -days 365 -out example-com.cert.pem
    
    openssl req -config example-com.conf -new -newkey rsa:2048 \
        -nodes -keyout example-com.key.pem -days 365 -out example-com.req.pem
    
    openssl x509 -in example-com.cert.pem -text -noout
    openssl req -in example-com.req.pem -text -noout
    
    如果要创建将由可信机构签名的签名请求(CSR),请使用:

    openssl req -config example-com.conf -new -x509 -newkey rsa:2048 \
        -nodes -keyout example-com.key.pem -days 365 -out example-com.cert.pem
    
    openssl req -config example-com.conf -new -newkey rsa:2048 \
        -nodes -keyout example-com.key.pem -days 365 -out example-com.req.pem
    
    openssl x509 -in example-com.cert.pem -text -noout
    openssl req -in example-com.req.pem -text -noout
    
    自签名证书和签名请求之间的区别在于
    -x509
    选项。存在
    -x509
    时,将创建自签名证书。缺少
    -x509
    表示已创建请求

    如果要打印自签名证书或请求以查看其中的实际内容,请使用:

    openssl req -config example-com.conf -new -x509 -newkey rsa:2048 \
        -nodes -keyout example-com.key.pem -days 365 -out example-com.cert.pem
    
    openssl req -config example-com.conf -new -newkey rsa:2048 \
        -nodes -keyout example-com.key.pem -days 365 -out example-com.req.pem
    
    openssl x509 -in example-com.cert.pem -text -noout
    openssl req -in example-com.req.pem -text -noout
    
    如果要测试服务器,请使用
    s\u client

    openssl s_client -connect <server>:<port> -CAfile <trust-anchor.pem>
    


    跳过SSL验证可以吗

    不,那太不负责任了。如果您不打算正确使用PKIX,那么为什么要使用它呢

    我想到了这一点:


    最好将自签名证书加载到密钥库(或加载私有CA),然后将其传递到
    SSLContext.init
    。然后一切都按预期运行,无需信任一切或从
    verify
    返回
    true

    Bruno和EJP有很多关于这个问题的答案


    为开发和生产环境实现通用解决方案的其他替代方法是什么

    使用格式良好的证书链接回受信任的根

    对于测试,您可以创建自签名证书。或者,创建一个证书请求,并让您的内部CA在专用PKI中对其进行签名。在这种情况下,您需要信任您的自签名证书或信任您的内部CA

    对于生产,您可以使用由CA Zoo的一个成员签名的证书,以便组织外部的其他人也信任它。并免费提供一级证书

    类别1证书通常经过域验证,不允许通配符。虽然第1类是免费发布的,但它们对撤销收取费用,因为这是成本所在


    如果你需要通配符,那么你通常需要购买2级或更高级别的通配符。

    @jww正确地回答了这个问题


    跳过SSL验证可以吗?不,那太不负责任了

    但是,在某些情况下,您可能无法控制相关服务器以安装有效的证书。如果服务器属于其他人,并且您信任该服务器,则更好的解决方案是使用“白名单”仅验证受信任服务器的证书,否则使用普通验证

    public static class WhitelistHostnameVerifier implements HostnameVerifier {
        private static final HostnameVerifier defaultHostnameVerifier = HttpsURLConnection.getDefaultHostnameVerifier();
        private Set<String> trustedHosts;
    
        public WhitelistHostnameVerifier(Set<String> trustedHosts) {
            this.trustedHosts = trustedHosts;
        }
    
        @Override
        public boolean verify(String hostname, SSLSession session) {
            if (trustedHosts.contains(hostname)) {
                return true;
            } else {
                return defaultHostnameVerifier.verify(hostname, session);
            }
        }
    }
    

    如果要禁用安全检查,请不要全局禁用…

    在创建自签名证书时,Java Keytool for Java 1.7.0_60-b19版存在标签软件错误。有关参考信息,请参阅这些说明

    当它提示您输入“您的名字和姓氏是什么?”时,您应该输入通用名或(服务器的完全限定域名),而不是键入您的名字

    查找Java版本:

    [root@localhost ~]# java -version
    java version "1.7.0_60"
    Java(TM) SE Runtime Environment (build 1.7.0_60-b19)
    Java HotSpot(TM) Client VM (build 24.60-b09, mixed mode, sharing)
    

    “跳过SSL验证可以吗?”-不可以。。还是你不在这里说苹果会失败?!“那么,问题又来了。这个解决方案在生产环境中使用可行吗?”-不,不可行。这是不负责任和严重的疏忽。谢谢@jww这是一个很棒的回答。关于我提到的
    解决方案
    ,我已经更新了一点我的问题。感谢您宝贵的见解@jww.hi@jww它对localhost{DNS}运行良好,当我提供192.168.1.56这样的本地ip地址时,它不工作。请帮助我out@Srinivasu-添加类似于DNS.5=192.168.1.56的内容。如果它仍然不工作,那么它与浏览器有关。但我一直无法找到浏览器对IP攻击的确切原因