Не удается защитить соединение с помощью TLS

Я пытаюсь установить безопасное сокетное соединение между клиентским апплетом Java (построенным с помощью JDK 1.7.0_75-b13) и серверным приложением VC++.

В качестве тестового средства я использовал образец клиента/сервера VC++, который нашел на форумах MSDN, модифицировал его для использования SChannel и смог установить сокет с помощью набора шифров TLS_RSA_WITH_AES_128_CBC_SHA. Он работает с любым из TLS 1.0/1.1/1.2.

Когда я пытаюсь открыть сокет из апплета Java для того же серверного приложения, соединение отклоняется, и сервер сообщает следующее:

Ошибка TLS 1.0 AcceptSecurityContext: 0x80090327

Ошибка TLS 1.1 AcceptSecurityContext: 0x80090331

Сбой TLS 1.2 AcceptSecurityContext: 0x80090331

Это код Java, используемый для создания сокета:

debugPrint("Setting up secure connection");
SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket("127.0.0.1", socketnumber);
debugPrint("Starting handshake");
sslsocket.setTcpNoDelay(true);
sslsocket.setSoLinger(false, 0);
sslsocket.setKeepAlive(true);
sslsocket.setReuseAddress(true);
sslsocket.setSoTimeout(10000);
sslsocket.setUseClientMode(true);
sslsocket.setWantClientAuth(false);
sslsocket.addHandshakeCompletedListener(new HandshakeCompletedListener() 
{
    @Override
    public void handshakeCompleted(HandshakeCompletedEvent arg0) 
    {
        debugPrint("handshake complete!");
        StealthStatus.setServiceConnected(true);
    }

});
String cipherSuites[] = sslsocket.getEnabledCipherSuites();
for (int inx=0; inx < cipherSuites.length; inx++)
{
    debugPrint("SSL cipher suite supported->" + cipherSuites[inx]);
}
sslsocket.setEnabledCipherSuites(cipherSuites);
sslsocket.startHandshake();
socket = sslsocket;
socketOut = sslsocket.getOutputStream();
socketIn = sslsocket.getInputStream();

Запустив это, вызов getEnabledCipherSuites возвращает список

TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA

TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA

TLS_RSA_WITH_AES_128_CBC_SHA

TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA

TLS_ECDH_RSA_WITH_AES_128_CBC_SHA

TLS_DHE_RSA_WITH_AES_128_CBC_SHA

TLS_DHE_DSS_WITH_AES_128_CBC_SHA

TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA

TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA

SSL_RSA_WITH_3DES_EDE_CBC_SHA

TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA

TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA

SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA

SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA

TLS_ECDHE_ECDSA_WITH_RC4_128_SHA

TLS_ECDHE_RSA_WITH_RC4_128_SHA

SSL_RSA_WITH_RC4_128_SHA

TLS_ECDH_ECDSA_WITH_RC4_128_SHA

TLS_ECDH_RSA_WITH_RC4_128_SHA

SSL_RSA_WITH_RC4_128_MD5

TLS_EMPTY_RENEGOTIATION_INFO_SCSV

который включает желаемый TLS_RSA_WITH_AES_128_CBC_SHA и передается в setEnabledCipherSuites.

Что нужно, чтобы сервер VC++ принял соединение от клиента Java?


person MikeS_at_UIS    schedule 22.04.2015    source источник
comment
Какую ошибку выдает апплет? И какой именно смысл устанавливать включенные наборы шифров на включенные наборы шифров?   -  person user207421    schedule 11.05.2015


Ответы (1)


См.: http://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/ReadDebug.html

Во многих случаях сообщения журнала, созданные при использовании флага -Djavax.net.debug=all, могут привести вас в правильном направлении.

person lyaffe    schedule 11.05.2015