Похоже, вы пытаетесь использовать HTTPS с проверкой подлинности сертификата клиента. Я предполагаю, что ваш сервер настроен для запроса этого (поскольку сертификат клиента может запрашивать только сервер).
В Java java.security.cert.X509Certificate
- это на самом деле просто сертификат (сертификат открытого ключа, без закрытого ключа). На стороне клиента вам нужно настроить закрытый ключ с ним.
Предполагая, что ваш закрытый ключ и сертификат находятся в хранилище ключей (для упрощения, я предполагаю, что есть только один подходящий сертификат с его закрытым ключом, возможно, с другими сертификатами в цепочке, в этом хранилище ключей), и что вы используете значение по умолчанию трастовый магазин:
KeyStore ks = ...
/* load the keystore */
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, password);
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(kmf.getKeyManagers(), null, null);
URL url = new URL("https://example/");
HttpsURLConnection connection = (HttpsURLConnection)url.openConnection();
connection.setSSLSocketFactory(sslContext.getSSLSocketFactory());
Другие библиотеки позволят вам установить SSLContext
или KeyStore
немного по-другому, но принципы должны быть такими же.
(Вы также можете использовать системные свойства javax.net.ssl.keyStore
, если это необходимо.)