Наконец-то решена проблема.Похоже, 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 () также завершаются успешно.
Я хотел опубликовать это, потому что, кажется, есть много вопросов по этому поводу.