2015-10-19 112 views
0

我遇到了Android中的Keystore問題。握手失敗Android 23

我試圖將Android中的客戶端連接到java中的服務器。我的代碼與API的15個工作井到Android的22,但與新的API 23更新時間:

我已經得到了Android客戶端上的錯誤:

javax.net.ssl.SSLHandshakeException: Handshake failed 

,並在此錯誤服務器:

javax.net.ssl.SSLHandshakeException: no cipher suites in common 

這裏是我的代碼,這是用API 22或之前正常工作:

在客戶端

,R.raw.publickey是公共.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 
} 

非常感謝您的幫助!

回答

0

我終於成功地做到這一點...

的錯誤是,在Android 6.0是不支持了SHA-1。

錯誤是太奇怪了,我並沒有設法直接看到它...

對於一個誰比我有同樣的錯誤,只是使用SHA-256重新創建你的證書......