Веб-сервис Java через https - Как добавить самозаверяющий сертификат в API клиента? - PullRequest
3 голосов
/ 08 февраля 2010

У меня есть веб-сервис "Hello World", созданный с помощью axis2. Я хотел бы написать клиентский API, который мог бы использовать этот сервис более https с самозаверяющим сертификатом. У меня есть самоподписанный сертификат myCertificate.cer и keystore, содержащий его.

Вот мой клиентский API:

public class MyApi{

public Object callMyService(){

Axis2TestStub stub = new Axis2TestStub(
"https://localhost:8443/axis2/services/Axis2Test");

System.setProperty("javax.net.ssl.trustStore",
"src/main/resources/myKeystore.jks")
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

Hello request = new Hello();
request.setMot("World");
HelloResponse response = stub.hello(request);
Object mot = response.get_return();
return mot;

Это работает, но я хотел бы использовать myCertificate.cer, а не keystore, содержащий его. Кто-нибудь знает, как это сделать? Я попытался переопределить протокол https, но безуспешно:

HttpSecureProtocol myHttpsProtocol = new HttpSecureProtocol();
myHttpsProtocol .setCheckHostname(false);
myHttpsProtocol .addTrustMaterial(new TrustMaterial("myCertificate.cer"));
Protocol customHttps = new Protocol("https", 
(ProtocolSocketFactory) myHttpsProtocol , 8443);
Protocol.registerProtocol("https", customHttps);

Ответы [ 2 ]

3 голосов
/ 08 февраля 2010

Я хотел бы написать API-интерфейс клиента, который мог бы использовать этот сервис через https с самозаверяющим сертификатом. У меня есть самоподписанный сертификат myCertificate.cer и хранилище ключей, содержащее его.

Хранилище ключей сервера содержит самозаверяющий сертификат и закрытый ключ сервера и используется сервером для подписи сообщений и для возврата учетных данных клиенту.

На стороне клиента вам необходимо импортировать сертификат сервера в клиентское хранилище доверия (и, как правило, вам не нужен закрытый ключ в клиентском хранилище доверия, поэтому вы извлекаете один файл сертификата, т.е. без закрытого ключа, и затем вы импортируете этот сертификат сервера в хранилище доверенных сертификатов.)

Это работает, но я хотел бы использовать myCertificate.cer, а не хранилище ключей, содержащее его.

Это не хранилище ключей, а хранилище доверенных сертификатов, и требуется добавление сертификата в доверенное хранилище клиентов, поскольку самозаверяющие сертификаты не подписаны корневым ЦС и не являются доверенными по умолчанию. Так что вам нужно создать цепочку доверия.

Теперь вы можете распространять хранилище доверенных сертификатов в JAR клиентского API. Этот подход обсуждается в этой теме (самая большая проблема заключается в том, что вам придется перераспределять JAR, когда истекает срок действия сертификата сервера). Лично мне не очень нравится это решение.

ИМХО, хорошим решением, если вы хотите пропустить вещи из хранилища доверия, было бы купить реальный сертификат у широко известного поставщика сертификатов, для которого у вас уже есть сертификаты корневого CA в хранилище доверия (например, Verisign, Thawte).

2 голосов
/ 08 февраля 2010

Я бы просто добавил сертификат в файл cacerts JDK, на котором запущено ваше приложение. Если вы сделаете это, вам больше ничего не придется делать. Код, указанный выше, не требуется. Вы добавляете сертификат в хранилище ключей, выполнив команду, подобную приведенной ниже:

C:/<jdk-version/bin/keytool -import -alias myalias -file mycert.crt -keystore C:/<jdk-version>/jre/lib/security/cacerts
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...