Я пытаюсь выполнить следующую команду 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();
}