如何以编程方式添加自签名证书以从java代码发出HTTPS请求?
以下代码片段用于从如何以编程方式添加自签名证书以从java代码发出HTTPS请求?,java,ssl,https,get,ssl-certificate,Java,Ssl,Https,Get,Ssl Certificate,以下代码片段用于从HTTPURL获取JSon响应: private static void getJson(String location) { try { try { createSSLSocket(); URL url = new URL( "https://abc.com/key/one"); HttpURLConnection conn = (HttpU
HTTP
URL获取JSon
响应:
private static void getJson(String location) {
try {
try {
createSSLSocket();
URL url = new URL(
"https://abc.com/key/one");
HttpURLConnection conn = (HttpURLConnection) url
.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Accept", "application/json");
if (conn.getResponseCode() != 200) {
throw new RuntimeException("Failed : HTTP error code : "
+ conn.getResponseCode());
}
BufferedReader br = new BufferedReader(new InputStreamReader(
(conn.getInputStream())));
String output;
System.out.println("Output from Server .... \n");
while ((output = br.readLine()) != null) {
System.out.println(output);
}
conn.disconnect();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
但是它抛出了SSLHandshaking
异常,因为我没有在代码中添加自签名证书异常。我在C#
中做过这件事,但在java中没有。我应该执行哪些步骤?需要你的建议:)
提前感谢。要为自签名证书添加信任,您可以创建一个
truststore
java密钥库文件,并将javax.net.ssl.truststore
属性设置为指向此文件。openConnection
方法将检查信任库以查看证书是否可信
要创建信任库文件,可以使用JDK中的keytool
命令,该命令应位于JAVA\u HOME/bin
目录中
keytool -import -file yourcert.cert -alias abc -keystore truststore.jks
如果要编辑信任库,该命令将提示您输入所需的密码。输入密码后,它将创建一个truststore.jks
文件。要以编程方式在Java中设置信任库,您可以使用-Djavax.net.ssl.truststore=/path/truststore.jks
将其作为属性传递,也可以调用System.setProperty
System.setProperty("javax.net.ssl.trustStore", "/path/truststore.jks");
要查看Java使用的ssl属性,请查看。您可以将
HttpsURLConnection
套接字工厂配置为接受所有证书而不进行任何验证:
private class TrustAll implements X509TrustManager
{
public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException
{
}
public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException
{
}
public X509Certificate[] getAcceptedIssuers()
{
return new X509Certificate[0];
}
}
SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(null, new TrustManager[] { new TrustAll() }, null);
HttpsURLConnection.setDefaultSSLSocketFactory(ctx.getSocketFactory());
更新
您只需在应用程序开始时调用此代码一次。使用
URL.openConnection()
打开的所有HTTPS连接都将使用此套接字工厂。另一种解决方案是在createSSLSocket()
方法体中添加此代码。您的意思是服务器证书是自签名的,这就是连接失败的原因吗?SSLHandshakeException中包含的失败原因是什么?@jcs是服务器端连接是自签名的,错误如下:无法找到请求目标的有效认证路径
@jcs我们可以按程序进行吗?是,我添加了一个带有代码片段的答案。谢谢你的回答,但是你能告诉我应该如何连接到getJson方法(有疑问地写)吗?我更新了答案。实际上,您没有太多的代码需要更改。因此,在此之后,我可以使用HttpURLConnection conn=(HttpURLConnection)url.openConnection()代码>?是的,SSL套接字工厂是全局设置的。请注意,这种技术根本不安全。你应该采纳@cyon的建议。