0

私は、ソケット接続をリッスンし、httpheaders を読み取ることができる Android アプリを持っています (ブラウザから送信します (すべて正常に動作します!))。今は SSL ソケットに切り替えるつもりはありませんが、それを行うことはできません。

私が働いたこと:

  • キーストア
  • ServerSocketFactory

うまくいかないこと(および助けが必要な場所):

  • クライアント受け入れ部分

コード:

public void run() {

try {           

KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());

keyStore.load(service.getBaseContext().getResources().openRawResource(R.raw.keystore),"password".toCharArray());

    ServerSocketFactory socketFactory = SSLServerSocketFactory
                .getDefault();
    SSLServerSocket mServerSocket = (SSLServerSocket) socketFactory
                .createServerSocket(8080);
    while (!mServerSocket.isClosed()) {
            mServerSocket.setEnabledCipherSuites(mServerSocket.getSupportedCipherSuites());
            mServerSocket.setEnabledProtocols(mServerSocket.getSupportedProtocols());



            System.out.println("waiting");
            SSLSocket client = (SSLSocket) mServerSocket.accept(); 




            client.addHandshakeCompletedListener(new HandshakeCompletedListener(){

                public void handshakeCompleted(HandshakeCompletedEvent arg0) {
                    System.out.println("handshakeCompleted");

                }

            });
            client.startHandshake(); //MultiThreadWebServer.java:136


            client.getOutputStream().flush();



            client.close();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

例外:

11-29 11:15:01.046: W/System.err(29941): javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x4fec3da8: Failure in SSL library, usually a protocol error
11-29 11:15:01.046: W/System.err(29941): error:1408A0C1:SSL routines:SSL3_GET_CLIENT_HELLO:no shared cipher (external/openssl/ssl/s3_srvr.c:1365 0x41b1e7f8:0x00000000)
11-29 11:15:01.046: W/System.err(29941):    at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:436)
11-29 11:15:01.046: W/System.err(29941):    at at.aichinger.mario.aws.MultiThreadWebServer.run(MultiThreadWebServer.java:136)

サーバーに接続するには、google cheome を使用し、「https://192.168.0.25:8080」にアクセスすると、例外がスローされます。

MultiThreadWebServer.java:136 行のコード:

client.startHandshake();
4

2 に答える 2

0

まず、この 2 行には意味がありません。サポートされている暗号スイートとプロトコルを制限する場合は、それらを明確に定義してください。ただし、すべての暗号スイートがブラウザーでサポートされているわけではないことに注意する必要があります。

mServerSocket.setEnabledCipherSuites(mServerSocket.getSupportedCipherSuites());
mServerSocket.setEnabledProtocols(mServerSocket.getSupportedProtocols());

コードの問題は、キーストアを使用していないことです。これを試して:

public void run() {
    try {
        KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
        keyStore.load(service.getBaseContext().getResources().openRawResource(R.raw.keystore),
                "password".toCharArray());

        KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
        keyManagerFactory.init(keyStore, "password".toCharArray());

        SSLContext sslContext = SSLContext.getInstance("SSL");
        sslContext.init(keyManagerFactory.getKeyManagers(), null, null);

        ServerSocketFactory socketFactory = sslContext.getServerSocketFactory();
        SSLServerSocket mServerSocket = (SSLServerSocket) socketFactory.createServerSocket(8080);
        while (!mServerSocket.isClosed()) {

            System.out.println("waiting");
            SSLSocket client = (SSLSocket) mServerSocket.accept();

            client.addHandshakeCompletedListener(new HandshakeCompletedListener() {

                public void handshakeCompleted(HandshakeCompletedEvent arg0) {
                    System.out.println("handshakeCompleted");

                }

            });
            client.startHandshake(); // MultiThreadWebServer.java:136

            client.getOutputStream().flush();

            client.close();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}
于 2012-11-30T00:33:12.420 に答える