单向认证:这篇文章
-
SSLContext初始化时参数的含义
SSLContext初始化时需要的2个参数的含义:
public SSLSocketFactory provideSSLSocketFactory() {
try {
SSLContext sslContext = SSLContext.getInstance("TLS");
//第一个参数:表示服务端对客户端的验证,如果不验证,可直接传递null
//第二个参数:表示客户端对服务端的验证,如果不验证,可以直接传null
sslContext.init(provideKeyManagerArray(), provideTrustManagerArray(), new SecureRandom());
return sslContext.getSocketFactory();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
}
return null;
}
-
服务端对客户端证书的校验,总结为3步
1.生成客户端证书的流对象
InputStream mClientInputStream = context
.getResources().openRawResource(R.raw.root);
2.客户端证书的密钥库对象
KeyStore mClientKeyStore = KeyStore.getInstance("BKS");
mClientKeyStore.load(mClientInputStream, "123456".toCharArray());
if (mClientInputStream != null) {
mClientInputStream.close();
}
3.初始化密钥库管理工厂类,得到KeyManager数组
//初始化密钥库管理工厂类,这里没有将客户端的证书密钥库添加到信任管理中,原因是没有必要
//因为这个证书信不信任是服务器说的算的
//不同于客户端对服务器端的校验,客户端需要将服务端的证书放到自己的信任管理器中这样才能信任服务端
KeyManagerFactory mKeyManagerFactory = KeyManagerFactory
.getInstance(KeyManagerFactory.getDefaultAlgorithm());
mKeyManagerFactory.init(mClientKeyStore, "123456".toCharArray());
-
服务端nginx的配置
ssl on;
ssl_certificate ***.cer; # *表示服务端证书名称
ssl_certificate_key ***.key;# *表示服务端证书对应的密钥
ssl_client_certificate ***.cer;# *表示服务端需要拿着这个证书对客户端进行认证
ssl_verify_client on;# *开启对客户端的认证
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
-
到此,android端的https单双向认证分析完毕
网友评论