如何以编程方式添加自签名证书以从java代码发出HTTPS请求?

以下代码片段是从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(); } } 

但它抛出了SSLHandshakingexception,因为我没有在代码中添加自签名认证exception。 我在C#完成了这个,但在java中没有。 我应该执行哪些步骤? 需要你的建议:)

提前致谢。

您可以将HttpsURLConnection套接字工厂配置为接受所有证书而无需任何validation:

 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()); 

UPDATE

您只需在应用程序开始时调用此代码一次。 使用URL.openConnection()打开的所有HTTPS连接都将使用此套接字工厂。 另一种解决方案是在createSSLSocket()方法体中添加此代码。

要为自签名证书添加信任,可以创建truststore库java密钥库文件,并将javax.net.ssl.trustStore属性设置为指向此文件。 openConnection方法将检查信任库以查看证书是否可信任。

要创建信任库文件,可以使用keytool命令,该命令是JDK的一部分,应该位于JAVA_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属性,请查看此处 。