Принудительное использование SSL-сокета клиента для отправки сертификата - PullRequest
5 голосов
/ 10 марта 2012

Я пытаюсь написать клиент (фактически промежуточное ПО, которое является клиентом для объекта, но также действует как сервер для других).В качестве клиента он должен общаться с другим сервером (VirtualCenter VMware) и просить его сделать что-то от его имени.

Чтобы дать вам больше контекста, VirtualCenter позволяет приложению регистрироваться как расширение.Указанное приложение может зарегистрировать свой сертификат во время регистрации ( setCertificate ).После этого приложение может войти в VirtualCenter, используя свой сертификат ( loginExtensionByCertificate () метод), и, следовательно, не нужно хранить имя пользователя и пароли.Однако, чтобы это работало, клиент (мое приложение) должен отправить сертификат как часть своего соединения SSL, даже если сервер (VirtualCenter) не запрашивает его особо.

Я пишу свое приложение сДжава.Создал свой собственный менеджер ключей, подключил его к моему хранилищу ключей и указал псевдоним для использования.Затем инициализировал мой ssl-контекст для использования этого менеджера ключей.В созданных сокетах я вижу, что в их SSLContext есть мой менеджер ключей.Однако я не вижу, чтобы когда-нибудь вызывали менеджер ключей для получения сертификата.По какой-то причине сокет не чувствует, что ему необходимо отправить сертификат.

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

Ответы [ 5 ]

4 голосов
/ 10 марта 2012

Клиентские сертификаты могут быть отправлены только по запросу сервера.См. TLS Spec.- Сообщение сертификата клиента (RFC 4346, раздел 7.4.6) :

Это первое сообщение, которое клиент может отправить после получения от сервера сообщения "Hello Hello".Это сообщение отправляется только в том случае, если сервер запрашивает сертификат.

Вы не можете заставить клиента отправить сертификат клиента, если сервер не запросил его.

РЕДАКТИРОВАТЬ:Конечно, вам также необходимо убедиться, что ваш keymanager / keystore настроен правильно.Вы можете столкнуться с проблемами, подобными описанным в , почему java не отправляет сертификат клиента во время SSL-рукопожатия?

2 голосов
/ 10 марта 2012

Однако, чтобы это работало, клиент (мое приложение) должен отправить сертификат как часть своего соединения SSL, даже если сервер (VirtualCenter) не запрашивает его, в частности

Чтобы это работало, сервер должен запросить его.Вот как определяется протокол SSL.Если бы вы могли устроить так, чтобы ваш клиент отправлял его незапрошенным, а это невозможно, сервер был бы вынужден прервать соединение.

Решение этого - на стороне сервера.Вы на 100% уверены, что это не вопрос?Может быть, он спрашивает, но ваш клиент не отправляет?например, поскольку сертификат не подписан центром сертификации, которому доверяет сервер.

0 голосов
/ 22 января 2015

Когда установлен vCenter, он использует обратный прокси-сервер на порту 443, который перенаправляет запросы через HTTP в реальную службу. Прокси-сервер никогда не запрашивает сертификат клиента и не может пересылать его.

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

0 голосов
/ 16 марта 2012

Наконец-то решена проблема.Похоже, VMware идет совсем другим путем.Вопрос был неверно истолкован.

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

Я использовал следующую последовательность:

  • Сначала укажите URL-адрес для подключения как https://: (примечаниепротокол является безопасным, но порт - нет).

  • Начальный сокет будет открыт для порта открытого текста.Но наличие https в качестве протокола заставит вызывать мой собственный SSLSocketFactory.В моей фабрике сокетов я получаю вызов моего public Socket createSocket(Socket s, String host, int port, boolean autoClose) метода, который позволяет мне конвертировать мой сокет в SSLSocket на мой вкус.

Мой код по сути выглядит так:

@Override
public Socket createSocket(Socket s, String host, int port, boolean autoClose)
    throws IOException {
    s.setKeepAlive(true);
    String connectReq = "CONNECT /sdkTunnel HTTP/1.1\r\n\r\n";
    OutputStreamWriter writer = new OutputStreamWriter(socket.getOutputStream());
    writer.write(connectReq, 0, connectReq.length());
    writer.flush();
    // In this initial response, all that matters is the http code. If
    // it is 200, the rest can be ignored.
    READ_AND_VERIFY_INITIAL_RESPONSE();
    SSLSocket sock = (SSLSocket) origSslSockFactory
        .createSocket(s, s.getInetAddress().getHostName(), s.getPort(), true);
    // Depending on whether the caller actually does the handshake
    // or not, you may need to call handshake here. In my case, I
    // did not need to, since HTTPClient I am using calls the
    // handshake. Axis does not call, so you may have to in that
    // case.

    // sock.startHandshake();
    return sock;
}

В приведенном выше блоке origSslSockFactory - это SSLSocketFactory, который был заменен вашей реализацией.В моем случае это был экземпляр sun.security.ssl.SSLSocketFactoryImpl.

После этой процедуры вызов ExtensionManager.setExtensionCertificate () завершился успешно.И впоследствии все вызовы SessionManager.loginExtensionByCertificate () также завершаются успешно.

Я хотел опубликовать это, потому что, кажется, есть много вопросов по этому поводу.

0 голосов
/ 11 марта 2012

VMware VC всегда будет запрашивать SSL-сертификат клиента, так как именно это количество аутентифицированных расширений входит в VC. Итак, вы на правильном пути.

Я подозреваю, что у вас просто проблемы с взаимодействиями SSL / Java, и это не является проблемой VMware (хотя с SSL всегда трудно определить это).

Я думаю, что вы хотите следовать предложениям здесь: Сертификаты клиентов Java по HTTPS / SSL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...