真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網站制作重慶分公司

Androidwebview手動校驗https證書(by星空武哥)

有些時候由于Android系統(tǒng)的bug或者其他的原因,導致我們的webview不能驗證通過我們的https證書,最明顯的例子就是華為手機mate7升級到Android7.0后,手機有些網站打不開了,而更新了webview的補丁后就沒問題了,充分說明系統(tǒng)的bug對我們混合開發(fā)webview加載https地址的影響是巨大的。那么我們怎么去解決這個問題呢?

成都創(chuàng)新互聯(lián)長期為成百上千家客戶提供的網站建設服務,團隊從業(yè)經驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網生態(tài)環(huán)境。為東臺企業(yè)提供專業(yè)的成都做網站、網站設計,東臺網站改版等技術服務。擁有十多年豐富建站經驗和眾多成功案例,為您定制開發(fā)。

Android webview手動校驗https證書(by 星空武哥)

首先我們去分析一下出現(xiàn)的原因
當webview加載https地址的時候,如果因為證書的問題出錯的時候就會走onReceivedSslError()方法

webView.setWebViewClient(new WebViewClient() { 
 
  @Override 
  public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { 
    super.onReceivedSslError(view, handler, error); 
  } 
} 

而super.onReceivedSslError()默認是

Android webview手動校驗https證書(by 星空武哥)

handler.cancel() 就是讓加載的頁面白屏,所有導致了如果webview校驗證書存在異常,android在默認情況下會顯示白屏,我們也可調用handler.proceed(),大多時候很多人都是這個處理,但是這也就意味著https證書失去了他存在的意義了。

Android webview手動校驗https證書(by 星空武哥)

那么如果你的網站證書是正常的,但是因為系統(tǒng)的bug導致了加載異常,這時候就需要我們手動校驗了。
其實我們是可以手動校驗網站證書的sha256,如果異常之后校驗sha256就執(zhí)行handler.proceed(),失敗就退出應用。
首先我們要獲取網站的證書
利用谷歌瀏覽器,打開網址并且按下“F12”,打開開發(fā)者模式

Android webview手動校驗https證書(by 星空武哥)

一步一步導出證書

Android webview手動校驗https證書(by 星空武哥)

然后在打開sha256校驗網址:http://www.atool.org/file_hash.php

或http://tools.jb51.net/password/sha_encode

Android webview手動校驗https證書(by 星空武哥)

這樣就獲取到了證書的sha256的值,寫了一個工具類

  /**
   * SSL證書錯誤,手動校驗https證書
   *
   * @param cert   https證書
   * @param sha256Str sha256值
   * @return true通過,false失敗
   */
  public static boolean isSSLCertOk(SslCertificate cert, String sha256Str) {
    byte[] SSLSHA256 = hexToBytes(sha256Str);
    Bundle bundle = SslCertificate.saveState(cert);
    if (bundle != null) {
      byte[] bytes = bundle.getByteArray("x509-certificate");
      if (bytes != null) {
        try {
          CertificateFactory cf = CertificateFactory.getInstance("X.509");
          Certificate ca = cf.generateCertificate(new ByteArrayInputStream(bytes));
          MessageDigest sha256 = MessageDigest.getInstance("SHA-256");
          byte[] key = sha256.digest(((X509Certificate) ca).getEncoded());
          return Arrays.equals(key, SSLSHA256);
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    }
    return false;
  }

  /**
   * hexString轉byteArr
   * 

例如:

* hexString2Bytes("00A8") returns { 0, (byte) 0xA8 } * * @param hexString * @return 字節(jié)數(shù)組 */ public static byte[] hexToBytes(String hexString) { if (hexString == null || hexString.trim().length() == 0) return null; int length = hexString.length() / 2; char[] hexChars = hexString.toCharArray(); byte[] bytes = new byte[length]; String hexDigits = "0123456789abcdef"; for (int i = 0; i < length; i++) { int pos = i * 2; // 兩個字符對應一個byte int h = hexDigits.indexOf(hexChars[pos]) << 4; // 注1 int l = hexDigits.indexOf(hexChars[pos + 1]); // 注2 if (h == -1 || l == -1) { // 非16進制字符 return null; } bytes[i] = (byte) (h | l); } return bytes; }

然后在onReceivedSslError()判斷

webView.setWebViewClient(new WebViewClient() {
	@Override
	public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
		super.onReceivedSslError(view, handler, error);
		if (error.getPrimaryError() == SslError.SSL_INVALID) {
			// 如果手動校驗sha256成功就允許加載頁面
			if (SSLCertUtil.isSSLCertOk(error.getCertificate(), "6683c9584b8287ec3a50e312f4a540c79938aaeb76bd02e40a9ca037ee5d24f4")) {
				handler.proceed();
			} else {
				try {
					new AlertDialog.Builder(MainActivity.this)
							.setTitle("警告")
							.setMessage("證書校驗失敗")
							.setPositiveButton("退出", new DialogInterface.OnClickListener() {
								@Override
								public void onClick(DialogInterface dialog, int which) {
									System.exit(0);
									dialog.dismiss();
								}
							}).show();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		} else {
			handler.cancel();
		}
	}
});

這里我們只是真對SslError.SSL_INVALID進行了判斷,可能還有其他情況,根據自己的情況判定。

/**
 * The certificate is not yet valid
 */
public static final int SSL_NOTYETVALID = 0;
/**
 * The certificate has expired
 */
public static final int SSL_EXPIRED = 1;
/**
 * Hostname mismatch
 */
public static final int SSL_IDMISMATCH = 2;
/**
 * The certificate authority is not trusted
 */
public static final int SSL_UNTRUSTED = 3;
/**
 * The date of the certificate is invalid
 */
public static final int SSL_DATE_INVALID = 4;
/**
 * A generic error occurred
 */
public static final int SSL_INVALID = 5;

這樣就完成了手動校驗https證書校


網站標題:Androidwebview手動校驗https證書(by星空武哥)
當前URL:http://weahome.cn/article/jcceij.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部