Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/27.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
如何在JavaWeb服务客户端中绕过证书检查_Java_Https_Wsdl - Fatal编程技术网

如何在JavaWeb服务客户端中绕过证书检查

如何在JavaWeb服务客户端中绕过证书检查,java,https,wsdl,Java,Https,Wsdl,用例: 有一个web服务发布为 我想做的是查询这个URI,如果我得到一个有效的WSDL,我将返回一个布尔值“true”或“false”。 现在,如果我通过Chrome浏览器访问这个URL,我必须手动对证书发出接受警告,然后下载WSDL。但是如何通过Java/HttpsURLConnection实现这一点呢 import java.net.URL; import java.io.*; import javax.net.ssl.HttpsURLConnection; public class Ja

用例: 有一个web服务发布为

我想做的是查询这个URI,如果我得到一个有效的WSDL,我将返回一个布尔值“true”或“false”。 现在,如果我通过Chrome浏览器访问这个URL,我必须手动对证书发出接受警告,然后下载WSDL。但是如何通过Java/HttpsURLConnection实现这一点呢

import java.net.URL;
import java.io.*;
import javax.net.ssl.HttpsURLConnection;

public class JavaHttpsExample
{
  public static void main(String[] args)
  throws Exception
  {
    String httpsURL = "https://a.b.c.d/zz/V2.0/api?wsdl";
    URL myurl = new URL(httpsURL);
    HttpsURLConnection con = (HttpsURLConnection)myurl.openConnection();
    InputStream ins = con.getInputStream();
    InputStreamReader isr = new InputStreamReader(ins);
    BufferedReader in = new BufferedReader(isr);

    String inputLine;

    while ((inputLine = in.readLine()) != null)
    {
      System.out.println(inputLine);
    }

    in.close();
  }
}
我得到一个错误:

线程“main”javax.net.ssl.SSLHandshakeException中的异常: java.security.cert.CertificateException:没有主题替代名称 在找到匹配的IP地址a.b.c.d com.sun.net.ssl.internal.ssl.Alerts.getSSLException(未知源) 位于com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(未知源) 位于com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(未知源) 位于com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(未知源) 在 com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(未知) 来源)在 com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(未知 来源)在 com.sun.net.ssl.internal.ssl.Handshaker.processLoop(未知源) 位于com.sun.net.ssl.internal.ssl.Handshaker.process_记录(未知 来源)在 com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(未知源) 在 com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(未知 来源)在 com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(未知 来源)在 com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(未知 来源)在 sun.net.www.protocol.https.HttpsClient.afterConnect(未知源) 在 sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(未知 来源)在 sun.net.www.protocol.http.HttpURLConnection.getInputStream(未知 来源)在 sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(未知 源代码)在javaHttpSexSample.main(javaHttpSexSample.java:14)处,由以下原因引起: java.security.cert.CertificateException:没有主题替代名称 在找到匹配的IP地址a.b.c.d sun.security.util.HostnameChecker.matchIP(未知源)位于 sun.security.util.HostnameChecker.match(未知源)位于 com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkIdentity(未知 来源)在 com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(未知 (来源)


我已经用a.b.c.d(当然)替换了真正的IP。

只需实现您自己的信任管理器,如下面的代码所示

import java.net.URL;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.io.*;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

public class JavaHttpsExample
{
  public static void main(String[] args)
  throws Exception
  {
    String httpsURL = "https://a.b.c.d/zz?wsdl";
    URL myurl = new URL(httpsURL);
    SSLContext ssl = SSLContext.getInstance("TLSv1");
    ssl.init(null, new TrustManager[]{new SimpleX509TrustManager()}, null);
    SSLSocketFactory factory = ssl.getSocketFactory();


    HttpsURLConnection con = (HttpsURLConnection)myurl.openConnection();
    con.setSSLSocketFactory(factory);
    InputStream ins = con.getInputStream();
    InputStreamReader isr = new InputStreamReader(ins);
    BufferedReader in = new BufferedReader(isr);

    String inputLine;

    while ((inputLine = in.readLine()) != null)
    {
      System.out.println(inputLine);
    }

    in.close();
  }
}

class SimpleX509TrustManager implements X509TrustManager {
    public void checkClientTrusted(
            X509Certificate[] cert, String s)
            throws CertificateException {
    }

    public void checkServerTrusted(
            X509Certificate[] cert, String s)
            throws CertificateException {
      }

    @Override
    public X509Certificate[] getAcceptedIssuers() {
        // TODO Auto-generated method stub
        return null;
    }

}

不要使用存根的TrustManager,因为这会使您的应用程序信任所有人。我建议您下载该站点提供的证书,并将其添加到一个私有的、受信任的密钥库中。这样,您就可以为一个站点破例,而不必为所有人打开绿灯

我也喜欢这种方法,因为它不需要更改代码

在Chrome中,单击url左侧的锁定图标。然后单击“证书信息”。转到“详细信息”选项卡并单击“复制到文件”。将其另存为“base64编码的X.509(.cer)”到“SITENAME.cer”

将$JAVA_HOME/lib/security/cacerts作为“mykeystore.jks”复制到应用程序的目录中

使用以下内容安装证书:

keytool -keystore mykeystore.jks -storepass changeit -importcert -alias SITENAME -trustcacerts -file SITE.cer
现在,当您运行应用程序时,告诉它使用私有证书存储:

java -Djavax.net.ssl.trustStore=mykeystore.jks ...

这就是经验和业余爱好者之间的区别:)很好的回答在Chrome 47中,据我所知,不可能再保存证书了。但是,这一步可以用Firefox完成。@simon我可以在Chrome 47和48上使用它。现在,如果你在Mac上,而不是“复制到文件”“您必须将证书图标拖到桌面或查找窗口,这将创建.cer文件。在上面的源代码中,“SimpleX509TrustManager”来自哪里?”?