2016-11-30 2 views
0

Ich bin mit diesem für die letzten zwei Tage fest, wo ich gegenseitige Authentifizierung auf dem Server mit Client-Zertifikat implementieren müssen. Ich habe meine .pfx-Datei im rohen Ordner im res-Verzeichnis.Https Androiden zu Server-Kommunikation gibt immer 403 Antwort

Ich habe es in res/raw/certificate.pfx

Ich habe auch die HttpURLConnection in Android und stellen Sie die SSLSocketFactory die einen implementiert, die ich von meinem Zertifikat erzeugt. Aber das Problem ist, dass der Server immer 403 zurückgibt. Ich habe versucht, alle Request-Eigenschaften einschließlich "User Agent" hinzuzufügen. Aber nichts scheint zu funktionieren.

Ich habe den folgenden Code beigefügt. Ich vertraue dem Zertifikat so.

public SSLSocketFactory getSSLSocketFactory_Certificate(String keyStoreType, int keystoreResId) 
     throws CertificateException, KeyStoreException, IOException, NoSuchAlgorithmException, KeyManagementException, NoSuchProviderException { 

    InputStream caInput = context.getResources().openRawResource(keystoreResId); 

    // creating a KeyStore containing trusted CAs 

    if (keyStoreType == null || keyStoreType.length() == 0) { 
     keyStoreType = KeyStore.getDefaultType(); 
    } 
    KeyStore keyStore = KeyStore.getInstance(keyStoreType); 

    keyStore.load(caInput, "".toCharArray()); 

    // creating a TrustManager that trusts the CAs in the KeyStore 

    String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm(); 
    TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm); 
    tmf.init(keyStore); 

    TrustManager[] wrappedTrustManagers = getWrappedTrustManagers(tmf.getTrustManagers()); 

    SSLContext sslContext = SSLContext.getInstance("TLS"); 
    sslContext.init(null, wrappedTrustManagers, null); 

    return sslContext.getSocketFactory(); 
} 

Und schließlich in meiner Tätigkeit i machen https Aufruf wie folgt

URL url = null; 
     HttpURLConnection conn; 
     try { 
      url = new URL("https://example.com"); 
      conn = (HttpURLConnection) url.openConnection(); 
      if (conn instanceof HttpsURLConnection) { 
       ((HttpsURLConnection) conn).setSSLSocketFactory(sslSocketFactory); 
      } 
      conn.setRequestMethod("GET"); 
      conn.setRequestProperty("Accept", "application/json"); 
      conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"); 

      int responseCode = conn.getResponseCode(); 
      System.out.println("Server response code" + responseCode); 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

Aber das Ergebnis ist immer 403 verboten. Ich bin mir nicht sicher, wo ich falsch liege. Jemand bitte hilf mir.

Antwort

2

Ah .. Endlich fand ich das Problem selbst. Alles was ich vermisste ist, dass ich meine Keystore-Factory nicht mit dem Keystore initialisieren konnte, nachdem ich das Zertifikat geladen hatte.

public SSLSocketFactory getSSLSocketFactory_Certificate(String keyStoreType, int keystoreResId) 
     throws CertificateException, KeyStoreException, IOException, NoSuchAlgorithmException, KeyManagementException, NoSuchProviderException, UnrecoverableKeyException { 

    InputStream caInput = context.getResources().openRawResource(keystoreResId); 

    // creating a KeyStore containing trusted CAs 

    if (keyStoreType == null || keyStoreType.length() == 0) { 
     keyStoreType = KeyStore.getDefaultType(); 
    } 
    KeyStore keyStore = KeyStore.getInstance(keyStoreType); 
    keyStore.load(caInput, "".toCharArray()); 

    // creating a TrustManager that trusts the CAs in the KeyStore 

    String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm(); 
    TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm); 
    tmf.init(keyStore); 

    TrustManager[] wrappedTrustManagers = getWrappedTrustManagers(tmf.getTrustManagers()); 

    SSLContext sslContext = SSLContext.getInstance("TLS"); 
    KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
    kmf.init(keyStore, "".toCharArray()); 

    sslContext.init(kmf.getKeyManagers(), wrappedTrustManagers, null); 
    return sslContext.getSocketFactory(); 
} 

Diese Zeilen machten den Trick für mich.

SSLContext sslContext = SSLContext.getInstance("TLS"); 
    KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
    kmf.init(keyStore, "".toCharArray()); 

    sslContext.init(kmf.getKeyManagers(), wrappedTrustManagers, null); 

Ich hoffe, es würde jemandem helfen. :)

Verwandte Themen