1. 程式人生 > >Android使用OkHttp訪問自簽名證書的Https介面

Android使用OkHttp訪問自簽名證書的Https介面

我的簡書:簡書

前言

在Android開發中,Okhttp想必大家都不陌生,一個處理網路請求的開源專案,是安卓端最火熱的輕量級框架。

本人在開發過程中也用了很長一段時間了,但是基本請求的都是http介面。即使訪問https網站也都是綠色的,有個很特殊的大型購票網站則不是,所以本文主要介紹如何使用Okhttp訪問自簽名證書的https介面。而且公司自己服務介面也全部換成了https介面,在去年就說ios要強制更換https介面,不然appstore無法上架,最近好像也沒信了,估計是政策放寬了吧。不管怎樣,今天就拿這個大型購票網站舉例來說,使用Okhttp訪問購票網站。

獲取簽名證書

購票網站的簽名證書可以在官網上直接下載,或者

點選這裡下載即可。srca.cer即為購票網站的簽名證書。

為了方便將簽名證書新增到OkHttp中,可以將簽名證書放在本地的assets資料夾下,為了便於管理我放在了assets/cers目錄下,在程式碼中可以通過流的形式獲取到證書檔案。

新增證書一般是在訪問介面之前新增,為了方便,我放在了Application中,這樣的話,在應用啟動的時候就會已經將新增新增到了OkHttp中。

使用Okhttp訪問介面

  • 使用Android Studio的話,直接新增Okhttp的依賴:
compile 'com.squareup.okhttp3:okhttp:3.3.1'
  • 獲取簽名證書檔案流
//獲取證書流
private void readHttpsCer() {
        try {
            InputStream is = getAssets().open("cers/srca.cer");
            NetConfig.addCertificate(is); // 這裡將證書讀取出來,,放在配置中byte[]裡
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }
  • NetConfig相關程式碼:
// 證書資料
    private
static List<byte[]> CERTIFICATES_DATA = new ArrayList<>(); /** * 新增https證書 * * @param inputStream */ public synchronized static void addCertificate(InputStream inputStream) { Log.i(TAG, "#addCertificate inputStream = " + inputStream); if (inputStream != null) { try { int ava = 0;// 資料當次可讀長度 int len = 0;// 資料總長度 ArrayList<byte[]> data = new ArrayList<>(); while ((ava = inputStream.available()) > 0) { byte[] buffer = new byte[ava]; inputStream.read(buffer); data.add(buffer); len += ava; } byte[] buff = new byte[len]; int dstPos = 0; for (byte[] bytes : data) { int length = bytes.length; System.arraycopy(bytes, 0, buff, dstPos, length); dstPos += length; } CERTIFICATES_DATA.add(buff); } catch (IOException e) { e.printStackTrace(); } } } /** * https證書 * * @return */ public static List<byte[]> getCertificatesData() { return CERTIFICATES_DATA; }
  • 編寫工具類,將證書新增到OkHttp中:
 public static OkHttpClient createOkHttp() {

        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        // 新增證書
        List<InputStream> certificates = new ArrayList<>();
        List<byte[]> certs_data = NetConfig.getCertificatesData();

        // 將位元組陣列轉為陣列輸入流
        if (certs_data != null && !certs_data.isEmpty()) {
            for (byte[] bytes : certs_data) {
                certificates.add(new ByteArrayInputStream(bytes));
            }
        }


        SSLSocketFactory sslSocketFactory = getSocketFactory(certificates);
        if (sslSocketFactory != null) {
            builder.sslSocketFactory(sslSocketFactory);
        }

        return builder.build();
    }


    /**
     * 新增證書
     *
     * @param certificates
     */
    private static SSLSocketFactory getSocketFactory(List<InputStream> certificates) {
        try {
            CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
            KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
            keyStore.load(null);
            try {
                for (int i = 0, size = certificates.size(); i < size; ) {
                    InputStream certificate = certificates.get(i);
                    String certificateAlias = Integer.toString(i++);
                    keyStore.setCertificateEntry(certificateAlias, certificateFactory
                            .generateCertificate(certificate));
                    if (certificate != null)
                        certificate.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

            SSLContext sslContext = SSLContext.getInstance("TLS");
            TrustManagerFactory trustManagerFactory =
                    TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
            trustManagerFactory.init(keyStore);
            sslContext.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom());
            return sslContext.getSocketFactory();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
  • 檢視測試使用結果:

將自簽名證書新增到Okhttp中,通過建立的OkHttpClient物件,我們就可以訪問相關的Https介面服務了。

參考閱讀

相關推薦

Android使用OkHttp訪問簽名證書Https介面

我的簡書:簡書 前言 在Android開發中,Okhttp想必大家都不陌生,一個處理網路請求的開源專案,是安卓端最火熱的輕量級框架。 本人在開發過程中也用了很長一段時間了,但是基本請求的都是http介面。即使訪問https網站也都是綠色的,有個很特殊的大型

Cordova下簽名證書無法訪問https問題(IOS和Android)

最近準備將專案上架到AppStore,但從17年開始,AppStore稽核條件要求所有網路請求都為https,所以就在內網(192.……)布好了自測環境,並將環境對映到了公網(58.……)。接著問題就

IIS 使用OpenSSL 生成的簽名證書,然後使用SingalR 客戶端訪問Https 站點通信

需要 center html sys ask proxy 客戶端訪問 The con 使用SignalR 的客戶端去發送消息給使用 https 部署的站點,官方文檔目前並沒有詳細的教程,所以在此記錄下步驟: 使用管理員身份打開cmd 窗口,選擇一個整數保存文件夾的地

簽名https證書是不安全的

算法 -s tro 手動 ssl證書 為什麽 必須 無法獲得 報錯 一、項目內的需求 我們做的app都是企業級的應用,而企業級的應用的下載需要遵循itms協議,itms協議下需要https鏈接,這就需要你的服務器支持https的協議,該協議需要申請SSL證書,我們測試時用的

解決linux netcore https請求使用簽名證書忽略安全檢查方法

mva supported support ali figure -s issue 大致 iss 當前系統環境:centos7 x64. dotnet 2.0. 不管是 ServicePointManager.ServerCertificateValidationCallb

https CA簽名證書,並給Webserver頒發證書

extension there form nal 3.2 vim city append cor **CA主機執行命令** [root@centos7 ~]# cd /etc/pki/CA [root@centos7 CA]# touch index.txt [root@c

Nginx 配置 HTTPS簽名證書

sta num web oca pos sof AI bsp OS 工具:OpenSSL ssl的開源實現,幾乎實現了市面上所有的加密libcrypto: 通用加密庫, 任何軟件要實現加密功能 鏈接調用這個庫libssl: TLS/SSL 加密庫 openssl:

tomcat配置https簽名證書(keytool生成)

pri list tin led str orm unit lock pass tomcat配置https自簽名證書(keytool生成) 生成keystore keytool -genkeypair -alias "server" -keyalg &

SDWebImage 加載Https簽名證書時的圖片問題

str values ext 找到 from ict ati implement creat 你是否遇到了這種情況,好不容易把自簽名HTTPS證書配置好了,訪問https接口也成功了,但是圖片加載不出來? 傳了SDWebImageAllowInvalidSSLCertifi

Android開發 - Retrofit 2 使用簽名HTTPS證書進行API請求

為了確保資料傳輸的安全,現在越來越多的應用使用Https的方式來進行資料傳輸,使用https有很多有點,比如: HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議,要比http協議安全,可防止資料在傳輸過程中不被竊取、改變,確保資料的完整性。 HTTPS是現行架構下最安

Nginx配置https簽名證書

曾經iOS 為安全起見要求所有請求必須https,記錄專案中配置https過程。 # 生成一個RSA金鑰 openssl genrsa -des3 -out xgj.key 1024 # 拷貝一個不需要輸入密碼的金鑰檔案 openssl rsa -in xgj.key -out xg

iOS開發HTTPS實現之信任SSL證書簽名證書

                                          &nb

Retrofit 2 使用簽名HTTPS證書進行API請求

為了確保資料傳輸的安全,現在越來越多的應用使用Https的方式來進行資料傳輸,使用https有很多有點,比如: HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議,要比http協議安全,可防止資料在傳輸過程中不被竊取、改變,確保資料的完整性。 HTTPS是現行架構下最安全的解決方

HTTPS協議以及雙向數字證書校驗 簽名證書的生成

$ openssl x509 -text -in client.crt -noout Certificate:     Data:         Version: 1 (0×0)         Serial Number:             d6:e3:f6:fa:ae:65:ed:df      

HTTPS】使用OpenSSL生成帶有SubjectAltName的簽名證書

操作步驟 首先新建一個配置檔案 ssl.conf如下: [ req ] default_bits = 4096 distinguished_name = req_distinguished_

使用CA簽名證書搭建HTTPS網站

在自己倒騰https網站的時候用自定義的CA給自己的網站做自簽名的問題一直困擾了我好久,下面是我自己測試成功的案例,網上有很多類似的問題,在這裡儲備一份供自己和他人蔘考使用。 1. 安裝linux,apache,openssl元件,在此不做贅述,我用的就是

glide 整合okhttp3 解決https簽名證書問題

compile 'com.github.bumptech.glide:glide:3.7.0'compile 'com.github.bumptech.glide:okhttp3-integration:[email protected]'

tomcat配置https簽名證書

一、環境搭建 安裝jdk: 略安裝tomcat : 略配置java環境變數:略執行測試tomcat:略安裝vcredist_x86:這個的東西是安裝openssl的環境,安裝oenssl前需安裝此環境。安裝openssL:a網上搜索Win32OpenSSL-1_0_1g.e

iOS: HTTPS簽名證書

不是每個公司都會以數百美金一年的代價向CA購買SSL證書。在企業應用中,付費的SSL證書經常被自簽名證書所替代。當然,對於自簽名證書iOS是沒有能力驗證的。Safari遇到這種無法驗證的自簽名證書的唯一處理方法,就是將問題扔給使用者,讓使用者決定是否應該相信此類證書。它提供了

HttpClient實現HTTPS客戶端程式設計---可信證書簽名證書

HttpClient的HTTPS客戶端程式設計—可信證書與自簽名證書 本文基於HttpClient4.5.4,對可信證書和自簽名證書的網站訪問編碼,涉及https連線過程、證書、證書鏈、根證書、keystore、自簽名等概念,就不在本文中細說了。