2011-05-12 6 views
27

안드로이드의 WebView 컨트롤은 SSL을 지원합니까?Android에서 웹보기가 SSL을 지원합니까?

신뢰할 수있는 SSL 인증서를 사용하는 웹 페이지를로드하려고하지만 WebView은 흰색입니다.

제안 사항?

+0

Internet-Application의 빌드로 웹 페이지를 열 수 있습니까? – Mannaz

답변

71

전문가가 아니며 웹에서 무엇을 찾을 수 있는지. 내가 이해하는 것으로부터, WebView는 실제로 SSL을 지원하지만, 빈 화면은 WebView가 인증서가 유효하다고 생각하지 않는다는 표시입니다. 이것은 자체 서명 한 인증서 나 android에서 설정하지 않은 루트 인증에서 발생합니다 (완벽하게 유효한 인증서는 유효하지 않습니다).

webView.getSetting().setDomStorageEnable(true); 
+1

이상한 점은 자체 서명 인증서가 아니라는 것입니다 .. –

+0

흠, 글쎄, 나는 WebView가 확실히 SSL 지원을한다는 것을 알게되었습니다. 여기에는'getCertificate()','clearSslPreferences()'및'setCertificate (SslCertificate certificate)'메소드가 있습니다. 내가보기에는 문제가 무엇인지 웹 키트를 통해 알려주고 있습니다. 주위를 확인해 보면 [this] (http://developer.android.com/reference/android/webkit/SslErrorHandler.html)에서 ssl 오류 처리를 볼 수 있습니다. – chris

+0

@chris 당신은 이것이 사용하는 froyo 또는 그 이상에서 작동한다고하지만, SslErrorHandler와 SslError '모두 유형으로 해석 될 수 없으며 어떤 것도 가져올 수 없습니다 ... 제안 사항이 있습니까? – RyanG

0

: 어떤 경우에, 당신은 프로 요를 사용하거나하는 경우 더 나은 당신이 뭔가를 시도 할 수 있습니다 업데이트 된 보안 정책에 따라 서버에서 제공 한 인증서가 사용자의 기대에 부합 할 때마다 SslErrorHandler.proceed()를 호출하도록 코드를 변경하고, 그렇지 않으면 SslErrorHandler.cancel()을 호출합니다.

예를 들어, 사용자에게 확인 대화 상자를 추가하여 Google에 더 이상 경고가 표시되지 않는 것 같습니다.

@Override 
    public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError error) { 
    final AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext()); 
    String message = "SSL Certificate error."; 
     switch (error.getPrimaryError()) { 
      case SslError.SSL_UNTRUSTED: 
       message = "The certificate authority is not trusted."; 
       break; 
      case SslError.SSL_EXPIRED: 
       message = "The certificate has expired."; 
       break; 
      case SslError.SSL_IDMISMATCH: 
       message = "The certificate Hostname mismatch."; 
       break; 
      case SslError.SSL_NOTYETVALID: 
       message = "The certificate is not yet valid."; 
       break; 
     } 
     message += " Do you want to continue anyway?"; 

     builder.setTitle("SSL Certificate Error"); 
     builder.setMessage(message); 
    builder.setPositiveButton("continue", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      handler.proceed(); 
     } 
    }); 
    builder.setNegativeButton("cancel", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      handler.cancel(); 
     } 
    }); 
    final AlertDialog dialog = builder.create(); 
    dialog.show(); 
} 

이렇게 변경하면 경고가 표시되지 않습니다. 위의 변경 구글 플레이 내 APK를 접수 한 후

5

제대로 SSL 인증서 validationoogle 놀이를 처리하는 방법 : 당신은 SSL 기반 웹 사이트를 이용하기 설정 웹보기를 활성화해야

import android.webkit.WebView; 
import android.webkit.WebViewClient; 
import android.webkit.SslErrorHandler; 
import android.net.http.SslError; 

... 

engine = (WebView) findViewById(R.id.my_webview); 
engine.setWebViewClient(new WebViewClient() { 

    @Override 
    public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error) { 
     handler.proceed(); 
    } 
}); 
+0

정말 고맙습니다. 마치 매력처럼 작동했습니다. +1 –

1

구글 플레이 내 응용 프로그램을 거부하고 내가 이런 짓을 ...

@Override 
    public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError error) { 

     try { 

      //Get the X509 trust manager from your ssl certificate 
      X509TrustManager trustManager = mySslCertificate.getX509TrustManager(); 

      //Get the certificate from error object 
      Bundle bundle = SslCertificate.saveState(error.getCertificate()); 
      X509Certificate x509Certificate; 
      byte[] bytes = bundle.getByteArray("x509-certificate"); 
      if (bytes == null) { 
       x509Certificate = null; 
      } else { 
       CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); 
       Certificate cert = certFactory.generateCertificate(new ByteArrayInputStream(bytes)); 
       x509Certificate = (X509Certificate) cert; 
      } 
      X509Certificate[] x509Certificates = new X509Certificate[1]; 
      x509Certificates[0] = x509Certificate; 

      // check weather the certificate is trusted 
      trustManager.checkServerTrusted(x509Certificates, "ECDH_RSA"); 

      Log.e(TAG, "Certificate from " + error.getUrl() + " is trusted."); 
      handler.proceed(); 
     } catch (Exception e) { 
      Log.e(TAG, "Failed to access " + error.getUrl() + ". Error: " + error.getPrimaryError()); 
      final AlertDialog.Builder builder = new AlertDialog.Builder(WebViewActivity.this); 
      String message = "SSL Certificate error."; 
      switch (error.getPrimaryError()) { 
       case SslError.SSL_UNTRUSTED: 
        message = "The certificate authority is not trusted."; 
        break; 
       case SslError.SSL_EXPIRED: 
        message = "The certificate has expired."; 
        break; 
       case SslError.SSL_IDMISMATCH: 
        message = "The certificate Hostname mismatch."; 
        break; 
       case SslError.SSL_NOTYETVALID: 
        message = "The certificate is not yet valid."; 
        break; 
      } 
      message += " Do you want to continue anyway?"; 

      builder.setTitle("SSL Certificate Error"); 
      builder.setMessage(message); 
      builder.setPositiveButton("continue", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        handler.proceed(); 
       } 
      }); 
      builder.setNegativeButton("cancel", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        handler.cancel(); 
       } 
      }); 
      final AlertDialog dialog = builder.create(); 
      dialog.show(); 
     } 
    } 

그리고 당신의 SSL 트러스트 매니저를 생성 pls는이 answer

을 확인
+0

정말 고마워요 :) 해결책에 너무 가깝고 끝까지 도와주었습니다. :) – Viktor

+0

@Viktor Welcome mate :) –