从Java中访问需要证书的URL

时间:2017-08-14 06:36:57

标签: java https certificate

我对证书一无所知,并且对于我做错了什么的指导表示感谢...不幸的是我无法在StackOverflow的其余部分或网络上的其他地方找到解决方案。

我有一个URL(使用HTTPS),我应该从中获得响应。 (在我的情况下是一个图像,但我确定它不那么重要。)

这就是我的所作所为:

1。从Web浏览器访问URL

它响应HTTP代码403"禁止"。

我获得了访问URL所需的证书(* .pfx文件)。

2。安装证书并从浏览器再次尝试

双击PFX文件打开"证书导入向导" (Windows 10)。跟着,然后重新启动。

现在,Chrome可以正确检索资源。 Firefox仍显示403,因此在Options>下高级>证书>查看证书我导入PFX。现在FF也可以恢复资源。

3。在JVM下安装证书

我现在想用Java调用相同的URL。我仍然在Java 7上用于此项目以用于遗留目的。我知道应该使用keytool CLI命令将证书导入Java密钥库。但是,此命令需要DER X509格式的证书。所以我再次从Chrome导出证书到这种格式。

现在运行命令:keytool -import -alias MY_ALIAS -keystore C:/PROGRA~1/Java/jdk1.7.0_80/jre/lib/security/cacerts -file my_cert.cer

执行keytool -list -v -keystore C:/PROGRA~1/Java/jdk1.7.0_80/jre/lib/security/cacerts并检查是否包含所需的证书。

现在我运行我的Java程序:

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.URL;
import java.net.URLConnection;

public class TestUrlRead {    
    private static final String PROXY_URL   = ...;
    private static final int    PROXY_PORT  = ...;
    private static final String IMAGE_URL   = ...;

    public static void main(String[] args) throws Exception {
        Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(PROXY_URL, PROXY_PORT));
        URL url = new URL(IMAGE_URL);
        URLConnection con = url.openConnection(proxy);
        con.setDoOutput(true);
        con.connect();
        InputStream webIn = con.getInputStream(); // <-- causes IOException
        // read and use webIn
        inReader.close();
    }
}

抛出的异常是:

Exception in thread "main" java.io.IOException: Server returned HTTP response code: 403 for URL: ...
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1627)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)
    at TestUrlRead.main(TestUrlRead.java:33)

响应和时间表明这与没有证书的浏览器类似。我做错了什么?

1 个答案:

答案 0 :(得分:0)

  

我再次从Chrome导出证书格式。

此时您丢失了.pfx文件中包含的私钥,因此您无法将证书发送到服务器。您应该直接将.pfx文件作为自己的密钥库导入,键入PKCS12,或者直接通过javax.net.ssl.keyStore/keyStoreType/keyStorePassword直接使用它。有关如何执行此操作,请参阅this question