Используйте сертификат для выполнения запросов API в Java - PullRequest
0 голосов
/ 07 ноября 2018

Ниже я включил код, который принимает отпечаток сертификата в качестве аргумента, а затем загружает соответствующий сертификат из хранилища сертификатов 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...