1

J'ai une classe qui utilise webview pour ouvrir cette URL: https://eaadhaar.uidai.gov.in et j'ai créé un certificat local en utilisant ce code ci-dessous .. Je reçois avec succès une réponse de 200 mais ma question est de savoir comment je vais afficher la page Web à l'utilisateur. J'ai testé ce code:Est-il possible de créer une application Android basée sur le webview accédant aux urps https

public class WebViewFragment extends Fragment { 

    public final String TAG = WebViewFragment.class.getSimpleName(); 
    private WebView webView; 

    public static final int DEFAULT_BUFFER_SIZE = 2048; 
    public static final String DEFAULT_CHARSET_NAME = "UTF-8"; 

    public WebViewFragment() { 

    } 

    public static WebViewFragment newInstance() { 
     return new WebViewFragment(); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.layout_webview_fragment, container, false); 

     initGlobal(view); 
     return view; 
    } 

    private void initGlobal(View view) { 
     webView = (WebView) view.findViewById(R.id.webview); 
     //MyBrowser is a custom class which extends Webviewclient which loads the given url in the webview 
     webView.setWebViewClient(new MyBrowser()); 
     webView.getSettings().setJavaScriptEnabled(true); 
     webView.getSettings().setDomStorageEnabled(true); 

     webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); 

//  webView.loadUrl("http://www.google.com"); 
//  webView.loadUrl("https://www.github.com"); 
//  webView.loadUrl("https://eaadhaar.uidai.gov.in/"); 

     try { 
      StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 

      StrictMode.setThreadPolicy(policy); 

      CertificateFactory cf = CertificateFactory.getInstance("X.509"); 
      InputStream caInput = new BufferedInputStream(getActivity().getResources().openRawResource(R.raw.newcertificate)); 
      Certificate ca; 
      try { 
       ca = cf.generateCertificate(caInput); 
       System.out.println("ca=" + ((X509Certificate) ca).getSubjectDN()); 
      } finally { 
       caInput.close(); 
      } 

      // Create a KeyStore containing our trusted CAs 
      String keyStoreType = KeyStore.getDefaultType(); 
      KeyStore keyStore = KeyStore.getInstance(keyStoreType); 
      keyStore.load(null, null); 
      keyStore.setCertificateEntry("ca", ca); 


      // Create a TrustManager that trusts the CAs in our KeyStore 
      String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm(); 
      TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm); 
      tmf.init(keyStore); 

      // Create a SSLContext with the certificate 
      SSLContext sslContext = SSLContext.getInstance("TLS"); 
      sslContext.init(null, tmf.getTrustManagers(), null); 

      // Create a HTTPS connection 
      URL url = new URL("https://eaadhaar.uidai.gov.in"); 
      HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); 
      conn.setSSLSocketFactory(sslContext.getSocketFactory()); 

      InputStream in = conn.getInputStream(); 
      int lastResponseCode = conn.getResponseCode(); 
      Log.e(TAG, "response code=" + lastResponseCode); 

      if (lastResponseCode == 200) { 
       Toast.makeText(getActivity(), "Response code==" + lastResponseCode, Toast.LENGTH_SHORT).show(); 
      } 
      copyInputStreamToOutputStream(in, System.out, 2048, true, true); 


     } catch (Exception e) { 
      Log.e(TAG, "Exception========" + e.toString()); 
     } 
    } 

    public void copyInputStreamToOutputStream(InputStream from, OutputStream to, int bufferSize, boolean closeInput, boolean closeOutput) { 
     try { 
      int totalBytesRead = 0; 
      int bytesRead = 0; 
      int offset = 0; 
      byte[] data = new byte[bufferSize]; 

      while ((bytesRead = from.read(data, offset, bufferSize)) > 0) { 
       totalBytesRead += bytesRead; 
       to.write(data, offset, bytesRead); 
       Log.e(TAG, "Copied " + totalBytesRead + " bytes"); 
      } 
      closeStreams(from, to, closeInput, closeOutput); 
     } catch (Exception e) { 
      closeStreams(from, to, closeInput, closeOutput); 
      e.printStackTrace(); 
      throw new RuntimeException(e); 
     } 
    } 


    public void closeStreams(InputStream from, OutputStream to, boolean closeInput, boolean closeOutput) { 
     try { 
      if (to != null) 
       to.flush(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     try { 
      if (closeInput && from != null) 
       from.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     try { 
      if (closeOutput && to != null) 
       to.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

} 
+0

Quelle est votre question? Est-ce "comment afficher webview dans l'interface utilisateur" ou "peut webview charger HTTPS" ou "webview peut-il charger la page HTTPS dont le CERT ne fait pas confiance au système d'exploitation et je veux qu'il valide le CERT"? –

+0

@ jakub.g En fait, je veux juste charger l'URL ci-dessus dans webview et son écran vide.Ainsi, j'ai trouvé la façon dont je dois utiliser la méthode onReceivedSslError pour contourner ce problème. J'ai été égaré que j'ai besoin de keystore personnalisé pour accéder à l'url aussi. –

+0

Si l'écran est vide, cela signifie que le certificat https le plus probable ne peut être validé pour une raison quelconque. Notez que vous ne devriez pas faire 'handler.proceed()' dans 'onReceivedSslError' dans une application de production car cela va à l'encontre de l'objectif de HTTPS car cela rend l'application vulnérable aux attaques de type man-in-the-middle. –

Répondre

0

Le problème est plus probable que le serveur ne transmet pas la chaîne de certificat complet (ne pas envoyer les certificats intermédiaires)

Voir ici:

https://www.ssllabs.com/ssltest/analyze.html?d=eaadhaar.uidai.gov.in&latest

Cliquez sur Certification Paths et vous verrez Extra download à côté de GeoTrust SSL CA - G3.

C'est une chose spécifique à WebView: il ne va pas chercher certs intermédiaires (navigateurs réguliers comme Chrome ou Firefox soit le faire, ou mettre en cache les certs qu'ils ont vu pendant que l'utilisateur naviguait d'autres pages)

Vous

besoin de contacter l'administrateur du serveur/ops pour envoyer tous les certificats intermédiaires. Nous avons eu des problèmes similaires avec nos applications et il a été résolu en envoyant tous les certificats intermédiaires dans la négociation SSL.

Surcharge onReceivedSslError est une manière non sécurisée de corriger le problème et ne doit pas être utilisée dans les applications de production. Traitez-le comme un outil de développement uniquement.