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

时间:2013-12-07 14:06:38

标签: java ssl https get ssl-certificate

以下代码段是从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中没有。我应该执行哪些步骤?需要你的建议:)

提前致谢。

2 个答案:

答案 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()方法体中添加此代码。