1.
以阿里云的https的获取方式
得到xxx.pem文件和 xxx.key文件
2.
因为android 在ssl这块不支持 JKS 所以我们要生成BKS文件
由pem和key文件 生成BKS文件的步骤
2.1 由pem和key文件先生成JKS文件
参考:https://blog.csdn.net/hfismyangel/article/details/83792992
2.1.1.生成pfx文件
openssl pkcs12 -export -out device2.pfx -in device2.pem -inkey device2.key
关于(openssl 文件一般在linux服务器上有该命令,如果在windows上的话需要自己下载)
2.1.2.得到pfx之后,生成JKS ,第一条生成之后,说我的规范已过时,所以第二条升级最新版的规范
keytool -importkeystore -srckeystore device2.pfx -destkeystore device2.jks -srcstoretype PKCS12 -deststoretype JKS
keytool -importkeystore -srckeystore device2.jks -destkeystore device2.jks -deststoretype pkcs12
2.1.3.
得到jks 使用软件
https://nchc.dl.sourceforge.net/project/portecle/v1.11/portecle-1.11.zip
然后导入jks文件 然后生成BKS文件
3.
使用
portecle-1.11.zip 需要配置一下
jdk:
C:\Program Files\Java\jdk1.8.0_181\jre\lib\security
修改文件内容如下:
security.provider.11=org.bouncycastle.jce.provider.BouncyCastleProvider
C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext
如果要使用本地bks生成
则:添加
jar包下载位置:
链接:https://pan.baidu.com/s/1LEe9EWVgUgpJKRaqaJYNQw
提取码:7m70
复制这段内容后打开百度网盘手机App,操作更方便哦
最后关于代码的实现:
//因为我有两个签名证书,而且需要区分IP,如果IP段 <8 则使用device1.bks 否则使用IP段 >=8 则使用device2.bks
public static SSLContext sslCreate() {
SSLContext sslContext = null;
try {
// load up the key store
String STORETYPE = "BKS";
String STOREPASSWORD = "123123";
String KEYPASSWORD = "123123";
KeyStore ks = KeyStore.getInstance(STORETYPE);
Log.i("TAG", "Paramter.localIp:" + Paramter.localIp);
int netSegement = Integer.parseInt(Paramter.localIp.split("\\.")[2]);
InputStream ksInputStream = null;
Log.i("TAG", "netSegement :" + netSegement);
if (netSegement < 8) {
ksInputStream = MainService.context.getResources().openRawResource(R.raw.device1); /// 证书存放地址
} else if (netSegement >= 8) {
ksInputStream = MainService.context.getResources().openRawResource(R.raw.device2); /// 证书存放地址
}
ks.load(ksInputStream, STOREPASSWORD.toCharArray());
KeyManagerFactory kmf = KeyManagerFactory.getInstance("X509");
// KeyManagerFactory kmf = KeyManagerFactory.getInstance("X509");
kmf.init(ks, KEYPASSWORD.toCharArray());
TrustManagerFactory tmf = TrustManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
// TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");
tmf.init(ks);
sslContext = SSLContext.getInstance("TLS");
sslContext.init(kmf.getKeyManagers(), null, null);
} catch (
UnrecoverableKeyException e) {
Log.e("TAG", "UnrecoverableKeyException :" + e.getMessage());
} catch (
NoSuchAlgorithmException e) {
Log.i("TAG", "NoSuchAlgorithmException :" + e.getMessage());
} catch (
KeyStoreException e) {
Log.e("TAG", "KeyStoreException :" + e.getMessage(), e);
} catch (
IOException e) {
Log.i("TAG", "IOException :" + e.getMessage());
} catch (
CertificateException e) {
Log.i("TAG", "CertificateException :" + e.getMessage());
} catch (
KeyManagementException e) {
Log.i("TAG", "KeyManagementException :" + e.getMessage());
}
return sslContext;
}
最后设置到websocket上
svs.setWebSocketFactory(new DefaultSSLWebSocketServerFactory(sslContext));