从Java需要证书访问URL
我对证书相当无知,并将不胜感激关于我做错什么的任何指导......不幸的是,我无法找到其他StackOverflow或Web上其他地方的解决方案。从Java需要证书访问URL
我有一个URL(使用HTTPS),我应该从中获得响应。 (在我的情况的图像,但我敢肯定,这是不那么重要)
这里就是我所做的:
1.从Web浏览器访问URL
与HTTP代码它响应403“禁止访问” 。
我获得了访问该URL所需的证书(* .pfx文件)。
2.安装证书,并从浏览器再次尝试在PFX文件
双击打开“证书导入向导”(视窗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)
的响应和时间表明,这是类似于无证书的浏览器。我究竟做错了什么?
我再次从Chrome导出证书到这种格式。
此时您丢失了包含在.pfx文件中的私钥,因此您无法将证书发送到服务器。您应该直接导入.pfx文件作为自己的密钥库,键入PKCS12,或者直接通过javax.net.ssl.keyStore/keyStoreType/keyStorePassword
直接使用它。请参阅this question了解如何操作。
您需要配置UrlConnection的密钥库。请参阅https://stackoverflow.com/questions/3734613/how-to-request-a-url-that-requires-a-client-certificate-for-authentication – pedrofb