android javax.net.ssl.SSLPeerUnverifiedException: No peer certificate
在android開發中,我們時不時會遇到一些非常奇怪的問題。最近,在專案中遇到了SSL證照相關的問題。
最近專案在做伺服器的環境搬遷工作,在新的環境下,移動端的APP請求不到伺服器,完成不了交易。
檢查了下服務端,沒有任何日誌的輸出。因此,判斷是移動端出現了問題,移動端根本將網路請求就沒有傳送到服務端。
在客戶端也沒有任何error的日誌。只是報了這個警告warn
報警告:android javax.net.ssl.SSLPeerUnverifiedException: No peer certificate
大概意思是:SSL檢查未驗證異常:沒有對方的證照
我們先簡單瞭解一下SSL證照的相關知識:
SSL是SecuritySocketLayer的縮寫,技術上稱為安全套接字,可以簡稱為加密通訊協議。
當選擇“SSL安全登入”後登入網站,使用者名稱和密碼會首先加密,然後通過SSL連線在 Internet 上傳送,
沒有人能夠讀取或訪問到您利用該連線傳送的資料。使用SSL可以對通訊(包括E-mail)內容進行高強度的加密,
從而可以有效防止黑客盜取您的使用者名稱、密碼和通訊內容,保證了郵箱的安全性。
為了更安全的保證個人隱私,建議如果沒有特殊情況,儘量選擇該項登入。
一般說來,在網上進行交易時,需要使用數字簽名來表明自己的身份,並使用數字簽名來進行有關的交易操作。
隨著電子商務的盛行,數位簽章的頒發機構 CA (如GlobalSign)中心將為電子商務的發展提供可靠的安全保障。
網站使用數字簽名之後,即可實現 SSL安全登入。
免費SSL證照不能登入: 免費SSL證照是部署在伺服器上面的,給網站的伺服器端和客戶端之間的資料傳輸加密的。
如果要用證照進行登入,需向CA機構申請客戶端證照才能實現強身份認證功能。
在URL前加https://字首表明是用SSL加密的。 你的電腦與伺服器之間收發的資訊傳輸將更加安全。
Web伺服器啟用SSL需要獲得一個伺服器證照並將該證照與要使用SSL的伺服器繫結。
http和https使用的是完全不同的連線方式,用的埠也不一樣,前者是80,後者是443。http的連線很簡單,是無狀態的,...
HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議
要比http協議安全
參考文章:android平臺實現SSL單雙向驗證
主要程式碼實現:
SSLSocketFactoryEx.java
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import org.apache.http.conn.ssl.SSLSocketFactory;
public class SSLSocketFactoryEx extends SSLSocketFactory {
SSLContext sslContext = SSLContext.getInstance("TLS");
public SSLSocketFactoryEx(KeyStore truststore)
throws NoSuchAlgorithmException, KeyManagementException,
KeyStoreException, UnrecoverableKeyException {
super(truststore);
TrustManager tm = new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
@Override
public void checkClientTrusted(
java.security.cert.X509Certificate[] chain, String authType)
throws java.security.cert.CertificateException {
}
@Override
public void checkServerTrusted(
java.security.cert.X509Certificate[] chain, String authType)
throws java.security.cert.CertificateException {
}
};
sslContext.init(null, new TrustManager[] { tm }, null);
}
@Override
public Socket createSocket(Socket socket, String host, int port,
boolean autoClose) throws IOException, UnknownHostException {
return sslContext.getSocketFactory().createSocket(socket, host, port,
autoClose);
}
@Override
public Socket createSocket() throws IOException {
return sslContext.getSocketFactory().createSocket();
}
}
編寫新的HttpClient getNewHttpClient來代替原有DefaultHttpClientMyHttpClient.java
import java.security.KeyStore;
import org.apache.http.HttpVersion;
import org.apache.http.client.HttpClient;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.protocol.HTTP;
public class MyHttpClient {
public static HttpClient getNewHttpClient() {
try {
KeyStore trustStore = KeyStore.getInstance(KeyStore
.getDefaultType());
trustStore.load(null, null);
SSLSocketFactory sf = new SSLSocketFactoryEx(trustStore);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("http", PlainSocketFactory
.getSocketFactory(), 80));
registry.register(new Scheme("https", sf, 443));
ClientConnectionManager ccm = new ThreadSafeClientConnManager(
params, registry);
return new DefaultHttpClient(ccm, params);
} catch (Exception e) {
return new DefaultHttpClient();
}
}
}
接著在專案裡把所有獲得HttpClient例項通過DefaultHttpClient,都改成從 getNewHttpClient獲取 //HttpClient httpclient = new DefaultHttpClient();
HttpClient httpclient = MyHttpClient.getNewHttpClient();
最後千萬別忘了檢查清單檔案中有沒有這幾個許可權:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.WRITE_APN_SETTINGS"/>
相關文章
- Certificate Authority
- git SSL certificate problem: unable to get local issuer certificateGit
- Fabric 1.0原始碼分析(32) Peer #peer node start命令實現原始碼
- Linux 報錯Certificate verification failed: The certificate is NOT trusted.LinuxAIRust
- Fabric 1.0原始碼分析(33) Peer #peer channel命令及子命令實現原始碼
- GIT clone報錯: SSL certificate problem: unable to get local issuer certificateGit
- Fabric 1.0原始碼分析(32)Peer #peer根命令入口及載入子命令原始碼
- Fabric 1.0原始碼分析(34) Peer #peer chaincode命令及子命令實現原始碼AI
- SSL certificate chainsAI
- yarn certificate has expiredYarn
- [轉]Android Studio匯入工程報錯 Error:Cause: peer not authenticated 解決方案AndroidError
- Fabric 1.0原始碼分析(31) Peer原始碼
- Connection reset by peer: socket write errorError
- java.io.IOException: Connection reset by peerJavaException
- VM啟動報:failed to launch peer processAI
- 關於Oracle Certificate ProfessionOracle
- 解決git SSL certificate problemGit
- Jaeger tchannel-go原始碼閱讀——PeerGo原始碼
- Node.js 應用 peer dependency 的用法Node.js
- npm install --legacy-peer-depsNPM
- PHP composer 報錯 certificate verify failedPHPAI
- 教育授權certificate used to sign the license
- Fabric1.4原始碼解析:Peer節點加入通道原始碼
- git (v2.18.0) error setting certificateGitError
- 專案使用guzzleHttp報錯:certificate has expiredHTTP
- 證書鎖定Certificate Pinning技術
- PostgreSQL提示:‘psql: FATAL: ”Peer authentication failed for user ”postgres“’錯誤SQLAI
- Fabric 1.0原始碼分析(35)Peer #EndorserServer(Endorser服務端)原始碼Server服務端
- Fabric 1.0原始碼分析(36) Peer #EndorserClient(Endorser客戶端)原始碼client客戶端
- WCF分散式安全開發實踐(11):訊息安全模式之Certificate身份驗證:Message_Certificate_WSHttpBinding分散式模式HTTP
- 鴻蒙HarmonyOS:深入Device Certificate Kit API:從整合到實戰鴻蒙HarmonyOS:深入Device Certificate Kit API:從整合到實戰鴻蒙devAPI
- Useless SAP PA certificate, do we still need to get it?
- Oracle Certificate Profession 1Z0-051-28Oracle
- Oracle Certificate Profession 1Z0-051-22Oracle
- Oracle Certificate Profession 1Z0-051-27Oracle
- Oracle Certificate Profession 1Z0-051-25Oracle
- Oracle Certificate Profession 1Z0-051-26Oracle
- Oracle Certificate Profession 1Z0-051-29Oracle