Исключение при использовании SSLEngine

Я пишу собственный сервер для телефона Android для обработки запросов https. Он начинается с прослушивания определенного порта и после установления соединения выполняет рукопожатие с клиентом. Вот фрагмент кода:

ServerSocket sock = new ServerSocket(8080);
Socketclient client = sock.accept();
doHandshake(client);

...

void doHandshake(Socket socket) throws Exception {
        try {

             SSLContext context = SSLContext.getDefault();
             SSLEngine engine = context.createSSLEngine();
             engine.setUseClientMode(false);

            SSLSession session = engine.getSession();
            // Create byte buffers to use for holding application data
            ByteBuffer myAppData = ByteBuffer.allocate(session.getApplicationBufferSize());
            ByteBuffer peerAppData = ByteBuffer.allocate(session.getApplicationBufferSize());

            ByteBuffer myNetData = ByteBuffer.allocate(session.getPacketBufferSize());
            byte[] peerNetData = new byte[session.getPacketBufferSize()];

            // Begin handshake
            engine.beginHandshake();
            SSLEngineResult.HandshakeStatus hs = engine.getHandshakeStatus();
            InputStream inputStream = socket.getInputStream();
            OutputStream outputStream = socket.getOutputStream();

            int bytesRead;
            // Process handshaking message
            while (hs != SSLEngineResult.HandshakeStatus.FINISHED &&
                    hs != SSLEngineResult.HandshakeStatus.NOT_HANDSHAKING) {

                switch (hs) {

                    case NEED_UNWRAP:
                        // Receive handshaking data from peer
                        bytesRead = inputStream.read(peerNetData);
                        if (bytesRead < 0) {
                            // The channel has reached end-of-stream
                        }

                        ByteBuffer peerData = ByteBuffer.wrap(peerNetData, 0, bytesRead);

                        SSLEngineResult res = engine.unwrap(peerData, peerAppData);

Когда я указал браузеру на этот просматривающий сервер (url = https://localhost:8080), я получил исключение для "engine.unwrap(peerData, peerAppData)"

javax.net.ssl.SSLProtocolException: квитирование SSL завершено: ssl = 0xb8347db8: сбой в библиотеке SSL, обычно ошибка протокола: 1408A0C1: подпрограммы SSL: SSL3_GET_CLIENT_HELLO: нет общего шифра (внешний/openssl/ssl/s3_srvr.c:1394 0xace00e61 :0x00000000)

Что мне не хватает?


person Chris    schedule 30.11.2014    source источник


Ответы (2)


Вы должны выбросить этот код. Избавьтесь от SSLEngine и просто используйте SSLSocket, если собираетесь использовать потоки. SSLEngine предназначен для использования в неблокирующем режиме с SocketChannels, и достаточно сложно сделать это правильно, не добавляя потоки в микс.

person user207421    schedule 30.11.2014

нет общего шифра

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

person Steffen Ullrich    schedule 01.12.2014