下面,我包含了将证书的指纹作为参数,然后从Windows证书存储区加载适当的证书的代码。
之所以这样做,是因为现在我想使用找到的证书来对需要此证书的API进行API调用-如果该请求中未包含该证书,则该API将拒绝我为未经授权。
之前,我已经在C#中完成了此操作,这非常简单,因为我可以创建一个clientHandler来标识允许创建可用HttpClient的协议,回调和证书。 Java显然要复杂得多,并且给我带来了问题,因为看来我必须使用keymanager
(可能还有trustStore
和SSLContext
)。换句话说,我很难理解如何使用这些对象根据我的请求将证书发送到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();
}