Ниже я включил код, который принимает отпечаток сертификата в качестве аргумента, а затем загружает соответствующий сертификат из хранилища сертификатов Windows.
Это было сделано, потому что теперь я хотел бы использовать найденный сертификат для выполнения вызовов API для API, который требует этот сертификат - если сертификат не включен в запрос, API отклонит меня как неавторизованный.
Ранее я делал это в C #, и это было довольно просто, поскольку я мог просто создать clientHandler, который идентифицировал протокол, обратный вызов и сертификат, который позволял создавать пригодный для использования HttpClient. Java значительно сложнее и вызывает у меня проблемы, поскольку кажется, что я должен работать с keymanager
(и, возможно, trustStore
и SSLContext
). Другими словами, мне трудно понять, как использовать эти объекты для отправки моего сертификата в API с моим запросом.
Я понимаю, что, возможно, не смогу просто создать клиент с сертификатом для получения успешного соединения. Но как я могу использовать сертификат x509, который у меня есть в памяти, для успешной отправки запросов в API.
Я не ищу решение, которое будет работать на 100% для моего случая, я просто хотел бы увидеть чистый пример того, как отправить запрос API с сертификатом (в зависимости от того, какой библиотека требует) в Java.
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();
}