最近项目在使用的netty框架加上了SSL安全设置,SSL可单项验证也可双向验证,我使用的是双向验证,即Client验证Server同时Server也验证Client。
以下只说明Client(Android)端的实现方式。
- 首先需要两个文件,
client.p12
和cacert.pem
,由服务器端提供。 使用java的
keytool
工具将cacert.pem
导入到keystore中keytool -import -trustcacerts -keystore /Users/xxx/server.bks -file /Users/xxx/cacert.pem -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider
【记住这个命令执行后要求输入的密码】
(其中的org.bouncycastle.jce.provider.BouncyCastleProvider如何添加使用自行百度即可。)现在已经有了两个文件
client.p12
和server.bks
- 准备完成,下面进行java实现。
public SSLContext createSSLContext(Context context) {
SSLContext sslContext = null;
try {
// 该密码为生成client.p12时设置的密码
String keyPassword = "";
// 该密码为生成server.bks时设置的密码
String trustPassword = "";
// key store manager
KeyStore keyStore = KeyStore.getInstance("PKCS12");
InputStream keyInput = context.getResources().openRawResource(R.raw.client);
keyStore.load(keyInput, keyPassword.toCharArray());
KeyManagerFactory keyManagerFac