2016-02-01 45 views
5

Sto sviluppando un'applicazione Android utilizzando l'autenticazione del certificato client all'interno di WebView. Il certificato (cert.pfx) e la password sono incorporati nell'applicazione.Handle Android WebView onReceivedClientCertRequest

Durante l'esecuzione di richiesta di autenticazione certificato client con chiamata AJAX in WebView, la seguente funzione sempre chiamato:

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

Come ho understend ho bisogno di chiamare:

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

Qualsiasi idea di come creare gli oggetti PrivateKey e X509Certificate dal certificato incorporato per procedere con la richiesta. BTW, è questo il modo corretto di implementare l'autenticazione del certificato client sull'app per Android? se no, per favore consiglio.

risposta

7

risolto utilizzando KeyStore ottenere i PrivateKey e X509Certificate oggetti:

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