代码之家  ›  专栏  ›  技术社区  ›  Vlad

尝试从安全站点生成web服务客户端时出现奇怪的证书错误

  •  2
  • Vlad  · 技术社区  · 16 年前

    我在尝试使用AXIS1.4wsdl2java工具为安装在安全IIS站点上的web服务生成客户端代码时遇到了一个奇怪的错误。运行该工具时,我收到以下SSL异常:

    javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No
     name matching XXXXXXX.net found
            at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
            at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1
    591)
            at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:187)
            at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:181)
            at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(Clien
    tHandshaker.java:975)
            at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHa
    ndshaker.java:123)
            at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:5
    16)
            at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.jav
    a:454)
            at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.j
    ava:884)
            at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SS
    LSocketImpl.java:1096)
            at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketIm
    pl.java:1123)
    

    5 回复  |  直到 16 年前
        1
  •  1
  •   Pascal Thivent    16 年前

    主机的DNS名称(例如machine1)很可能不匹配。我的域名.tld)以及 CommonName CertificateException blog post :

    • 如果您想通过使用IP作为主机名进行连接;
    • 如果您想通过使用DNS作为主机名进行连接;
      您的证书应将该DNS名称作为使用者备用名称值(类型为DNS:key=2)或作为CommonName(CN)值包含。
        2
  •  1
  •   Bruno    16 年前

    您可能会发现使用SSL调试系统属性有助于调查此问题:

    -Djavax.net.debug=ssl
    

    如果打印的内容太多,可以过滤一些内容,例如:

    -Djavax.net.debug=ssl,trustmanager
    

    输出不一定显而易见,但它应该更详细地告诉您错误在哪里。

        3
  •  0
  •   Chris Dail    16 年前

    问题是WSDL2Java因为名称而拒绝了服务器证书。在Java中,用于连接到远程系统的主机名与证书中的通用名非常匹配。它不会根据IP地址反向查找。必须使用主机名进行连接。

    如果使用IP地址进行连接,则可能没有在您的环境中设置DNS。解决这个问题最简单的方法是将主机名添加到主机文件中。在windows中,它位于“C:\windows\System32\drivers\etc\hosts”。

    xx.xx.xx.xx      XXXXXXXXXX.net
    

    这将允许您使用主机名通过WSDL2Java获取WSDL。

    备选方案:

        4
  •  0
  •   Jim Flood    16 年前

    如果您手头有服务器证书并且安装了openssl,则可以使用以下内容转储证书的内容:

    $ openssl x509 -noout -text -in filename-here.pem
    

    您将看到“CN=”作为Subject的一部分,如果它在证书中具有altSubjectName扩展名,您将在下面的X509v3扩展名下看到,作为X509v3 Subject Alternative Name,您将查找类似于DNS:这里是主机名。

    如果这与您要连接到的主机名相匹配,那么只需检查您是通过IP地址还是通过主机名在任何SSL接口中进行连接,并确保它是按主机名而不是按IP地址。

    编辑:

    如果证书中列出了IP,您将看到类似IP的内容:xx.xx.xx.xx,位于openssl输出中的X509v3主题替代名称下。

    如果未列出IP,请从shell提示符运行nslookup,并比较工作和非工作服务器地址的输出。这可能就是工作服务器如何匹配主机名(即通过getnetbyaddr)。

    found with quick Google

        5
  •  0
  •   jt.    16 年前

    是不是你错过了合适的 GlobalSign root certificate for Java .

    # Import a root or intermediate CA certificate to an existing Java keystore
    keytool -import -trustcacerts -alias root -file Thawte.crt -keystore keystore.jks
    

    另一种可能性与根证书和中间证书的组合有关。更多来自全球标志 website :

    “一些基于Apache和Java的 应用程序需要根和 捆绑在一个证书中…”

    推荐文章