当前位置: 首页 > 面试题库 >

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

乜清野
2023-03-14
问题内容

服务器端给了我一个.p12证书文件,我单击该证书并将其安装在计算机上,然后可以HTTPS通过浏览器访问该站点。现在他们希望我使用给定的证书来爬网其网站。我卡在它的第一个阶段,试图让inputStreamhttpsURLConnection。该站点没有登录。它仅检查您是否具有证书。

到目前为止,我所做的就是使用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 cert文件导入密钥库,但不知何故,keytool无法识别-pkcs12选项。关于如何直接使用此.p12证书的任何想法也将很好。
  • trustAllCert是一个不验证任何内容(全部信任)的TrustMangers的单元素数组。我不知道我是否应该继续使用它。实际上,现在我实际上只有一个证书可以信任。在这种情况下,编写trustManger的正确方法是什么?
  • 我无法控制服务器端。我得到的只是用于访问其站点的URL(根据HTTPS协议)和.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导出密钥。

目前,我没有设置服务器来测试此代码,因此请试一下,看看是否仍然收到403错误。



 类似资料:
  • 我的连接代码如下所示: 干杯,马尔辛

  • 问题内容: 我在java和cxf中有一个用客户端证书连接到WebServices的应用程序。 我从WebService所有者那里获得了证书 证书 证书 certificate.crt Trusted_ca.cer root_ca.cer 我直接将这个p12证书转换为java要求的有效jks密钥库时遇到问题。 我这样做: 但是此jks不起作用,使用此证书时我收到HTTP响应‘403:Forbidde

  • 我在Java中与SSL连接有问题。 我使用java 1.7.80和S. O.: ubuntu 14.04 我的问题是证书,甚至证书。我有四个必须使用pkcs12格式连接的元素。 -- -- -- -- 1) 步骤-将文件cer转换为文件pem 2)步骤-创建链证书的联合pem文件 3)步骤-创建p12文件 好啊我的第一个测试是在浏览器(Mozilla Firefox)中导入p12文件以验证操作。导

  • 我在java和cxf中有应用程序,它通过客户端证书连接到Web服务。 我有WebService所有者的证书 证书。p12 证书。pem 证书。crt 受信任的核证机关 根癌 我无法直接将此p12证书转换为java要求的工作jks密钥库。 我是这样做的: 但是这个jks不工作,我得到HTTP响应403:禁止使用这个certificate1.jks 但是,如果我将此p12(pfx)证书导入Intern

  • 我有一个react本机项目,我必须使用为https请求创建本机模块。p12认证,但我从未使用Objective-C(有点复杂)或Swift。我找到了一个用于https请求的类,但我没有使用这个类,因为我没有证书。h文件和我的项目文件夹; 我的桥。H 我的桥。M 它作为基本的get请求工作,但当我尝试https服务时,我需要为每个请求固定一个证书。我如何发送此案例的请求?