首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用SSLEngine时出现异常

使用SSLEngine时出现异常
EN

Stack Overflow用户
提问于 2014-12-01 06:15:02
回答 2查看 276关注 0票数 0

我正在为android手机编写一个自定义服务器来处理https请求。它从侦听特定端口开始,一旦建立了连接,它就会与客户端进行握手。下面是代码片段:

代码语言:javascript
复制
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 routines:SSL3_GET_CLIENT_HELLO:no共享密码(外部/openssl/ssl/s3_srvr.c:1394 0xace00e61:0x00000000)

我遗漏了什么?

EN

回答 2

Stack Overflow用户

发布于 2014-12-01 06:39:01

你应该扔掉这段代码。如果要使用流,就去掉SSLEngine,只使用SSLSocketSSLEngine是在SocketChannels的非阻塞模式下使用的,如果不将流添加到混合中,就很难做到这一点。

票数 0
EN

Stack Overflow用户

发布于 2014-12-01 14:06:26

无共享密码

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27218899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档