Исключение рукопожатия SSL: Сбой рукопожатия с фатальным оповещением - PullRequest
0 голосов
/ 17 мая 2018

Я пытаюсь выполнить следующую команду curl с использованием Java и Retrofit.

curl -k -d "grant_type=client_cert" -H "Authorization: Basic Base64EncodedValue" -H "Content-Type: application/x-www-form-urlencoded" --cert ./certificate.pem https://taget-domain.com

В этот момент, когда используется код Java (см. Ниже), я получаюошибка:

HTTP FAILED: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure

Полная трасса отправлена ​​ здесь .

Код загружает хранилище локальных ключей, создаетфабрика диспетчера доверия и устанавливает контекст SSL с использованием фабрики диспетчера доверия.Затем конфигурация Retrofit извлекает диспетчер доверия X509 и настраивает HTTP-клиента на использование фабрики сокетов контекста SSL и диспетчера доверия X509.

Кто-нибудь знает, что является или может быть проблемой и соответствующим решением?

Ниже приведены два соответствующих фрагмента кода Java:

Конфигурация сертификата

public KeyStore keyStore(ConfigurableApplicationContext applicationContext)
            throws CertificateException, IOException, NoSuchAlgorithmException, KeyStoreException {

        CertificateFactory certificateFactory = CertificateFactory.getInstance(getType());

        Certificate certificate;

        try (InputStream in = applicationContext.getResource(getCertificateResource())
                .getInputStream()) {

            certificate = certificateFactory.generateCertificate(in);
        }

        // Configure key store.
        String cacertsPath = System.getProperty("cacerts");
        String keyStoreType = KeyStore.getDefaultType();
        KeyStore keyStore = KeyStore.getInstance(keyStoreType);
        Path keyStorePath = Paths.get(cacertsPath);
        keyStore.load(Files.newInputStream(keyStorePath), getKeyStorePassword().toCharArray());
        keyStore.setCertificateEntry("certificateAlias", certificate);

        return keyStore;
}

public TrustManagerFactory trustManagerFactory(@Qualifier("keyStore") KeyStore keyStore)
            throws KeyStoreException, NoSuchAlgorithmException {

        // Configure trust manager factory.
        String trustManagerFactoryAlgo = TrustManagerFactory.getDefaultAlgorithm();
        TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(trustManagerFactoryAlgo);
        trustManagerFactory.init(keyStore);

        return trustManagerFactory;
}

public SSLContext sslContext(
            @Qualifier("trustManagerFactory") TrustManagerFactory trustManagerFactory)
            throws NoSuchAlgorithmException, KeyManagementException {

        X509TrustManager x509TrustManager = (X509TrustManager) trustManagerFactory.getTrustManagers()[0];

        // Configure SSL context.
        SSLContext sslContext = SSLContext.getInstance(getProtocol());
        sslContext.init(null, new TrustManager[]{x509TrustManager}, null);

        return sslContext;
}

Модифицированная конфигурация

public OkHttpClient authOkHttpClient(@Qualifier("sslContext") SSLContext sslContext, @Qualifier("trustManagerFactory")
      TrustManagerFactory trustManagerFactory) {

    // Configure OkHttp3 logging.
    HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
    httpLoggingInterceptor.setLevel(Level.BODY);

    // Configure HTTP client.
    OkHttpClient.Builder httpClientBuilder = new OkHttpClient.Builder();
    httpClientBuilder.addInterceptor(httpLoggingInterceptor);
    X509TrustManager x509TrustManager = (X509TrustManager) trustManagerFactory.getTrustManagers()[0];
    httpClientBuilder.sslSocketFactory(sslContext.getSocketFactory(), x509TrustManager);

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