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

标签 java android ssl serversocket

我有一个 android 应用程序,它正在监听套接字连接并且可以读取 httpheaders(通过浏览器发送(一切正常!))。现在我不想切换到 SSL 套接字,但我做不到。

我的工作:

  • keystore
  • 服务器套接字工厂

我没有做的事情(以及我需要帮助的地方):

  • 客户接受部分

代码:

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

最佳答案

首先,这两行没有任何意义。如果要限制支持的密码套件和协议(protocol),请专门定义它们。但您必须注意,并非所有密码套件都受浏览器支持。

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

您代码中的问题是您没有使用您的 keystore 。试试这个:

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

关于java ssl套接字服务器握手中止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13626004/

相关文章:

java - ORA-00900 : invalid SQL statement while exporting an Oracle database from Java

android - 如何使用TeamCity构建我的React native 应用程序?

java - 错误:Execution failed for task ':app:compileDebugAidl'

ssl - GKE - 如何通过 L7 负载均衡器提供 HTTPS?

java - 文件 I/O 组合指令

java - Java 中的可变范围效率

java - 如何使用 Hibernate 映射 byte[] 属性?

android - 获取构建错误 : `duplicate entry: javax/annotation/CheckForNull.class`

php - 尽管安装了根证书但握手失败(PayPal 升级 - g5 证书 - openssl)

php curl - 允许使用过期证书进行调用