国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Android中使用Webview SSL 自簽名CA證書安全校驗方案

這篇具有很好參考價值的文章主要介紹了Android中使用Webview SSL 自簽名CA證書安全校驗方案。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言:? ? ?

????????因為我們的項目是Android + H5,之前的做法是把H5所需要的資源和html下載到本地這樣證書校驗不會走系統(tǒng)瀏覽器層只需要項目中預埋根證書就可以了,但是如果用webview加載線上的域名自簽名證書就會走系統(tǒng)級校驗在onReceivedSslError中返回ssl證書不受信,從而導致出現(xiàn)白頁的情況。

本篇文章貴在直接給提供一個工具類按照步驟直接使用:

使用方法:

1、在自己app的gradle中添加okhttp依賴,項目中如有可以忽略?

    implementation 'com.squareup.okhttp3:okhttp:3.11.0'
    implementation 'com.squareup.okio:okio:1.14.0'
    implementation 'com.squareup.okhttp3:okhttp-urlconnection:3.11.0'

2、把服務器端給你的CA根證書(.cer后綴的,貌似.pem的不行但是自己改一下后綴好像可以用)放到自己的assets目錄下

3、在自己的webview中setWebViewClient的時候重寫一下onReceivedSslError方法,在該方法中處理ssl握手失敗的場景可以通過打印error.getPrimaryError()去SslError類中對比一下報錯原因

mWebview.setWebViewClient(new WebViewClient() {
    ...
    @Override
			public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
//				super.onReceivedSslError(view, handler, error);
				//自簽名證書校驗失敗
				new CheckoutServerCaUtil().checkoutServerCA(handler,view.getUrl(),view.getContext(),"chain.cer");
			}
}

4、使用提供的工具類直接校驗,工具如下創(chuàng)建名為CheckoutServerCaUtil的類直接ctrl + v 粘貼調(diào)用checkoutServerCA方法,參數(shù)參考工具中的注釋部分就可完成證書的校驗和主機名校驗:

package com.citicbank.cbframeworkcore.util;


import android.annotation.SuppressLint;
import android.content.Context;
import android.util.Log;
import android.webkit.SslErrorHandler;


import java.io.IOException;
import java.io.InputStream;
import java.security.KeyStore;
import java.security.SecureRandom;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.Arrays;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLPeerUnverifiedException;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;
import javax.security.auth.x500.X500Principal;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

/**
 * author : jsxin
 * e-mail : jsxin0816@163.com
 * time   : 2022/11/17
 * desc   : 分行自簽名證書校驗工具:
 *          功能:1、根證書校驗 2、主機名校驗
 *          用法:自己的webview.setWebViewClient(new WebViewClient() {
 *              new CheckoutServerCaUtil().checkoutServerCA(handler,view.getUrl(),view.getContext());
 *          }
 */
public class CheckoutServerCaUtil {
    private final String TAG = "CheckoutServerCaUtil";
    public CheckoutServerCaUtil() {
    }

    /**
     * 根證書校驗:onReceivedSslError(WebView view, SslErrorHandler handler, SslError error)
     * @param handler :   onReceivedSslError回調(diào):SslErrorHandler
     * @param url :       onReceivedSslError回調(diào):WebView.getUrl
     * @param context:    onReceivedSslError回調(diào):WebView.getContext
     * @param caName:    放在assets目錄下的根證書名稱:例如:"chain.cer"
     */
    public void checkoutServerCA(final SslErrorHandler handler, String url, Context context,String caName) {
        OkHttpClient.Builder builder;
        try {
            InputStream inputStream = context.getAssets().open(caName);
            Log.d(TAG,"jsxin--->>>執(zhí)行:--->>>00--->>>url:" + url);
            builder = setCertificates(new OkHttpClient.Builder(), inputStream);

        } catch (IOException e) {
            Log.d(TAG,"jsxin--->>>異常:--->>>01");
            builder = new OkHttpClient.Builder();
        }
        Request request = new Request.Builder().url(url)
                .build();
        builder.build().newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException error) {
                Log.d(TAG,"jsxin--->>>自簽名證書校驗結(jié)果:---error:----" + error.toString());
                handler.cancel();
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                Log.d(TAG,"jsxin--->>>自簽名證書校驗結(jié)果:---onResponse:----" + response.code());
                handler.proceed();
            }
        });
    }

    private OkHttpClient.Builder setCertificates(OkHttpClient.Builder client, InputStream... certificates) {

        try {
            Log.d(TAG,"jsxin--->>>執(zhí)行:--->>>01");

            CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");

            KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());

            keyStore.load(null);

            int index = 0;

            for (InputStream certificate : certificates) {

                String certificateAlias = Integer.toString(index++);

                keyStore.setCertificateEntry(certificateAlias, certificateFactory.generateCertificate(certificate));

                try {

                    if (certificate != null)

                        certificate.close();

                } catch (IOException e) {
                    Log.d(TAG,"jsxin--->>>異常:--->>>02");
                    e.printStackTrace();
                }

            }
            Log.d(TAG,"jsxin--->>>執(zhí)行:--->>>02");
            SSLContext sslContext = SSLContext.getInstance("TLS");

            TrustManagerFactory trustManagerFactory =

                    TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());

            trustManagerFactory.init(keyStore);

            sslContext.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom());

            SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
            TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
            if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) {
                Log.d(TAG,"jsxin--->>>異常:--->>>03");
                throw new IllegalStateException("Unexpected default trust managers:"
                        + Arrays.toString(trustManagers));
            }
            X509TrustManager trustManager = (X509TrustManager) trustManagers[0];
            Log.d(TAG,"jsxin--->>>執(zhí)行:--->>>03");

            client.sslSocketFactory(sslSocketFactory, trustManager);
            hostNameVerifier(client);
        } catch (Exception e) {
            Log.d(TAG,"jsxin--->>>異常:--->>>04");
            e.printStackTrace();

        }

        return client;

    }

    private void hostNameVerifier(OkHttpClient.Builder client) {
        Log.d(TAG,"jsxin--->>>執(zhí)行:--->>>04");
        client.hostnameVerifier(new HostnameVerifier() {
            @SuppressLint("BadHostnameVerifier")
            @Override
            public boolean verify(String hostname, SSLSession session) {
                String peerHost = session.getPeerHost();//服務器返回的域名
                Log.d(TAG,"jsxin--->>>執(zhí)行:--->>>05--->>>服務器返回域名 peerHost:" + peerHost + "--->>>主機名:" + hostname);
                try {
                    X509Certificate[] peerCertificates = (X509Certificate[]) session.getPeerCertificates();
                    for (X509Certificate c : peerCertificates) {
                        X500Principal subjectX500Principal = c.getSubjectX500Principal();
//                        String name = new X500Principal(subjectX500Principal).getName();
                        String name = subjectX500Principal.getName();
                        Log.d(TAG,"jsxin--->>>執(zhí)行:--->>>06--->>>subjectX500Principal.getName():" + name);
                        String[] split = name.split(",");
                        for (String s : split) {
                            if (s.startsWith("CN")) {
                                if (s.contains(hostname) && s.contains(peerHost)) {
                                    Log.d(TAG,"jsxin--->>>執(zhí)行:--->>>07");
                                    return true;
                                }
                            }
                        }
                    }
                } catch (SSLPeerUnverifiedException e) {
                    Log.d(TAG,"jsxin--->>>異常:--->>>05");
                    e.printStackTrace();
                }
                Log.d(TAG,"jsxin--->>>主機名校驗失敗");
                return false;
            }
        });
    }
}

如果想系統(tǒng)的學習一下可以參考這個鏈接,網(wǎng)上也基本上都是抄的這個但是里面有的一些方法過時了,所以可以直接梭哈我的工具:Android Webview SSL 自簽名安全校驗解決方案 - 熠然 - 博客園文章來源地址http://www.zghlxwxcb.cn/news/detail-536501.html

到了這里,關于Android中使用Webview SSL 自簽名CA證書安全校驗方案的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • SpringBoot整合自簽名SSL證書,轉(zhuǎn)變HTTPS安全訪問(單向認證服務端)

    SpringBoot整合自簽名SSL證書,轉(zhuǎn)變HTTPS安全訪問(單向認證服務端)

    HTTP 具有相當優(yōu)秀和方便的一面,然而 HTTP 并非只有好的一面,事物皆具兩面性,它也是有不足之處的。例如: 通信使用明文(不加密),內(nèi)容可能會被竊聽。 不驗證通信方的身份,因此有可能會遭遇偽裝。 無法證明報文的完整性,所以有可能會遭篡改等。 因HTTP有存在通信

    2024年02月06日
    瀏覽(24)
  • openssl 生成自簽名證書以及CA證書鏈

    執(zhí)行命令后,會提示你輸入一些內(nèi)容,請按照提示輸入,每一項輸入的內(nèi)容需要自己記住 其中root.ext手動創(chuàng)建,內(nèi)容如下: 中間證書的制作過程與根證書類似,這里直接將命令貼上。 這里涉及到一個ca_intermediate.ext,和root.ext類似,需要手動創(chuàng)建,內(nèi)容如下 輸出結(jié)果應該如下所

    2024年02月09日
    瀏覽(25)
  • Https、CA證書、數(shù)字簽名

    Https、CA證書、數(shù)字簽名

    Https Http協(xié)議 Http協(xié)議是目前應用比較多應用層協(xié)議,瀏覽器對于Http協(xié)議已經(jīng)實現(xiàn)。Http協(xié)議基本的構(gòu)成部分有 請求行 : 請求報文的第一行 請求頭 : 從第二行開始為請求頭內(nèi)容的開始部分。每一個請求頭都是由K-V鍵值對組成。 請求體: 請求頭完成后以空行結(jié)束、從空行開始

    2024年02月12日
    瀏覽(20)
  • SSL中的CA證書

    SSL中的CA證書

    目錄 一、CA概述 二、數(shù)據(jù)加密 三、身份認證 ????????SSL如何保證網(wǎng)絡通信的安全和數(shù)據(jù)的完整性呢?就是采用了兩種手段: 身份認證 和 數(shù)據(jù)加密 。身份認證就需要用到CA證書。 ????????CA是證書的簽發(fā)機構(gòu),它是公鑰基礎設施(Public Key Infrastructure,PKI)的核心。

    2024年04月12日
    瀏覽(22)
  • 利用OpenSSL 自簽CA證書制作鏈式SSL證書

    利用OpenSSL 自簽CA證書制作鏈式SSL證書

    本文描述的是利用自簽CA制作鏈式證書的步驟,主要是制作中間證書的關鍵步驟。 目前CA證書基本均為鏈式證書,其主要目的是利用中間證書的特性,既可以保護根證書的密鑰安全性,又可以方便進行吊銷操作。 0x00 制作根證書密鑰(root.key): 參數(shù)含義: genrsa:? 生成RSA密鑰

    2024年02月11日
    瀏覽(18)
  • Elasticsearch:使用不同的 CA 更新安全證書 (二)

    Elasticsearch:使用不同的 CA 更新安全證書 (二)

    在之前的文章 “Elasticsearch:使用不同的 CA 更新安全證書 (一)” 中,我詳細地描述了如何更新 transport 層的證書。transport 層的證書復制集群中各個節(jié)點之前的連接,甚至關乎集群之前的連接。在這邊文章中,我將繼續(xù)之前的內(nèi)容來詳述如何替換 HTTP 層的證書。 HTTP:用于

    2023年04月08日
    瀏覽(21)
  • openssl給內(nèi)網(wǎng)IP生成ca證書(ssl證書)

    openssl給內(nèi)網(wǎng)IP生成ca證書(ssl證書)

    ?注意:大家自己按照自己的目錄創(chuàng)建就行,我的直接放在/opt目錄下了。 ?注意:申請的時候會讓大家填一些參數(shù),下面是參數(shù)說明及示例: ?注意:這一步也會輸入?yún)?shù),要和上一次輸入的保持一致? ? ? ?注意:這一步也會輸入?yún)?shù),要和前兩次輸入的保持一致? 注意:

    2024年02月07日
    瀏覽(26)
  • 內(nèi)網(wǎng)環(huán)境下nginx使用自簽名ssl證書配置https請求

    內(nèi)網(wǎng)環(huán)境下nginx使用自簽名ssl證書配置https請求

    一、安裝Openssl nginx有openssl 命令,沒有的自行百度,我配置的nginx是存在的所以沒查這部分 二、生成密鑰 可以在本地生成然后把文件拷貝到服務器,也可以直接在服務器指定目錄生成,我選擇的后者。 應該是哪個目錄都可以,只要在nginx.conf文件中引入正確地址就可以 我的配

    2024年01月21日
    瀏覽(21)
  • TLS、SSL、CA 證書、公鑰、私鑰

    TLS、SSL、CA 證書、公鑰、私鑰

    HTTP 協(xié)議是超文本傳輸協(xié)議(Hyper Text Transfer Protocol)的縮寫,它是從 WEB 服務器傳輸超文本標記語言 HTML 到本地瀏覽器的傳送協(xié)議。HTTP 設計之初是為了提供一種發(fā)布和接收 HTML 頁面的方法,時至今日,它的作用已經(jīng)不僅僅于此了。 對于我們 Java 工程師而言,HTTP 應該算是再熟

    2024年02月13日
    瀏覽(20)
  • Linux(openssl):用CA證書簽名具有SAN的CSR

    Linux(openssl):創(chuàng)建CA證書,并用其對CSR進行簽名_生成ca證書簽名請求文件csr-CSDN博客 提供了方法為CSR進行簽名。 對于有SAN的CSR如何簽名呢? 1.創(chuàng)建CA證書,與下面的帖子一樣

    2024年01月22日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包