2016-02-01 34 views
5

Zajmuję się tworzeniem aplikacji na Androida przy użyciu uwierzytelniania certyfikatów klienckich w WebView. Certyfikat (cert.pfx) i hasło są osadzone w aplikacji.Uchwyt Android WebView onReceivedClientCertRequest

Podczas wykonywania żądania Client Authentication Certyfikat z wywołania ajax w WebView, poniższa funkcja uzyskiwanie nazywa się:

@Override 
public void onReceivedClientCertRequest(WebView view, final ClientCertRequest request) {} 

Jak understend Muszę zadzwonić:

request.proceed(PrivateKey privateKey, X509Certificate[] chain) 

jakiś pomysł jak stworzyć obiekty PrivateKey i X509Certyfikat z osadzonego certyfikatu w celu wykonania żądania. BTW, czy jest to właściwy sposób wdrożenia uwierzytelniania certyfikatu klienta w aplikacji na Androida? jeśli nie, proszę o poradę.

Odpowiedz

7

rozwiązać go za pomocą KeyStore celu uzyskania PrivateKey i X509Certificate obiekty:

private X509Certificate[] mCertificates; 
    private PrivateKey mPrivateKey; 

    private void loadCertificateAndPrivateKey() { 
      try { 
       InputStream certificateFileStream = getClass().getResourceAsStream("/assets/cert.pfx"); 

       KeyStore keyStore = KeyStore.getInstance("PKCS12"); 
       String password = "password"; 
       keyStore.load(certificateFileStream, password != null ? password.toCharArray() : null); 

       Enumeration<String> aliases = keyStore.aliases(); 
       String alias = aliases.nextElement(); 

       Key key = keyStore.getKey(alias, password.toCharArray()); 
       if (key instanceof PrivateKey) { 
        mPrivateKey = (PrivateKey)key; 
        Certificate cert = keyStore.getCertificate(alias); 
        mCertificates = new X509Certificate[1]; 
        mCertificates[0] = (X509Certificate)cert; 
       } 

       certificateFileStream.close(); 

      } catch (Exception e) { 
       Log.e(TAG, e.getMessage()); 
     } 
    } 


    private WebViewClient mWebViewClient = new WebViewClient() { 
     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) { 
      view.loadUrl(url); 
      return false; 
     } 

     @Override 
     public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { 
      handler.proceed(); 
     } 

     @Override 
     public void onReceivedClientCertRequest(WebView view, final ClientCertRequest request) { 
      if (mCertificates == null || mPrivateKey == null) { 
       loadCertificateAndPrivateKey(); 
      } 
      request.proceed(mPrivateKey, mCertificates); 
     } 
    };