从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) 

的响应和时间表明,这是类似于无证书的浏览器。我究竟做错了什么?

+0

您需要配置UrlConnection的密钥库。请参阅https://stackoverflow.com/questions/3734613/how-to-request-a-url-that-requires-a-client-certificate-for-authentication – pedrofb

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

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

+0

我不明白有关私钥被包含在PFX但不在CER文件中。感谢您的建议,我能够通过指向PKCS12类型的原始PFX文件来运行示例代码。 – fr13d

+1

好吧,它很简单:私钥包含在PFX中,但不包含在CER文件中。 PFX文件是一个密钥库,CER文件只是一个证书。证书是公钥的包装。私钥是分开的。 – EJP