2012-01-20 2 views
4

Я разрабатывал WS-клиент с использованием JAVA, и у меня возникла проблема с аутентификацией SSL. WS создаются в WCF, и у меня нет доступа к серверу, они работают через HTTPS и используют клиентский сертификат, который должен быть установлен на клиенте в первую очередь. Ребята из сервера отправили мне сертификат PFX, который я успешно установил в ОС (я использую OS X), и я мог бы получить доступ к WS через браузер (Safari или FF - это те, которые я пытался, которые ранее не могли получить доступ к WS). Я думал, что любое приложение в ОС будет использовать эти сертификаты, но когда я попробовал приложение JAVA, это не сработало; на первом был быть брошенным следующее сообщение об ошибке:JAVA - SSL - Клиентские сертификаты

«javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX путь здание не удалось: sun.security.provider.certpath.SunCertPathBuilderException: невозможно найти действительный сертификат путь к запрашиваемой цели "

Я решил это, экспортировав сертификат в файл CER и используя инструмент командной строки keytool, чтобы добавить сертификат в« cacerts »keyStore JAVA. Но после того, как эта ошибка исчезла, появилось следующее: «403, запрещено». Это очевидно из-за того, что он не использует сертификат SSL-клиента для сайта, но я не смог найти способ отправить его ему. Любая помощь будет оценена по достоинству.

Ниже приведен код, я использую для отправки сообщений в WS:

URL url = new URL(p_url); 

HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); 
conn.setDoOutput(true); 

conn.setRequestMethod("POST"); 
conn.setRequestProperty("Content-Type", contentType); 

OutputStream out = conn.getOutputStream(); // on this line it shows the error 

ответ

4

Вы можете создать определенный SSLContext (используя KeyManager инициализируются хранилище ключей, содержащими ваш клиент Cert + секретный ключ), из которого вы выведете SSLSocketFactory, который вы установили в ваш HttpsURLConnection, или использовать глобальные настройки.

Вы можете установить следующие свойства системы (глобальные настройки):

  • javax.net.ssl.keyStore=path/to/keystore.pfx
  • javax.net.ssl.keyStoreType=PKCS12
  • javax.net.ssl.keyStorePassword=xxxxxxxxx

В качестве альтернативы, вы можете создать свой собственный KeyManagerFactory/KeyManager, как описанный в this answer.

Поскольку вы импортировали сертификат сервера в cacerts, используйте null для TrustManager[] аргумента SSLContext.init() (он подберет значения по умолчанию).

Кроме того, поскольку вы находитесь на OSX, вы можете напрямую использовать KeychainStore. Для этого используйте ....keyStore=NONE, keyStoreType=KeychainStore и keyStorePassword=- (любой пароль будет работать, так как доступ к ключу будет предоставлен, когда вам это понадобится из ОС). Хотя я не уверен, работает ли это на льве. Обратите внимание, что это может быть неудачно, если в вашем магазине имеется более одного сертификата cert + private (см. this issue).

+1

Если вы запутались между хранилищем хранилища/доверительным магазином, вы можете прочитать следующее: http://stackoverflow.com/a/6341566/372643 – Bruno

+2

Спасибо, я на самом деле пробовал это, но мне не хватало keyStoreType = PKCS12. – user1161538

0

Похоже, вы, вероятно, нужно создать свой собственный SSL SocketFactory,

http://vafer.org/blog/20061010073725/ 

Я думаю, что все получили лучше с 2006 года, поэтому вам просто нужно указать кучу свойств в командной строке:

http://stackoverflow.com/questions/875467/java-client-certificates-over-https-ssl 
0

Вам нужно загрузить хранилище ключей, которое они отправят вам в вашем приложении Java.
Вы можете загрузить его как файл из файловой системы в объект Keystore и использовать его. Прочтите это example и особенно часть о KeyManager i.e. createKeyManagers метод.

Другим вариантом было бы загрузить хранилище ключей из окон. Читайте о Windows-MY поставщике

+0

Кажется, что ОП уже сделал это. Прочитайте второй абзац в своем вопросе. – kosa

Смежные вопросы