java - SSL Handshake Excetion : Failure in SSL library, 通常是协议(protocol)错误

标签 java android ssl java-websocket sslhandshakeexception

我正在使用带有 android v4.4.2 (Java) 和 java_websockets 的物理设备我在尝试连接到 websocket 时收到此错误。

javax.net.ssl.SSLHandshakeException: 
javax.net.ssl.SSLProtocolException: 
SSL handshake aborted: ssl=0x7aa38588: 
Failure in SSL library, usually a protocol error
error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:
unknown protocol (external/openssl/ssl/s23_clnt.c:769 0x73a81cfc:0x00000000)

我找到了 this answer我尝试实现它但没有任何改变。这就是我获取 NoSSLv3SocketFactory 代码的地方。它进入 try catch 直到最后一行 mWebSocketClient.connect() 但它没有进入 catch,onError 记录错误。

这是 websocket 设置代码。

...
String complete = wsBase + ep;
URI uri = new URI(complete);

mWebSocketClient = new WebSocketClient(uri, new Draft_17()) 
{
            @Override
            public void onOpen(ServerHandshake serverHandshake) 
            {
                Log.i("Websocket", "Opened");
            }

            @Override
            public void onMessage(String s) 
            {
                final String message = s;
                runOnUiThread(new Runnable() 
                {
                    @Override
                    public void run() 
                    {
                        Log.i("onMessage", "running");
                    }
                });
            }

            @Override
            public void onClose(int i, String s, boolean b) 
            {
                Log.i("Websocket", "Closed " + s);
            }

            @Override
            public void onError(Exception e) 
            {
                Log.i("Websocket", "Error " + e.getMessage());
            }
        };

        try 
        {
            // Stuff I thought might have fixed it but didn't
            SSLContext sslcontext = SSLContext.getInstance("TLSv1");

            sslcontext.init(null,
                    null,
                    null);
            SSLSocketFactory noSSLv3Factory = new NoSSLv3SocketFactory(sslcontext.getSocketFactory());

            Socket socket = noSSLv3Factory.createSocket(uri.getHost(), 80);
            mWebSocketClient.setSocket(socket);
            mWebSocketClient.connect();
        } 

        catch (Exception e)
        {
            Log.i("Websocket", e.getMessage());
        }

最佳答案

        Socket socket = noSSLv3Factory.createSocket(uri.getHost(), 80);

如果我正确理解了您的代码,那么您正在尝试连接到端口 80 上的安全 WebSocket。虽然理论上有人可以像这样设置服务器,但这种可能性很小。端口 80 用于 http 而不是 https,因此用于 ws:// 而不是 wss://。安全 Websockets (wss://`) 通常在端口 443 上进行处理,其中 https 也已完成。

关于java - SSL Handshake Excetion : Failure in SSL library, 通常是协议(protocol)错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39275309/

相关文章:

node.js - 主页未解析裸域 URL

java - Eclipse 不在同一工作区中的两个项目之间导入 jar 依赖项

java - 房间类型转换器不工作

python - 运行 "indirectly"时连接中断。 Ubuntu 上的 Bottle.py

perl - IO::Socket::SSL 客户端检查服务器证书

android - 在 Xamarin 上使用数据库的正确方法

java - JMock - 具有不同参数的多个调用

java - 需要停止或终止线程

java - 如何检查字段是否已初始化或包含Java中的默认值

java - Android 数据绑定(bind)导致包含布局出现问题