Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 握手失败_Java_Android_Ssl_Keystore_Android Keystore - Fatal编程技术网

Java 握手失败

Java 握手失败,java,android,ssl,keystore,android-keystore,Java,Android,Ssl,Keystore,Android Keystore,我对Android中的密钥库有问题 我正在尝试将android中的客户端连接到java中的服务器。我的代码在android 15到22版本的API中运行良好,但在新的API 23更新版本中运行不好: 我在android客户端上发现了错误: javax.net.ssl.SSLHandshakeException: Handshake failed 服务器上出现以下错误: javax.net.ssl.SSLHandshakeException: no cipher suites in common

我对Android中的密钥库有问题

我正在尝试将android中的客户端连接到java中的服务器。我的代码在android 15到22版本的API中运行良好,但在新的API 23更新版本中运行不好:

我在android客户端上发现了错误:

javax.net.ssl.SSLHandshakeException: Handshake failed
服务器上出现以下错误:

javax.net.ssl.SSLHandshakeException: no cipher suites in common
这是我的代码,它在API 22或之前运行良好:

在客户端中,R.raw.publickey是public.bks证书,R.raw.publickey_v1是与API 15兼容的.bks的旧版本

服务器:

public static SSLServerSocket getServerSocketWithCert(int port, InputStream pathToCert, String passwordFromCert) throws IOException,
                                KeyManagementException, NoSuchAlgorithmException, CertificateException, KeyStoreException, UnrecoverableKeyException{
    TrustManager[] tmm;
    KeyManager[] kmm;
    KeyStore ks  = KeyStore.getInstance("JKS");
    ks.load(pathToCert, passwordFromCert.toCharArray());
    tmm=tm(ks);
    kmm=km(ks, passwordFromCert);
    SSLContext ctx = SSLContext.getInstance("TLS");
    ctx.init(kmm, tmm, null);
    SSLServerSocketFactory socketFactory = (SSLServerSocketFactory) ctx.getServerSocketFactory();
    SSLServerSocket ssocket = (SSLServerSocket)        socketFactory.createServerSocket(port);
    return ssocket;
}
private static TrustManager[] tm(KeyStore keystore) throws NoSuchAlgorithmException, KeyStoreException {
    TrustManagerFactory trustMgrFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
    trustMgrFactory.init(keystore);
    return trustMgrFactory.getTrustManagers();
};
private static KeyManager[] km(KeyStore keystore, String password) throws NoSuchAlgorithmException, KeyStoreException, UnrecoverableKeyException {
    KeyManagerFactory keyMgrFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
    keyMgrFactory.init(keystore, password.toCharArray());
    return keyMgrFactory.getKeyManagers();
};

    public static void main(String[] args){
        SSLServerSocket ss = null;
        try {
            ss = getServerSocketWithCert(12345, Server.class.getResourceAsStream("/privateKey.store"), "password");
        } catch(BindException e){
            e.printStackTrace();
            System.exit(1);
        } catch (KeyManagementException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (CertificateException e) {
            e.printStackTrace();
        } catch (KeyStoreException e) {
            e.printStackTrace();
        } catch (UnrecoverableKeyException e) {
            e.printStackTrace();
        }
        while(true){
            SSLSocket s = ss.accept();
            new DataOutputStream(s.getOutputStream()).writeUTF("test");
            //TODO ERROR IS APPENING HERE
        }
    }
public static SSLSocket getSocketWithCert(InetAddress ip, int port, InputStream pathToCert, String passwordFromCert) throws IOException,
                                KeyManagementException, NoSuchAlgorithmException, CertificateException, KeyStoreException {
    TrustManager[] tmm;
    KeyStore ks  = KeyStore.getInstance("BKS");
    ks.load(pathToCert, passwordFromCert.toCharArray());
    tmm=tm(ks);
    SSLContext ctx = SSLContext.getInstance("TLS");
    ctx.init(null, tmm, null);
    SSLSocketFactory SocketFactory = (SSLSocketFactory) ctx.getSocketFactory();
    SSLSocket socket = (SSLSocket) SocketFactory.createSocket();
    socket.connect(new InetSocketAddress(ip, port), 5000);
    return socket;
}

private static TrustManager[] tm(KeyStore keystore) throws NoSuchAlgorithmException, KeyStoreException {
    TrustManagerFactory trustMgrFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
    trustMgrFactory.init(keystore);
    return trustMgrFactory.getTrustManagers();
};
public static void(String[] args){
        int id;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN){
            id = R.raw.publickey;
        } else {
            id = R.raw.publickey_v1;
        }
        try {
            Socket s = SSLSocketKeystoreFactory.getSocketWithCert("myip", 12345, HackerMainActivity.this.getResources().openRawResource(id), "password");
        } catch (UnknownHostException | SecurityException e) {
            e.printStackTrace();
            return;
        } catch(SocketTimeoutException e){
            e.printStackTrace();
            return;
        } catch (KeyManagementException | NoSuchAlgorithmException | CertificateException | KeyStoreException e) {
            e.printStackTrace();
        }
        DataInputStream in = new DataInputStream(s.getInputStream());
        //TODO ERROR IS APPENING HERE
}
客户端:

public static SSLServerSocket getServerSocketWithCert(int port, InputStream pathToCert, String passwordFromCert) throws IOException,
                                KeyManagementException, NoSuchAlgorithmException, CertificateException, KeyStoreException, UnrecoverableKeyException{
    TrustManager[] tmm;
    KeyManager[] kmm;
    KeyStore ks  = KeyStore.getInstance("JKS");
    ks.load(pathToCert, passwordFromCert.toCharArray());
    tmm=tm(ks);
    kmm=km(ks, passwordFromCert);
    SSLContext ctx = SSLContext.getInstance("TLS");
    ctx.init(kmm, tmm, null);
    SSLServerSocketFactory socketFactory = (SSLServerSocketFactory) ctx.getServerSocketFactory();
    SSLServerSocket ssocket = (SSLServerSocket)        socketFactory.createServerSocket(port);
    return ssocket;
}
private static TrustManager[] tm(KeyStore keystore) throws NoSuchAlgorithmException, KeyStoreException {
    TrustManagerFactory trustMgrFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
    trustMgrFactory.init(keystore);
    return trustMgrFactory.getTrustManagers();
};
private static KeyManager[] km(KeyStore keystore, String password) throws NoSuchAlgorithmException, KeyStoreException, UnrecoverableKeyException {
    KeyManagerFactory keyMgrFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
    keyMgrFactory.init(keystore, password.toCharArray());
    return keyMgrFactory.getKeyManagers();
};

    public static void main(String[] args){
        SSLServerSocket ss = null;
        try {
            ss = getServerSocketWithCert(12345, Server.class.getResourceAsStream("/privateKey.store"), "password");
        } catch(BindException e){
            e.printStackTrace();
            System.exit(1);
        } catch (KeyManagementException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (CertificateException e) {
            e.printStackTrace();
        } catch (KeyStoreException e) {
            e.printStackTrace();
        } catch (UnrecoverableKeyException e) {
            e.printStackTrace();
        }
        while(true){
            SSLSocket s = ss.accept();
            new DataOutputStream(s.getOutputStream()).writeUTF("test");
            //TODO ERROR IS APPENING HERE
        }
    }
public static SSLSocket getSocketWithCert(InetAddress ip, int port, InputStream pathToCert, String passwordFromCert) throws IOException,
                                KeyManagementException, NoSuchAlgorithmException, CertificateException, KeyStoreException {
    TrustManager[] tmm;
    KeyStore ks  = KeyStore.getInstance("BKS");
    ks.load(pathToCert, passwordFromCert.toCharArray());
    tmm=tm(ks);
    SSLContext ctx = SSLContext.getInstance("TLS");
    ctx.init(null, tmm, null);
    SSLSocketFactory SocketFactory = (SSLSocketFactory) ctx.getSocketFactory();
    SSLSocket socket = (SSLSocket) SocketFactory.createSocket();
    socket.connect(new InetSocketAddress(ip, port), 5000);
    return socket;
}

private static TrustManager[] tm(KeyStore keystore) throws NoSuchAlgorithmException, KeyStoreException {
    TrustManagerFactory trustMgrFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
    trustMgrFactory.init(keystore);
    return trustMgrFactory.getTrustManagers();
};
public static void(String[] args){
        int id;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN){
            id = R.raw.publickey;
        } else {
            id = R.raw.publickey_v1;
        }
        try {
            Socket s = SSLSocketKeystoreFactory.getSocketWithCert("myip", 12345, HackerMainActivity.this.getResources().openRawResource(id), "password");
        } catch (UnknownHostException | SecurityException e) {
            e.printStackTrace();
            return;
        } catch(SocketTimeoutException e){
            e.printStackTrace();
            return;
        } catch (KeyManagementException | NoSuchAlgorithmException | CertificateException | KeyStoreException e) {
            e.printStackTrace();
        }
        DataInputStream in = new DataInputStream(s.getInputStream());
        //TODO ERROR IS APPENING HERE
}

非常感谢你的帮助

我终于把它修好了

错误在于Android 6.0版本放弃了对SHA-1的支持。 对于出现相同错误的用户,只需使用SHA-256重新创建证书