2016-02-01 17 views
5

私はWebView内でクライアント証明書認証を使用してAndroidアプリを開発しています。証明書(cert.pfx)とパスワードはアプリケーションに組み込まれています。Android WebViewはonReceivedClientCertRequestを処理します

のWebViewでのAJAX呼び出し、以下の関数が呼び出さ取得してクライアント証明書認証要求を実行する:私は、私が呼び出す必要がunderstendとして

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

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

を作成するために、どのように任意のアイデア要求を処理するために、埋め込み証明書からのPrivateKeyおよびX509Certificateオブジェクト これは、Androidアプリでクライアント証明書認証を実装する正しい方法ですか?いいえの場合は、アドバイスをお願いします。

答えて

7

はのPrivateKeyとのX509Certificateオブジェクトを取得するためにキーストアを使用してそれを解決:

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); 
     } 
    }; 
関連する問題