【发布时间】:2011-10-23 02:57:02
【问题描述】:
服务器端给了我一个.p12 证书文件,我点击并安装在我的机器上,然后我可以通过浏览器访问HTTPS 站点。现在他们希望我使用给定的证书抓取他们的网站。我被困在它的第一阶段,试图从httpsURLConnection 获取inputStream。该网站没有登录。它只检查你是否有证书。
到目前为止,我所做的是使用 Firefox 以 .crt 文件格式导出证书。然后我使用 keytool 命令将它(.crt 文件,而不是 .p12)导入到 java 密钥库中。然后在代码中:
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
File ksFile = new File(keystorePath);
in = new FileInputStream(ksFile);
ks.load(in, "changeit".toCharArray());
X509Certificate cert = (X509Certificate) ks.getCertificate(certificateAlias);
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
HttpsURLConnection con = (HttpsURLConnection) (new URL(urlString)).openConnection();
con.connect();
con.getInputStream();
con.disconnect();
getInputStream() 会给我 403 错误禁止访问。我搜索了其他相关主题,实际上比阅读它们之前更加困惑。非常感谢您的回答。
其他细节:
- 我刚刚实例化了证书,并没有让程序知道任何类型的密钥(私有、公共等)。所以我认为我必须将这些密钥提供给服务器,让它知道我实际上持有证书。我完全不知道如何做到这一点,无论是逻辑还是语法。
- 我已尝试使用 keytool 命令将 .p12 证书文件导入密钥库,但不知何故,keytool 无法识别 -pkcs12 选项。关于如何直接使用这个 .p12 证书的任何想法也很好。
- trustAllCert 是 TrustMangers 的单元素数组,它不验证任何内容(全部信任)。我不知道我是否应该继续使用这个。事实上,现在我实际上只有一个证书可以信任。在这种情况下,编写 trustManger 的正确方法是什么?
- 我无法控制服务器端。我得到的只是访问他们网站的 URL,这是在 HTTPS 协议下的,以及一个 .p12 证书。该网站没有登录。如果安装了证书,我就可以进去了。
【问题讨论】:
标签: java https certificate