Android使用OkHttp訪問自簽名證書的Https介面
我的簡書:簡書
前言
在Android開發中,Okhttp想必大家都不陌生,一個處理網路請求的開源專案,是安卓端最火熱的輕量級框架。
本人在開發過程中也用了很長一段時間了,但是基本請求的都是http介面。即使訪問https網站也都是綠色的,有個很特殊的大型購票網站則不是,所以本文主要介紹如何使用Okhttp訪問自簽名證書的https介面。而且公司自己服務介面也全部換成了https介面,在去年就說ios要強制更換https介面,不然appstore無法上架,最近好像也沒信了,估計是政策放寬了吧。不管怎樣,今天就拿這個大型購票網站舉例來說,使用Okhttp訪問購票網站。
獲取簽名證書
購票網站的簽名證書可以在官網上直接下載,或者
為了方便將簽名證書新增到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
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、自簽名等概念,就不在本文中細說了。