【问题标题】:Exception when using SSLEngine使用 SSLEngine 时出现异常
【发布时间】:2014-11-30 22:15:01
【问题描述】:

我正在为安卓手机编写一个自定义服务器来处理 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)

我错过了什么?

【问题讨论】:

    标签: android ssl jsse


    【解决方案1】:

    您应该丢弃此代码。如果您要使用流,请摆脱 SSLEngine 并使用 SSLSocketSSLEngine 用于SocketChannels 的非阻塞模式,如果不添加流到混合中就很难做到这一点。

    【讨论】:

      【解决方案2】:

      没有共享密码

      正确设置 SSL 引擎时出现问题。一个原因可能是您没有设置任何证书,因此只能使用匿名密码套件。但是浏览器不支持这些不安全的密码套件,并且浏览器和服务器之间没有共享密码套件。

      【讨论】:

        猜你喜欢
        • 2011-10-15
        • 2015-02-05
        • 2014-08-06
        • 1970-01-01
        • 2011-09-15
        • 2016-11-08
        • 2011-08-11
        • 2011-09-30
        • 1970-01-01
        相关资源
        最近更新 更多