簡體   English   中英

java ssl套接字服務器握手中止

[英]java ssl socket server handshake aborted

我有一個 android 應用程序,它正在偵聽套接字連接並且可以讀取 httpheaders(通過瀏覽器發送(一切正常。))。 現在我不想切換到 SSL 套接字,但我做不到。

我開始工作的事情:

  • 密鑰庫
  • 服務器套接字工廠

我沒有工作的事情(以及我需要幫助的地方):

  • 客戶端接受部分

代碼:

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();

首先,這兩行沒有任何意義。 如果要限制支持的密碼套件和協議,請專門定義它們。 但是您必須注意並非所有密碼套件都受瀏覽器支持。

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();
    }
}

不要將密鑰庫用作默認類型,而是始終定義您將在應用程序中使用的密鑰庫類型。 否則,服務器和客戶端之間可能會發生密鑰庫不匹配的情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM