【问题标题】:Accessing URL from Java requiring certificate [duplicate]从需要证书的 Java 访问 URL [重复]
【发布时间】:2018-01-21 22:46:33
【问题描述】:

我对证书一无所知,如果我做错了什么,我将不胜感激......不幸的是,我无法在 StackOverflow 的其余部分或网络上的其他地方找到解决方案。

我有一个 URL(使用 HTTPS),我应该从中获得响应。 (在我的例子中是一张图片,但我确信这不那么重要。)

这就是我所做的:

1。从网络浏览器访问 URL

它以 HTTP 代码 403“禁止”响应。

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

2。安装证书并从浏览器重试

双击 PFX 文件会打开“证书导入向导”(Windows 10)。继续,然后重新启动。

现在 Chrome 可以正常检索资源。 Firefox 仍然显示 403,因此在选项 > 高级 > 证书 > 查看证书下我导入了 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)

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

【问题讨论】:

标签: java https certificate


【解决方案1】:

我再次将证书从 Chrome 导出为这种格式。

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

【讨论】:

  • 我不了解有关私钥包含在 PFX 但不包含在 CER 文件中的方面。感谢您的建议,我能够通过指向 PKCS12 类型的原始 PFX 文件来运行我的示例代码。
  • 就这么简单:私钥包含在 PFX 中,但不包含在 CER 文件中。 PFX 文件是一个密钥库,CER 文件只是一个证书。证书是公钥的包装。私钥是独立的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-21
  • 1970-01-01
  • 1970-01-01
  • 2011-05-25
  • 2011-05-10
  • 2016-11-19
  • 1970-01-01
相关资源
最近更新 更多