用例:有一个发布为https:// abcd /
zz?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 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();
}
}
我得到一个错误:
线程“主”中的异常javax.net.ssl.SSLHandshakeException:java.security.cert.CertificateException:找不到与com.sun.net.ssl.internal.ssl.Alerts.getSSLException的IP地址abcd匹配的使用者替代名称(未知源)的com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(未知源)的com.sun.net.ssl.internal.ssl的Handshaker.fatalSE(未知源)的com.sun.net.ssl的。
com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(未知源)位于com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(未知源)
),位于com.sun.net.ssl.internal.ssl的com.sun.net.ssl.internal.ssl.Handshaker.processLoop(未知源)。
internal.ssl.SSLSocketImpl。com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(未知源)处的com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(未知源)处的readRecord(未知源)。
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(未知源)在Java.HttpsExample.main(JavaHttpsExample.java:14)处:java.security.cert.CertificateException:在sun.security.util.HostnameChecker上找不到与IP地址abcd匹配的主题备用名称。位于com.sun.net.ssl.internal.ssl的sun.security.util.HostnameChecker.match(未知源)的matchIP(未知源)。
ssl.X509TrustManagerImpl.checkServerTrusted(未知来源)
我已经用abcd替换了真实IP(当然)
不要使用残缺的TrustManager,因为这会使您的应用程序信任 所有人
。我建议下载该网站提供的证书,并将其添加到一个受信任的私有密钥库中。这样一来,您可以为该站点设置例外,而无需所有人批准。
我也喜欢这种方法,因为它不需要更改代码。
在Chrome浏览器中,点击网址左侧的锁定图标。然后单击“证书信息”。转到“详细信息”选项卡,然后单击“复制到文件”。将其另存为“
SITENAME.cer”作为“ base64编码的X.509(.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 ...
尽管我保留了verify=false,但在Python中还是出现了ssl错误。你能告诉我如何避免吗?但是curl命令使用-k选项。 错误:
问题内容: 在Python中,我使用了这样的请求: 非常简单。 现在,我需要使用Apache HttpClient在Java中实现相同的功能。使用HttpClient进行请求时如何通过客户端证书? 问题答案: 我认为主要区别在于,在Java中,通常将密钥和证书放在密钥存储区中,然后从那里使用它。就像您提到的那样,人们经常希望为此使用单独的库,例如提到的httpcomponents客户端(就像您在p
问题内容: 我在JBOSS中有一个客户端服务器通信方案,并且在浏览器中作为客户端( JAVA PROGRAM )。最初在建立连接时,客户端将其证书发送到服务器。服务器从证书中提取客户端的公钥,因此通信将继续。 现在我的问题是 如何将证书(.cer)从客户端发送到服务器? 如何在服务器中接收证书并提取其公钥? 问题答案: 如何将证书(.cer)从客户端发送到服务器? 客户端证书(.cer,.crt,
我希望在构建项目时忽略证书。我正在努力做类似的事情。 我收到下面的信息。有人能帮我在构建过程运行时忽略证书吗? 解压缩 /root/.gradle/wrapper/dists/gradle-3.5-bin/daoimhu7k5rlo48ntmxw2ok3e/gradle-3.5-bin.zip /root/.gradle/wrapper/dists/gradle-3.5-bin/daoimhu7k
问题内容: 我正在使用Java 6,并尝试使用客户端证书针对远程服务器创建一个。 服务器正在使用自签名的根证书,并且要求提供受密码保护的客户端证书。我已将服务器根证书和客户端证书添加到在中找到的默认Java密钥库中。密钥库文件的名称似乎表明不应将客户端证书放入其中? 无论如何,将根证书添加到此存储解决了臭名昭著的问题 但是,我现在停留在如何使用客户端证书上。我尝试了两种方法,但都无济于事。 首先,
问题内容: 我们的系统与多个Web服务提供商进行通信。它们都是从单个Java客户端应用程序调用的。到目前为止,所有的Web服务都已通过SSL进行,但是没有一个使用客户端证书。好吧,一个新的合作伙伴正在改变这一现状。 使应用程序使用证书进行调用很容易;设置和将做到这一点。但是,现在的问题是如何制作它,使其仅在调用该特定Web服务时使用证书。我想更一般地说,我们希望能够选择要使用的客户端证书(如果有)