android - 在 Android 上连接到 Pushbullet 的安全 Websocket

标签 android ssl websocket pushbullet

很棒的服务 Pushbullet 有一个 websocket 流,您可以订阅它,然后监听对您​​设备的推送,这正是我想要的。我希望我的应用程序能够连接到消息流并根据他们所说的执行操作。

我试过使用 https://github.com/andrepew/Java-WebSocket/tree/1.3.0-Android-SSL-Fix (从 https://github.com/TooTallNate/Java-WebSocket fork ),但我没有运气。稍等片刻后,连接响应返回

onClose -1, draft org.java_websocket.drafts.Draft_10@a38fd36 refuses handshake, false

05-22 03:24:30.709  15423-15904 java.lang.NullPointerException: ssl == null
05-22 03:24:30.710  15423-15904 com.android.org.conscrypt.NativeCrypto.SSL_read_BIO(Native Method)
05-22 03:24:30.710  15423-15904 com.android.org.conscrypt.OpenSSLEngineImpl.unwrap(OpenSSLEngineImpl.java:477)
05-22 03:24:30.710  15423-15904 javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:1006)

我的代码是(没有我的访问 token ......)甚至尝试“信任所有主机”建议的 hack,

private void createConnection()
{
    URI uri = URI.create("wss://stream.pushbullet.com/websocket/" + pushAT);

    final WebSocketClient mWebSocketClient = new WebSocketClient(uri) {
        @Override
        public void onOpen(ServerHandshake serverHandshake) {
            Log.d(TAG, "onOpen " + serverHandshake);
        }

        @Override
        public void onMessage(String s) {
            Log.d(TAG, "onMessage " + s);
        }

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

        @Override
        public void onError(Exception e) {
            Log.d(TAG, "onError " + e);
            e.printStackTrace();
        }
    };

    Log.d(TAG, "Connecting to " + uri);
    trustAllHosts(mWebSocketClient);

    mWebSocketClient.connect();
    Log.d(TAG, "Connecting to " + uri);
}

public void trustAllHosts(WebSocketClient wsc) {
    // Create a trust manager that does not validate certificate chains
    TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
            return new java.security.cert.X509Certificate[]{};
        }

        public void checkClientTrusted(X509Certificate[] chain,
                                       String authType) throws CertificateException {
        }

        public void checkServerTrusted(X509Certificate[] chain,
                                       String authType) throws CertificateException {
        }
    }};


    // Install the all-trusting trust manager
    try {
        SSLContext sc = SSLContext.getInstance("TLS");
        sc.init(null, trustAllCerts, new java.security.SecureRandom());
        wsc.setWebSocketFactory(new DefaultSSLWebSocketClientFactory(sc));
    } catch (Exception e) {
        e.printStackTrace();
    }
}

最佳答案

从那个错误我只能猜测它可能有一些 SSL 问题。您可以尝试使用另一种(未记录)流式处理端点,这可能有助于调试此问题。如果您请求 https://stream.pushbullet.com/streaming/ACCESS_TOKEN_HERE它返回一个分块的 HTTP 响应,该响应一直持续到您断开连接为止。如果你能弄清楚如何读取这个流式响应(许多 http 客户端可以这样做),那么至少那部分是有效的,它只是你的 websocket 库。

您可以通过 curl --no-buffer 从命令行使用流媒体。您应该会在连接后立即看到一条 nop 消息。

关于android - 在 Android 上连接到 Pushbullet 的安全 Websocket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30387476/

相关文章:

python - 证书验证失败 : self signed certificate in certificate chain (_ssl. c:1129)

javascript - 为什么我在 Node 的 HTTP 服务器上收到这么多连接事件?

visual-studio - IIS Express 中的 SSL 证书失败

ios - 无法完成操作。 (Starscream.WSError 错误 1.) RBSManager

php - PHP套接字: From php server to web client

java - 仅从 XML 元素内的实体编码 HTML 中提取文本

android - 在 Android app_project 中读写 SQLite 数据库

android - 删除所有覆盖

android - 设置工具栏标题在 onCreate() 中不起作用

python - https 背后的 django channel