从需要证书的 Java 访问 URL
Accessing URL from Java requiring certificate
我对证书一无所知,如果有任何关于我做错了什么的指导,我将不胜感激……不幸的是,我无法在 Whosebug 的其余部分或网络上的其他地方找到解决方案。
我有一个 URL(使用 HTTPS),我应该从中获得响应。 (在我的例子中是一张图片,但我确信这不是那么重要。)
这是我所做的:
1。从网络浏览器访问 URL
它以 HTTP 代码 403 响应 "Forbidden"。
我获得了访问 URL.
所需的证书(*.pfx 文件)
2。正在安装证书并从浏览器重试
双击 PFX 文件打开 "Certificate Import Wizard" (Windows 10)。跟随,然后重启。
现在 Chrome 可以很好地检索资源。
Firefox 仍然显示 403,因此在选项 > 高级 > 证书 > 查看证书下我导入了 PFX。现在FF也returns资源好了
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)
响应和时间表明这类似于没有证书的浏览器。我做错了什么?
I export the cert again from Chrome into this format.
此时您丢失了包含在 .pfx 文件中的私钥,因此您无法将证书发送到服务器。您应该直接将 .pfx 文件导入为它自己的密钥库,键入 PKCS12,或者实际上只是通过 javax.net.ssl.keyStore/keyStoreType/keyStorePassword
直接使用它。请参阅 this question 了解如何执行此操作。
我对证书一无所知,如果有任何关于我做错了什么的指导,我将不胜感激……不幸的是,我无法在 Whosebug 的其余部分或网络上的其他地方找到解决方案。
我有一个 URL(使用 HTTPS),我应该从中获得响应。 (在我的例子中是一张图片,但我确信这不是那么重要。)
这是我所做的:
1。从网络浏览器访问 URL
它以 HTTP 代码 403 响应 "Forbidden"。
我获得了访问 URL.
所需的证书(*.pfx 文件)2。正在安装证书并从浏览器重试
双击 PFX 文件打开 "Certificate Import Wizard" (Windows 10)。跟随,然后重启。
现在 Chrome 可以很好地检索资源。 Firefox 仍然显示 403,因此在选项 > 高级 > 证书 > 查看证书下我导入了 PFX。现在FF也returns资源好了
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)
响应和时间表明这类似于没有证书的浏览器。我做错了什么?
I export the cert again from Chrome into this format.
此时您丢失了包含在 .pfx 文件中的私钥,因此您无法将证书发送到服务器。您应该直接将 .pfx 文件导入为它自己的密钥库,键入 PKCS12,或者实际上只是通过 javax.net.ssl.keyStore/keyStoreType/keyStorePassword
直接使用它。请参阅 this question 了解如何执行此操作。