Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何以编程方式添加自签名证书以从java代码发出HTTPS请求?_Java_Ssl_Https_Get_Ssl Certificate - Fatal编程技术网

如何以编程方式添加自签名证书以从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的建议。