我目前正在尝试连接到没有域名且只能通过其IP地址访问的服务器。我以前曾尝试通过使用图书馆齐射来做到这一点,但是在花了一天的研究之后,我无法弄清为什么ssl握手不起作用。切换到Okhttp后,我得到了警告:
javax.net.ssl.SSLPeerUnverifiedException:主机名185.101.92.193未通过验证:
证书:sha256 / QMgPlAslWrBi1dd / P17AKxJCniO2RfHQ5MufVO5Xji4 =
DN:1.2.840.113549.1.9.1 =#1619626c61636b6a616676d92f193d92e192d90f192d92f192d90f92d90e192d90e92L1092e92d90e92L94e1e1e1e1e1e1e1e1e3e6e0b0e0b0e0b0c人=柏林,ST =柏林,C = DE
subjectAltNames:[]
现在这个问题已经在github上解决了:https : //github.com/square/okhttp/issues/1467
我已使用以下代码“解决”了该问题(请看底部的HostnameVerifier):
// loading CAs from an InputStream
try {
CertificateFactory cf = CertificateFactory.getInstance("X.509");
InputStream cert = context.getResources().openRawResource(R.raw.servercert);
Certificate ca;
try {
ca = cf.generateCertificate(cert);
} finally {
cert.close();
}
// creating a KeyStore containing our trusted CAs
String keyStoreType = KeyStore.getDefaultType();
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(null, null);
keyStore.setCertificateEntry("ca", ca);
// creating a TrustManager that trusts the CAs in our KeyStore
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(keyStore);
// creating an SSLSocketFactory that uses our TrustManager
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, tmf.getTrustManagers(), null);
client = new OkHttpClient.Builder().sslSocketFactory(sslContext.getSocketFactory())
.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String s, SSLSession sslSession) {
if(s.equals(myIPAddress)){
return true;
}else{
return false;
}
}
})
.build();
}catch (Exception e){
e.printStackTrace();
}
现在,这对我来说似乎是一种不好的做法,我的实际问题是:像这样(从安全角度考虑)实现HostnameVerifier可能会出现什么问题,以及我如何以更复杂的方式解决此问题?
域名与域名无关,唯一的问题是您的应用程序(android)无法验证证书,因为它是私有的(自签名证书)。您在代码中所做的只是通过覆盖SSLFactory并创建一个使用您的CA的新方法来绕过验证过程。查看以下Android文档:https : //developer.android.com/training/articles/security-ssl.html#CommonProblems
您可以继续拥有的一切。或购买证书,则完全不需要此代码。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句