Java 找不到与ex.ample.com匹配的主题替代DNS名称

Java 找不到与ex.ample.com匹配的主题替代DNS名称,java,security,ssl,ssl-certificate,Java,Security,Ssl,Ssl Certificate,对于在ex.ample.com上运行的应用程序,我拥有StartSSL/StartCom颁发的以下证书: Certificate: Data: Version: 3 (0x2) Serial Number: 163069 (0x27cfd) Signature Algorithm: sha1WithRSAEncryption Issuer: C=IL, O=StartCom Ltd., OU=Secure Digital C

对于在ex.ample.com上运行的应用程序,我拥有StartSSL/StartCom颁发的以下证书:

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 163069 (0x27cfd)
        Signature Algorithm: sha1WithRSAEncryption
        Issuer: C=IL, O=StartCom Ltd., OU=Secure Digital Certificate Signing, CN=StartCom Class 1 Primary Intermediate Server CA
        Validity
            Not Before: Nov 27 21:26:01 2010 GMT
            Not After : Nov 29 15:32:05 2011 GMT
        Subject: description=303703-Sv1xMdnmzg6garMt, C=NL, O=Persona Not Validated, OU=StartCom Free Certificate Member, CN=ex.ample.com/emailAddress=postmaster@ex.ample.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (2048 bit)
                Modulus (2048 bit):
                    ....
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            X509v3 Key Usage: 
                Digital Signature, Key Encipherment, Key Agreement
            X509v3 Extended Key Usage: 
                TLS Web Server Authentication
            X509v3 Subject Key Identifier: 
                31:68:B2:7B:A2:7C:79:54:B7:3E:66:FD:12:04:18:FC:FB:9B:34:64
            X509v3 Authority Key Identifier: 
                keyid:EB:42:34:D0:98:B0:AB:9F:F4:1B:6B:08:F7:CC:64:2E:EF:0E:2C:45

            X509v3 Subject Alternative Name: 
                DNS:ex.ample.com, DNS:ample.com
            X509v3 Certificate Policies: 
                Policy: 1.3.6.1.4.1.23223.1.2.2
                  CPS: http://www.startssl.com/policy.pdf
                  CPS: http://www.startssl.com/intermediate.pdf
                  User Notice:
                    Organization: StartCom Ltd.
                    Number: 1
                    Explicit Text: Limited Liability, see section *Legal Limitations* of the StartCom Certification Authority Policy available at http://www.startssl.com/policy.pdf

            X509v3 CRL Distribution Points: 
                URI:http://www.startssl.com/crt1-crl.crl
                URI:http://crl.startssl.com/crt1-crl.crl

            Authority Information Access: 
                OCSP - URI:http://ocsp.startssl.com/sub/class1/server/ca
                CA Issuers - URI:http://www.startssl.com/certs/sub.class1.server.ca.crt

            X509v3 Issuer Alternative Name: 
                URI:http://www.startssl.com/
    Signature Algorithm: sha1WithRSAEncryption
        .....
我已正确安装此证书。当我使用Firefox访问应用程序时,它会工作。 但是,当我使用Java的
HttpURLConnection
从中检索页面时,会出现以下错误:

Caused by: java.security.cert.CertificateException: No subject alternative DNS name matching ex.ample.com found.
    at sun.security.util.HostnameChecker.matchDNS(HostnameChecker.java:208)
    at sun.security.util.HostnameChecker.match(HostnameChecker.java:94)
    at sun.security.ssl.X509TrustManagerImpl.checkIdentity(X509TrustManagerImpl.java:285)
    at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:271)
    at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1012)
    ... 14 more
我不明白为什么会这样
ex.ample.com
是证书中的通用名称(CN),也列在SAN中。
我已经在我的信任库中导入了StarSLL的证书,所以这不是问题所在。

不确定您是否仍在寻找答案。可能不会


这里的问题是证书中的DNS条目与应用程序中提供的服务器/主机名不匹配。您的代码在某个地方进行了主机名验证。请删除该代码位或更改您为证书中的DNS名称提供的主机名

我们最近遇到了这个问题,这是一场噩梦,因为我们只能在生产服务器上复制它,而调试的访问权限几乎为零。其余的环境都运转良好。我们的堆栈是JDK 1.8.x+、JBoss EAP 7+、Java Spring Boot app和Okta作为身份提供者(从Okta恢复众所周知的配置时SSL握手失败,Okta在AWS云虚拟服务器中可用)

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

jsse.enableSNIExtension=false

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

根据Java安全文档,对于Java 7+,此属性默认设置为true(请参阅)

  • jsse.EnablesInExtension系统属性。服务器名称指示(SNI)是RFC 4366中定义的TLS扩展。它支持到虚拟服务器的TLS连接,其中具有不同网络名称的多个服务器托管在一个基础网络地址上。 一些非常老的SSL/TLS供应商可能无法处理SSL/TLS扩展。在这种情况下,将此属性设置为false以禁用SNI扩展

什么是URL?顺便说一句,CN不包含有效的主机名,但主题替代名称包含有效的主机名。URL只是简单的。显然,这是一个示例,不是真正的URL,但我从Java访问的URL在普通浏览器中运行良好。我知道这是一个示例。在查看这些类的Java源代码时,您的示例似乎与您使用的真实URL/证书不太相符。或者我可能错过了一些东西,HostnameChecker是一个复杂的类。可能有点晚了,但是否可能您的服务器是使用服务器名称指示(SNI)设置的,从而根据请求的主机名显示不同的证书?Java6(当时)不支持SNI(因此它可能会退回到任何其他cert配置)。