以下代码段是从JSon
网址获取HTTP
响应:
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中没有。我应该执行哪些步骤?需要你的建议:)
提前致谢。
答案 0 :(得分:4)
要为自签名证书添加信任,您可以创建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属性,请查看here。
答案 1 :(得分:3)
您可以将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()
方法体中添加此代码。