(Java) Не требуется SSL-сертификат был отправлен (отлично работает при использовании в вызове curl) - PullRequest
0 голосов
/ 28 февраля 2019

Итак, я пытаюсь проверить соединение с веб-сервером моей компании (используя двухсторонний SSL) с помощью сертификата клиента в программе Java.Я попытался использовать тот же сертификат в вызове curl (разделенный сертификат и ключ), и мне удалось получить желаемый ответ.Но когда я попытался использовать его в своей Java-программе (объединенной в формат pkcs12), он выдает ответ 400, в котором говорится, что сертификат SSL не был отправлен.Почему это происходит?

public static void main(String[] args) {
    System.out.println("Taufiq's mutual SSL-authentication test");
    org.apache.log4j.BasicConfigurator.configure();
    Logger.getRootLogger().setLevel(Level.INFO);

    try {
        final String CERT_ALIAS = "something", CERT_PASSWORD = "something";

        KeyStore identityKeyStore = KeyStore.getInstance("pkcs12");
        FileInputStream identityKeyStoreFile = new FileInputStream(new File("src/Cert.p12"));
        identityKeyStore.load(identityKeyStoreFile, CERT_PASSWORD.toCharArray());

        KeyStore trustKeyStore = KeyStore.getInstance("jks");
        FileInputStream trustKeyStoreFile = new FileInputStream(new File("src/truststore.jks"));
        trustKeyStore.load(trustKeyStoreFile, CERT_PASSWORD.toCharArray());

        SSLContext sslContext = SSLContexts.custom()
            // load identity keystore
            .loadKeyMaterial(identityKeyStore, CERT_PASSWORD.toCharArray(), new PrivateKeyStrategy() {
                @Override
                public String chooseAlias(Map<String, PrivateKeyDetails> aliases, Socket socket) {
                    return CERT_ALIAS;
                }
            })
            // load trust keystore
            .loadTrustMaterial(trustKeyStore, null)
            .build();

        SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext,
            new String[]{"TLSv1.2", "TLSv1.1"},
            null,
            SSLConnectionSocketFactory.getDefaultHostnameVerifier());

        CloseableHttpClient client = HttpClients.custom()
            .setSSLSocketFactory(sslConnectionSocketFactory)
            .build();

        // Call a SSL-endpoint
        callEndPoint (client);
    } catch (Exception ex) {
        System.out.println("Boom, we failed: " + ex);
        ex.printStackTrace();
    }
}

private static void callEndPoint(CloseableHttpClient aHTTPClient) {

    try {          
        String ServerUrl = "My Company URL";
        System.out.println("Calling URL: " + ServerUrl);
        HttpPost post = new HttpPost(ServerUrl);
        post.setHeader("Content-type", "application/json");

        System.out.println("**POST** request Url: " + post.getURI());

        HttpResponse response = aHTTPClient.execute(post);

        int responseCode = response.getStatusLine().getStatusCode();
        System.out.println("Response Code: " + responseCode);
        System.out.println("Content:-\n");
        BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
        String line;
        while ((line = rd.readLine()) != null) {
            System.out.println(line);
        }
    } catch (Exception ex) {
        System.out.println("Boom, we failed: " + ex);
        ex.printStackTrace();
    }

}

Пример вызова Curl: curl -v --key key.pem --pass ****** --cert cert.pem MyCompanyURL

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Оказывается, программа работает нормально, когда я использовал основные классы jdk jsse.Я использовал вышеуказанную программу, потому что копировал один из примеров из Интернета.

0 голосов
/ 28 февраля 2019

Полагаю, вы знаете, как работают рукопожатия.Если нет, познакомьтесь.Затем используйте wireshark, чтобы увидеть рукопожатие SSL.Вы получите гораздо более подробную информацию о ssl-предупреждениях, чем какая-то чертова интерпретация http-библиотеки.Во всяком случае, это ошибочная ошибка.

Несомненно, ваш сервер должен доверять вашему клиентскому сертификату, поэтому я предполагаю, что у вас все настроено правильно;вы говорите, что пробовали curl, но не сказали, работает ли он.

Наконец, я не распознаю эти классы SSL, поэтому вы импортируете что-то другое, чем классы jdk jdk;Вы можете стать жертвой такой библиотеки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...