使用证书以Java发出API请求

时间:2018-11-07 01:03:22

标签: java ssl

下面,我包含了将证书的指纹作为参数,然后从Windows证书存储区加载适当的证书的代码。

之所以这样做,是因为现在我想使用找到的证书来对需要此证书的API进行API调用-如果该请求中未包含该证书,则该API将拒绝我为未经授权。 之前,我已经在C#中完成了此操作,这非常简单,因为我可以创建一个clientHandler来标识允许创建可用HttpClient的协议,回调和证书。 Java显然要复杂得多,并且给我带来了问题,因为看来我必须使用keymanager(可能还有trustStoreSSLContext)。换句话说,我很难理解如何使用这些对象根据我的请求将证书发送到API。

我意识到我可能无法简单地使用证书构建客户端来获得成功的连接。但是如何使用内存中的x509证书将请求成功发送到API。

我不是在寻找一种可以100%适用于我的情况的解决方案,我只想看一个干净的示例,该示例说明如何使用Java发送带有证书的API请求(无论哪种库要求)。 / p>

 public static X509Certificate LoadCert(String inThumbprint) {

    X509Certificate ReturnCert = null;

    try{
        KeyStore keyStore = KeyStore.getInstance("Windows-MY");
        keyStore.load(null, null);  // Load keystore

        String currentAlias;
        X509Certificate foundCert;
        String calculatedThumbprint;

        for (Enumeration<String> oEnum = keyStore.aliases(); oEnum.hasMoreElements();) {

            currentAlias = oEnum.nextElement();                                                     System.out.println(currentAlias);
            foundCert = (X509Certificate) keyStore.getCertificate(currentAlias);
            calculatedThumbprint = getThumbprint(foundCert);                                        System.out.println(calculatedThumbprint);

            if (calculatedThumbprint.equals(inThumbprint)) {
                ReturnCert = foundCert;
            }
        }
    } catch (Exception ex){
        ex.printStackTrace();
    }

    return ReturnCert;
}

private static String getThumbprint(X509Certificate cert)
        throws NoSuchAlgorithmException, CertificateEncodingException {

    MessageDigest md = MessageDigest.getInstance("SHA-1");
    byte[] der = cert.getEncoded();
    md.update(der);
    byte[] digest = md.digest();
    String digestHex = DatatypeConverter.printHexBinary(digest);
    return digestHex.toLowerCase();
}

0 个答案:

没有答案