Ric*_*ier 6 android ssl-certificate
我有两个无法连接到我的TLS v1.2端点的设备.所有其他人似乎都能够,包括浏览器,PostMan和iOS设备.
这些设备运行的是Android 5和7(因此TLS v1.2支持应该没有问题).
注意:这不是自签名证书.它由亚马逊签署.
直接的想法是:
Android碎片 - 也许设备(一个是Kindle Fire 7)不包括正确的证书进入操作系统.这可能不是设备制造商第一次做出破坏功能的奇怪决定.
API正在通过代理进行访问,实际上有一个正在检测的Man-In-The-Middle.
修复(1)意味着捆绑我们的证书,并在我们的证书到期时导致通常的问题.
我希望让用户安装一个调试版本,确认(1)或(2)是否是问题.这样的构建将检查服务器/代理提供的SSL证书,并将其记录回给我.
网站框架:
如何检查设备在访问端点时看到的SSL证书信息?
事实证明,有两种不同的例外被抛出.
Kindle Fire 7"平板电脑(KFAUWI,OS 5.1.1)正在抛弃我已经开始调查的问题,这个问题应该集中在这个问题上,即基本的SSL故障.
java.security.cert.CertPathValidatorException:
Trust anchor for certification path not found.
at com.android.org.conscrypt.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:331)
at com.android.org.conscrypt.TrustManagerImpl.checkServerTrusted(TrustManagerImpl.java:232)
at com.android.org.conscrypt.Platform.checkServerTrusted(Platform.java:114)
Run Code Online (Sandbox Code Playgroud)
LG设备(LG-SP200,OS 7.1.2)正在通过对等方关闭连接,如果在此处未解决,则应在新问题下解决:
javax.net.ssl.SSLHandshakeException:
Connection closed by peer
at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(NativeCrypto.java)
at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:360)
at okhttp3.internal.connection.RealConnection.connectTls(RealConnection.java:299)
Run Code Online (Sandbox Code Playgroud)
Robby Cornelissen在引用 OkHttp 的评论中提供了基本答案Response:
该信息应可从 获得
response.handshake().peerCertificates()。
在有效的握手的情况下,实现了一个简单的Interceptor检查证书的方法:
private static class SslCertificateLogger implements Interceptor {
public static final String TAG = "SSL";
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Response response;
try {
response = chain.proceed(request);
} catch (Exception e) {
Log.d(TAG, "<-- HTTP FAILED: " + e);
throw e;
}
Handshake handshake = response.handshake();
if (handshake == null) {
Log.d(TAG, "no handshake");
return response;
}
Log.d(TAG, "handshake success");
List<Certificate> certificates = handshake.peerCertificates();
if (certificates == null) {
Log.d(TAG, "no peer certificates");
return response;
}
String s;
for (Certificate certificate : certificates) {
s = certificate.toString();
Log.d(TAG, s);
}
return response;
}
}
Run Code Online (Sandbox Code Playgroud)
这会按照正常情况添加到OkHttpClient:
OkHttpClient.Builder builder = new OkHttpClient.Builder()
.addInterceptor(new SslCertificateLogger())
.build();
Run Code Online (Sandbox Code Playgroud)
Sangeet Suresh提出了一个类似的解决方案,它引用了 RetrofitResponse对象:
response?.raw()?.handshake()我想这会对你有帮助
这里重要的信息是 Retrofit 以这种方式提供对原始 OkHttp 响应的访问。
从 APIInterceptor获取 Retrofit 后,这不会在实际的 Retrofit 处理代码中而是在更高级别中使用。Response<>
将他的 Kotlin 解决方案转换回 Java 可能会产生如下结果:
okhttp3.Response raw = httpResponse.raw();
if (raw != null) {
Handshake handshake = raw.handshake();
if (handshake != null) {
List<Certificate> certificates = handshake.peerCertificates();
if (certificates != null) {
for (Certificate certificate : certificates) {
Log.d(TAG, certificate.toString());
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
两种解决方案都可以正常工作,前提handshake()是 不为空,即握手成功。
鉴于这是对失败握手的调查,需要采取进一步的步骤来“信任所有证书”(仅限调试版本!)。
这已被多次记录 - 这是一个这样的版本:
| 归档时间: |
|
| 查看次数: |
391 次 |
| 最近记录: |