【发布时间】:2015-05-21 07:10:48
【问题描述】:
首先我想说的是,我正在探索 SSL 套接字的世界,网上没有那么多资料,我已经阅读了 StackOverflow 上的大部分主题,但我仍然对 TrustManager 的概念感到困惑,密钥库、主机名验证器... 所以我必须编写一个 Java 客户端(单向 SSL)来连接一些使用 SSL 的服务器。 我正在做三种行为,即 Android 的原生行为(我相信如果证书不受信任,它就不会处理握手)。 一个朴素的,带有一个自定义的 TrustManager 和空的 checkServerTrusted 函数。 现在我想使用 HostNameVerfier 来允许所有主机名。 但老实说,我有点迷路了,我已经搜索了好几天,互联网上没有关于 android ssl 的好材料。 到目前为止,这是我的代码:
Naive custom TrustManager (empty checkServerTrusted)
SSLContext sslContext = SSLContext.getInstance("SSL");
TrustManager trustManagerNaive = new X509TrustManager(){
@Override
public void checkClientTrusted(
X509Certificate[] chain,
String authType)
throws CertificateException {
// TODO Auto-generated method stub
}
@Override
public X509Certificate[] getAcceptedIssuers() {
// TODO Auto-generated method stub
return null;
}
@Override
public void checkServerTrusted(
X509Certificate[] chain,
String authType)
throws CertificateException {
// TODO Auto-generated method stub
}
};
sslContext.init(null, new TrustManager[]{trustManagerNaive}, null);
SSLSocketFactory socketFactory = (SSLSocketFactory)sslContext.getSocketFactory();
SSLSocket socket = (SSLSocket)socketFactory.createSocket(host, Integer.parseInt(port_number_et.getText().toString()));
//Native Android behavior (does not accept any untrusted certificate)
SSLSocketFactory socketFactory = (SSLSocketFactory)SSLSocketFactory.getDefault();
SSLSocket socket = (SSLSocket)socketFactory.createSocket(host, Integer.parseInt(port_number_et.getText().toString()));
【问题讨论】: