android自验签名证书,没有以前的互联网连接,无法验证Android自签名证书
使用SSL基礎(chǔ)架構(gòu):
我們有一個(gè)有效的客戶端/服務(wù)器設(shè)置,其中Android版本4.2和4.4的手機(jī)充當(dāng)客戶端,必須通過其自簽名SSL證書驗(yàn)證服務(wù)器.
問題:
只要設(shè)備在嘗試連接之前至少有一次互聯(lián)網(wǎng)訪問權(quán)限,服務(wù)器證書驗(yàn)證就會(huì)起作用.但是,如果執(zhí)行恢復(fù)出廠設(shè)置且設(shè)備直接連接到?jīng)]有Internet連接的專用網(wǎng)絡(luò),則證書驗(yàn)證將失敗.
重現(xiàn)行為:
>出廠重置手機(jī)
>重新啟動(dòng)而不選擇連接到具有Internet訪問權(quán)限的WiFi
>嘗試驗(yàn)證自簽名SSL證書 – >失敗
>連接到可上網(wǎng)的WiFi
>重新連接到原始專用網(wǎng)絡(luò)
>嘗試驗(yàn)證自簽名SSL證書 – >作品
從技術(shù)上講,設(shè)備不應(yīng)該需要Internet訪問來驗(yàn)證自簽名證書.在進(jìn)行任何SSL服務(wù)器驗(yàn)證之前,是否存在某種必須加載的黑名單?我可以阻止這種行為嗎?
創(chuàng)建SSL上下文:
//Using a client certificate
String password = "clientpass";
KeyStore keyStore = KeyStore.getInstance("PKCS12");
InputStream is = context.getResources().openRawResource(R.raw.client);
keyStore.load(is,password.tocharArray());
is.close();
KeyManagerFactory kmf = KeyManagerFactory.getInstance("X509");
kmf.init(keyStore,password.tocharArray());
KeyManager[] keyManagers = kmf.getKeyManagers();
// Using self signed certificate
CertificateFactory cf = CertificateFactory.getInstance("X.509");
is = context.getResources().openRawResource(R.raw.cacert);
InputStream caInput = new BufferedInputStream(is);
Certificate ca;
try {
ca = cf.generateCertificate(caInput);
Log.i("CA","ca=" + ((X509Certificate) ca).getSubjectDN());
} finally {
caInput.close();
}
// Create a KeyStore containing our trusted CAs
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(null);
trustStore.setCertificateEntry("ca",ca);
// Create a TrustManager that trusts the CAs in our KeyStore
TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");
tmf.init(trustStore);
TrustManager[] trustManagers = tmf.getTrustManagers();
// Create an SSLContext that uses our Trustmanager and Keymanager
SSLContext sslcontext = SSLContext.getInstance("TLS");
sslcontext.init(keyManagers,trustManagers,null);
//create a socket to connect with the server
SSLSocketFactory socketFactory = sslContext.getSocketFactory();
SSLSocket socket = (SSLSocket) socketFactory.createSocket(serverAddr,port);
socket.setUseClientMode(true);
socket.addHandshakeCompletedListener(this);
socket.startHandshake();
在startHandshake中出現(xiàn)異常失敗:
javax.net.ssl.SSLHandshakeException: com.android.org.bouncycastle.jce.exception.ExtCertPathValidatorException: Could not validate certificate: null
總結(jié)
以上是生活随笔為你收集整理的android自验签名证书,没有以前的互联网连接,无法验证Android自签名证书的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 坦克大战
- 下一篇: android ble 连续读写,And