Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.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
Java 尝试从安全站点生成web服务客户端时出现奇怪的证书错误_Java_Ssl_Axis_Ssl Certificate - Fatal编程技术网

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

Java 尝试从安全站点生成web服务客户端时出现奇怪的证书错误,java,ssl,axis,ssl-certificate,Java,Ssl,Axis,Ssl Certificate,尝试使用AXIS1.4 Wsdl2Java工具为安装在安全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.getSSL

尝试使用AXIS1.4 Wsdl2Java工具为安装在安全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)

奇怪的是,这个错误只在我运行WSDL2Java时发生,而且只针对这个特定的服务器。我有另一个web服务器,具有相同的设置,在那里一切正常。我三次检查了所有密钥库,看起来所有CA证书都加载正确。我尝试使用另一台具有相同设置的服务器,并且能够毫无问题地生成客户端代理代码。奇怪的是,如果我使用从另一台服务器生成的代码来对付这个奇怪的服务器,那么一切都会正常工作。只有Wsdl2Java给了我一个问题

主机的DNS名称(例如machine1.mydomain.tld)与证书中的
CommonName
值之间很可能不匹配,因此出现
certificateeexception
。由此:

  • 如果您想通过使用IP作为主机名进行连接
    您的证书应将该ip值作为主题备选名称值(类型为IPAddress:key=7)包含在内
  • 如果您想通过使用DNS作为主机名进行连接
    您的证书应将该DNS名称作为使用者备选名称值(类型为DNS:key=2)或作为CommonName(CN)值包含

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

$ openssl x509 -noout -text -in filename-here.pem
您将看到“CN=”作为主题的一部分,如果它在证书中有altSubjectName扩展名,您将在下面的X509v3扩展名下看到它,作为X509v3 Subject Alternative Name,您将在此处查找类似DNS:host Name的内容

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

如果证书中没有匹配的名称(与您连接到的主机名匹配),某些SSL接口将允许您忽略“名称不匹配”。(我不知道在您的具体案例中如何做到这一点。)

编辑:

尝试按主机名而不是IP地址连接,看看是否有差异

如果证书中列出了IP,您将在openssl输出中的X509v3 Subject Alternative Name下看到类似IP:xx.xx.xx.xx的内容

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

编辑2:


您是否尝试过按主机名(在连接字符串中)进行连接,但仍然出现相同的错误?使用IP地址通过浏览器进行连接并不重要——浏览器可能没有使用相同的算法验证主机名。您是否尝试过使用连接中的IP地址连接到正常的服务器?另外,请在此处查找可以尝试的内容:

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

其他回复表明您正在通过IP地址进行连接。这不是正确的做事方式。Java将根据它所连接的主机名验证证书

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

xx.xx.xx.xx      XXXXXXXXXX.net
这将允许您使用主机名通过WSDL2Java获取WSDL

备选方案:


如果这仍然不起作用,还有另一种选择。使用web浏览器下载.wsdl文件。让WSDL2Java从磁盘上的本地文件而不是web服务器上创建Java存根。生成的代码将是相同的,但它不必通过SSL来获取WSDL。

可能是您缺少相应的代码

另一种可能性与根证书和中间证书的组合有关。来自GlobalSign的更多信息:

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


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

-Djavax.net.debug=ssl
如果打印的内容太多,您可以过滤一些内容,可能是:

-Djavax.net.debug=ssl,trustmanager

输出不一定是显而易见的,但它应该告诉您错误的详细位置。

@Pascal不太可能,如果是简单的域名不匹配,浏览器会抱怨,针对其他服务器生成的代码也会抱怨。@Vlad Java和浏览器可能不共享相同的算法。可能生成的代码包含一个
主机名验证程序
实现,因此这不能证明任何事情。你检查了证书中的CN了吗?CN是正确的,我正在通过IP地址连接。这不是简单的名称不匹配问题。如果是,浏览器和生成的代码会抱怨。此问题仅由WSDL2Java引起。请仔细阅读问题描述。主机名与证书CN=名称不匹配。因此,所有浏览器甚至生成的客户端代码都可以正常工作。WSDL2Java是唯一不适用于此特定服务器的东西。我能够针对我用于开发的另一台服务器生成客户端代码,该服务器具有相同的软件集。两台服务器之间的唯一区别在于生产(不需要
-Djavax.net.debug=ssl,trustmanager