2017-01-30 3 views
0
public class NewSSLSocketFactory extends SSLSocketFactory { 
    private SSLContext sslContext=SSLContext.getInstance("TLS"); 
    private KeyStore setCert(){ 
     String skuCertBin ="-----BEGIN CERTIFICATE-----\n"+ 
              "SOMETHING TEXT HERE"+ 
             "-----END CERTIFICATE-----"; 
     KeyStore trustStore=null; 
     try { 
      ByteArrayInputStream derInputStream = new ByteArrayInputStream(skuCertBin.getBytes()); 
      CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509"); 
      X509Certificate cert = (X509Certificate) certificateFactory.generateCertificate(derInputStream); 
      String alias = cert.getSubjectX500Principal().getName(); 
      trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); 
      trustStore.load(null, null); 
      trustStore.setCertificateEntry(alias, cert); 
     } catch (CertificateException e) { 
      e.printStackTrace(); 
     } catch (NoSuchAlgorithmException e) { 
      e.printStackTrace(); 
     } catch (KeyStoreException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return trustStore; 
    } 
    public NewSSLSocketFactory() throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException { 
     super(); 
     KeyStore trustStore = setCert(); 
     TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509"); 
     tmf.init(trustStore); 
     sslContext.init(null, tmf.getTrustManagers(), null); 
    } 
.................... 
} 

Meine SSL Socket-CodeAndroid Webview verwenden selbstsignierten certficate

Wenn ich Jsoup analysieren, ich Anwendung über Code auf

Aber wenn WebView verwenden, Ansicht Sie zeigt keine Webseiten nur "https: //"

 WebView webView = (WebView) findViewById(R.id.fullWebView); 
     webView.setWebViewClient(new WebViewClient(){ 
      @Override 
      public boolean shouldOverrideUrlLoading(WebView view, String url){ 
       view.loadUrl(url); 
       return true; 
      } 
     }); 
     webView.getSettings().setJavaScriptEnabled(true); 
     webView.getSettings().setDomStorageEnabled(true); 

     webView.loadUrl(url); 

I setCertificate Methode aber „Diese Methode wurde als veraltet in API-Ebene 17. Der Aufruf dieser Funktion keine nützliche ef hat gefunden fekt und wird in zukünftigen Versionen ignoriert. "

Wie kann ich diese Gewohnheit cert auf webview


final PrivateKey privateKey = newSSLSocketFactory.getPrivateKey(); 
final X509Certificate[] cert= new X509Certificate[1]; 
cert[0] = newSSLSocketFactory.getCert(); 

@Override 
public void onReceivedClientCertRequest(WebView view, ClientCertRequest request) { 
    Log.d("WebviewCheck","cert Working"); 
    request.proceed(privateKey, cert); 
} 

Ich benutze diesen Code auf jeder onCreate und neuen WebViewClient Aber Android nicht onReceivedClientCertRequest nennen, nicht "WebviewCheck" zeigt Lügt

public static class PlaceholderFragment extends Fragment { 
     /** 
     * The fragment argument representing the section number for this 
     * fragment. 
     */ 
     private static final String ARG_SECTION_NUMBER = "section_number"; 
     private int section_number_fragment = 0; 

     public PlaceholderFragment() { 
     } 

     private void setFragmentNumber(int n) { 
      this.section_number_fragment = n; 
     } 

     /** 
     * Returns a new instance of this fragment for the given section 
     * number. 
     */ 
     public static PlaceholderFragment newInstance(int sectionNumber) { 
      PlaceholderFragment fragment = new PlaceholderFragment(); 
      fragment.setFragmentNumber(sectionNumber); 
      Bundle args = new Bundle(); 
      args.putInt(ARG_SECTION_NUMBER, sectionNumber); 
      fragment.setArguments(args); 
      return fragment; 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
           Bundle savedInstanceState) { 
      int fragmentFile; 
      switch (section_number_fragment) { 
       case 1: 
        fragmentFile = R.layout.fragment_left; 
        break; 
       case 2: 
        fragmentFile = R.layout.fragment_center; 
        break; 
       default: 
        // section_number_fragment == 3 
        fragmentFile = R.layout.fragment_right; 
        break; 
      } 

      View rootView = inflater.inflate(fragmentFile, container, false); 
      if (section_number_fragment==1) { 
       FragmentTransaction transaction = getFragmentManager().beginTransaction(); 
       if (loginCookies == null) { 
        transaction.replace(R.id.leftFragment, new LogoutFragment()); 
       } 
       else 
        transaction.replace(R.id.leftFragment, new LoginFragment()); 
       transaction.commit(); 
      } 

      if (section_number_fragment != 1 && section_number_fragment != 2) { 
       webView = (WebView) rootView.findViewById(R.id.renewWebView); 
       webView.setWebViewClient(new WebViewClient() { 
        @Override 
        public boolean shouldOverrideUrlLoading(WebView view, String url){ 
         view.loadUrl(url); 
         return true; 
        } 
        @Override 
        public void onReceivedClientCertRequest(WebView view, ClientCertRequest request) { 
         Log.d("WebviewCheck","cert Working"); 
         request.proceed(privateKey, cert); 
        } 
        @Override 
        public void onPageStarted(WebView view, String url, Bitmap favicon) { 
         super.onPageStarted(view,url,favicon); 
         if (url.equals(ManageUrl.circulationPageUrl)) 
          webViewFinishChk=false; 
        } 
        @Override 
        public void onPageFinished(WebView view, String url) { 
         super.onPageFinished(view,url); 
         if (url.equals(ManageUrl.circulationPageUrl)) 
          webViewFinishChk=true; 
        } 
       }); 
       webView.setWebChromeClient(new WebChromeClient() { 
        public boolean onJsAlert(WebView view, String url, String message, final android.webkit.JsResult result){ 
         new AlertDialog.Builder(view.getContext()) 
           .setTitle("AppTitle") 
           .setMessage(message) 
           .setPositiveButton(android.R.string.ok, 
             new AlertDialog.OnClickListener(){ 
              public void onClick(DialogInterface dialog, int which) { 
               result.confirm(); 
              } 
             }) 
           .setCancelable(true) 
           .create() 
           .show(); 

         return true; 
        } 
        public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) { 
         new AlertDialog.Builder(view.getContext()) 
           .setTitle("AppTitle") 
           .setMessage(message) 
           .setPositiveButton(android.R.string.ok, 
             new DialogInterface.OnClickListener() 
             { 
              public void onClick(DialogInterface dialog, int which) 
              { 
               result.confirm(); 
              } 
             }) 
           .setNegativeButton(android.R.string.cancel, 
             new DialogInterface.OnClickListener() 
             { 
              public void onClick(DialogInterface dialog, int which) 
              { 
               result.cancel(); 
              } 
             }) 
           .create() 
           .show(); 

         return true; 
        } 
       }); 
       webView.getSettings().setJavaScriptEnabled(true); 
       webView.getSettings().setDomStorageEnabled(true); 

       ListView borrowListView = (ListView) rootView.findViewById(R.id.borrowBookList); 
       borrowListView.setAdapter(borrowAdapter); 
       /* 
       Button refresh = (Button) rootView.findViewById(R.id.refreshBorrowBook); 
       refresh.performClick(); 
       */ 
      } 
      return rootView; 
     } 
    } 

newSSLSocketFactory, privateKey und cert ist MainActiviys private statische Variable, Init on onCreate-Methode

Warum viewpager's Webview immer noch nicht angezeigt?

+0

http://stackoverflow.com/questions/5977977/does-the-web-view-on-android-support-ssl –

+0

http://stackoverflow.com/a/15590041/1576416 –

Antwort

0
 String sslCertificate = error.getCertificate().toString(); 
     String mySslCertificate = new SslCertificate(cert).toString(); 
     if (sslCertificate.equals(mySslCertificate)) 
      handler.proceed(); 

Diese Code hinzufügen auf WebView onReceivedSslError Methoden

Ich denke, es ist nicht perfekte Lösung. Aber sehen Sie sich diese Code einige SSL-Cert

Nicht Popup-Meldung zeigt (Dialog)