2012-06-28 3 views
0

Проблема - Я хотел бы подключиться к серверу хоста с поддержкой SSL (подписал сертификаты от verisign). Этот хост одобряет/отклоняет платежные операции.SSL Enabled Host

Успение - 1. ClientAuth не требуется. 2. Я не имею дело с HTTPS

Я хотел бы написать java-клиент, который будет подключаться к этому хосту и отправит запрос и получит ответ. Пожалуйста, исправьте, если мое понимание неверно.

  1. Клиент Java должен использовать пакет - «javax.net.ssl. *». Этот пакет имеет класс «SSLSocket», чтобы установить соединение с SSL Host.
  2. Для клиентских сертификатов клиента «клиент»/клиентских сертификатов (подписанный Verisign) не требуется. Это потребовалось бы только при активации clientAuth (TRUE).
  3. Нужно ли иметь условие в моем клиентском коде, чтобы сначала подтвердить Сертификат сервера, а затем передать данные? этот этап обязательный?
  4. Я в обход некоторых обязательных шагов?

Спасибо, Радж Hebbar

ответ

1

Для создания защищенного сокета (на стороне клиента), вы можете использовать:

//An SSL socket can't be created from scratch. We need a Factory that 
//handles the underlying logic that allows create a SSL socket 
SocketFactory socketFactory = SSLSocketFactory.getDefault(); 

//Get the socket from the Factory 
SSLSocket socket = (SSLSocket) socketFactory.createSocket(host, port); 

Теперь, во время выполнения при создании Java-клиент/сокет завод будет выполните знаменитое «SSL-квитирование», и будет выполнена некоторая проверка. По умолчанию явы клиент/сокет:

  • Проверьте, если сертификат сервера соответствует «хозяину»: Каждый сертификат имеет «имя сервера» и этот сертификат должен быть загружен только с этим сервером. Таким образом, если вы получите сертификат «www.google.com» с сервера «www.oracle.com», эта проверка завершится с ошибкой.
  • Проверить, если сертификат является доверенной один: если он не подписан органом, или цепь власти не может быть установлена, или, если это не входит в «доверенном хранилище сертификатов» это проверка потерпит неудачу ,

ВАЖНО: первый буллит, который объясняет проверку имени хоста неправильно: это не происходит из-за SSLSocket, но и для HTTPS клиентов. Благодаря @EJP и @Gergely Szilagyi указывают на это

ПРИМЕЧАНИЕ: Существует способ решить проблемы с этими валидаций как:

  • Чтобы обойти/выключить проверку сервера, пожалуйста читать это post (не рекомендуется!)
  • Чтобы добавить сертификат клиента доверенным проверки хранилища это post
+0

Неверная точка первой пули. Проверка имени хоста является частью HTTPS, а не SSL. В Java это делается HttpURLConnection, а не SSLSocket. – EJP

+0

@EJP: если быть точным, это находится в 'sun.net.www.protocol.https.HttpsClient.checkURLSpoofing' –

+0

@EJP Я категорически согласен с вами. Виноват – ggarciao

0
  1. Исправить.
  2. Исправить.
  3. Нет, это происходит автоматически. Вы можете добавить слушателя квитирования, который проверяет сертификат, или получить сертификат однорангового узла из SSLSession, но без него можно продолжить.
  4. Да.
Смежные вопросы