java - 使用给定的 p12 证书连接到 https 站点

标签 java https certificate

服务器端给了我一个 .p12 证书文件,我点击并安装在我的机器上,然后我可以通过浏览器访问 HTTPS 站点。现在他们希望我使用给定的证书抓取他们的网站。我被困在它的第一阶段,试图从 httpsURLConnection 获取 inputStream。该网站没有登录。它只检查你是否有证书。

到目前为止,我所做的是使用 Firefox 以 .crt 文件格式导出证书。然后我使用 keytool 命令将它(.crt 文件,而不是 .p12)导入 java keystore 。然后在代码中:

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 错误禁止访问。我搜索了其他相关主题,实际上比阅读它们之前更加困惑。非常感谢您的回答。

其他细节:

  • 我只是实例化了证书,并没有让程序知道任何类型的 key (私钥、公钥等)。所以我认为我必须将这些 key 提供给服务器,让它知道我实际上持有证书。我完全不知道如何做到这一点,无论是逻辑还是语法。
  • 我已尝试使用 keytool 命令将 .p12 证书文件导入 keystore ,但不知何故,keytool 无法识别 -pkcs12 选项。关于如何直接使用这个 .p12 证书的任何想法也很好。
  • trustAllCert 是 TrustMangers 的单元素数组,它不验证任何内容(全部信任)。我不知道我是否应该继续使用这个。事实上,现在我实际上只有一个证书可以信任。在这种情况下,编写 trustManger 的正确方法是什么?
  • 我无法控制服务器端。我得到的只是访问他们网站的 URL,这是在 HTTPS 协议(protocol)下的,以及一个 .p12 证书。该网站没有登录。如果安装了证书,我就可以进去了。

最佳答案

如果您想尝试编写 SSL 配置,您可以使用提供给您的 P12 文件,而无需将其转换为 JKS。此外,您将需要使用 P12 中的私钥,而不仅仅是复制到 JKS 中的证书。不确定这是否会直接满足您的需求,但这可能会让您走上正确的道路:

        KeyStore clientStore = KeyStore.getInstance("PKCS12");
        clientStore.load(new FileInputStream("test.p12"), "testPass".toCharArray());

        KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
        kmf.init(clientStore, "testPass".toCharArray());
        KeyManager[] kms = kmf.getKeyManagers();

        KeyStore trustStore = KeyStore.getInstance("JKS");
        trustStore.load(new FileInputStream("cacerts"), "changeit".toCharArray());

        TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        tmf.init(trustStore);
        TrustManager[] tms = tmf.getTrustManagers();

        SSLContext sslContext = null;
        sslContext = SSLContext.getInstance("TLS");
        sslContext.init(kms, tms, new SecureRandom());

        HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
        URL url = new URL("https://www.testurl.com");

        HttpsURLConnection urlConn = (HttpsURLConnection) url.openConnection();

以这种方式配置 trustStore 是可选的。您可以使用 P12 链中的所有证书创建一个 JKS,或者只是确保它们在您的 JRE 的 cacerts 文件中。至于keytool,作为引用,您可以在P12上运行keytool命令(指定-storetype pkcs12),但不能将P12导入JKS。您也不能使用 keytool 命令从 P12 中仅导出一个 key 。

我目前没有设置服务器来测试这段代码,所以试一试,看看你是否仍然收到 403 错误。

关于java - 使用给定的 p12 证书连接到 https 站点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6994944/

相关文章:

java - SOA是否可以是Java Bean?

php - 为 php 网站创建一个安全的仅限管理员的部分

Node.JS 请求 - 无效的 URI "/"

java - getLocalCertificates() 返回 null

svn - 将新的可信 CA 添加到 Netbeans SVN 管理器

java - 如何模拟无法在测试中实例化的对象?

java - 如何使用托管 bean 读取/写入(配置)Notes 文档的示例?

java - 将 JTextArea 内容写入文件

angular - 授权 header 未通过 HTTPS 加密

ruby-on-rails - 使用 OpenSSL 读取证书文件时出现 Ruby 错误