2016-02-01 24 views
5

WebView'de istemci sertifikası kimlik doğrulaması kullanarak bir Android uygulaması geliştiriyorum. Sertifika (cert.pfx) ve şifre uygulamada gömülüdür.Android WebView onReceivedClientCertRequest

WebView'da ajax çağrısı ile İstemci Sertifikası Kimlik talebin yerine, aşağıdaki işlev denilen alma

:

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

ben çağırmanız gerekir understend gibi:

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

herhangi bir fikir nasıl oluşturmak için isteği devam ettirmek için, katıştırılmış sertifikadan PrivateKey ve X509Certificate nesneleri. BTW, Android uygulamasında İstemci Sertifikası Kimlik Doğrulaması'nı uygulamanın doğru yolu bu mu? hayırsa, lütfen öneri verin.

cevap

7

bu PrivateKey ve X509Certificate nesneleri elde etmek için, anahtar deposu ile çözüldü:

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