1

Android (4.1) アプリケーションから node.js https サーバーにデータを送信しようとしています。そのために、Weberknecht websockets で Gottox の socket.io を使用します。

暗号スイートを使用して、アプリケーションとサーバーをTLS 1.0経由で通信することを達成しました

TLS_RSA_WITH_AES_128_CBC_SHA

サーバーのオプションに追加します。

var options = {
   key: fs.readFileSync(...),
   cert: fs.readFileSync(...),
   ciphers:('AES128-SHA'),
}

しかし、TLS v1.2 の暗号スイートを使用したい

TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA

これは Android 4.1 でサポートされるはずなので、ciphers オプションを次のように変更しました。

ciphers:('ECDHE-ECDSA-AES256-SHA'),

さらに、それを機能させるために、Weberknecht Websockets の WebSocketConnection.java で、Sockets を SSLSockets に変更したので、Android でサポートされているすべての暗号スイートを次のコードで有効にできます。

socket = (SSLSocket) sslSocketFactory.createSocket(host, port);
String[] suites = socket.getSupportedCipherSuites();
socket.setEnabledCipherSuites(suites);

しかし、サーバーの暗号オプションを削除するか、最初の暗号スイートを再度配置すると機能しませんが、TLS 1.0 でのみ機能します。

スタックエラーは次のとおりです。

03-14 16:44:01.215: W/System.err(3762): io.socket.SocketIOException: Error while handshaking
03-14 16:44:01.220: W/System.err(3762):     at io.socket.IOConnection.handshake(IOConnection.java:313)
03-14 16:44:01.220: W/System.err(3762):     at io.socket.IOConnection.access$7(IOConnection.java:283)
03-14 16:44:01.220: W/System.err(3762):     at io.socket.IOConnection$ConnectThread.run(IOConnection.java:199)
03-14 16:44:01.225: W/System.err(3762): Caused by: javax.net.ssl.SSLException: Connection closed by peer
03-14 16:44:01.225: W/System.err(3762):     at org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_do_handshake(Native Method)
03-14 16:44:01.225: W/System.err(3762):     at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:371)
03-14 16:44:01.225: W/System.err(3762):     at libcore.net.http.HttpConnection.setupSecureSocket(HttpConnection.java:209)
03-14 16:44:01.225: W/System.err(3762):     at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:478)
03-14 16:44:01.225: W/System.err(3762):     at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:442)
03-14 16:44:01.225: W/System.err(3762):     at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:289)
03-14 16:44:01.225: W/System.err(3762):     at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:239)
03-14 16:44:01.225: W/System.err(3762):     at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:273)
03-14 16:44:01.230: W/System.err(3762):     at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168)
03-14 16:44:01.230: W/System.err(3762):     at libcore.net.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:271)
03-14 16:44:01.230: W/System.err(3762):     at io.socket.IOConnection.handshake(IOConnection.java:304)
03-14 16:44:01.230: W/System.err(3762):     ... 2 more

私は WebSocketHandshake.java と IOConnection.java を調べてきましたが、問題の原因が見つかりません...

なにか提案を?

必要に応じて、ここでクライアントのコードを確認できます。

https://github.com/Javi44/LocAALTOn/tree/WebSockets-Gotox

編集:

これは、例外を発生させているメソッドです。

private void handshake() {
    URL url;
    String response;
    URLConnection connection;
    try {
        setState(STATE_HANDSHAKE);
        url = new URL(IOConnection.this.url.toString() + SOCKET_IO_1);
        connection = url.openConnection();
        if (connection instanceof HttpsURLConnection) {
            ((HttpsURLConnection) connection)
                    .setSSLSocketFactory(sslSocketFactory);
        }
        connection.setConnectTimeout(connectTimeout);
        connection.setReadTimeout(connectTimeout);

        /* Setting the request headers */
        for (Entry<Object, Object> entry : headers.entrySet()) {
            connection.setRequestProperty((String) entry.getKey(),
                    (String) entry.getValue());
        }

        InputStream stream = connection.getInputStream();
        Scanner in = new Scanner(stream);
        response = in.nextLine();
        String[] data = response.split(":");
        sessionId = data[0];
        heartbeatTimeout = Long.parseLong(data[1]) * 1000;
        closingTimeout = Long.parseLong(data[2]) * 1000;
        protocols = Arrays.asList(data[3].split(","));
    } catch (Exception e) {
        error(new SocketIOException("Error while handshaking", e));
    }
}

SSLSocket の代わりに URL 接続を使用していることが問題でしょうか? URL接続を同じ機能を持つものに変更できますが、SSLSocketsを使用していますか?

4

0 に答える 0