一 、首先是 单向认证的原理,首先说下,下面的文章我没看出来是双向认证的原理(我觉得是单向认证的),你们自己理解
https://www.jianshu.com/p/733dc1f06acf
二、实战操作
1. 服务器jks 证书库生成
keytool -genkey -alias server -keyalg RSA -keystore server.key.p12 -validity 3600
2.客户端 bks 证书库生成
keytool -genkey -alias test -keypass 123456 -keyalg RSA --storetype PKCS12 -keysize 1024 -validity 36500 -keystore test_client.keystore -storepass 123456 -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider
3. 服务器证书导出
keytool -exportcert -alias server -file server.crt -keystore server.key.p12
4.客户端证书导出
keytool -export -alias test -keystore test_client.keystore -file test_client.crt -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider
5.客户端证书关联服务器证书库
keytool -import -v -file test_client.crt -keystore server.key.p12
6.服务器证书导入客户端证书库
keytool -import -alias server -file server.crt -keystore test_client.keystore -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider。
三、keytool 相关命令
1. keytool -printcert -file "test.crt" 打印证书信息
2. keytool -list -keystore test.p12 打印证书库信息
3.keytool -exportcert -alias zhy_client -file zhy_client.crt -keystore zhy_client.jks 导出证书
4. keytool -importcert -keystore zhy_client.bks -file zhy_client.crt -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider。
5. jks 转 bks
https://blog.csdn.net/ainiyiwan123/article/details/79622548
四.服务器springboot 配置
1、 把生成的证书库server.key.p12 放入 main/resource下
修改applicationproperties:
server.port=8443
server.ssl.key-store=src/main/resources/server.key.p12
server.ssl.key-store-password=123456
server.ssl.key-alias=server
server.ssl.keyStoreType=JKS
server.ssl.trust-store=src/main/resources/server.key.p12
server.ssl.trust-store-password=123456
server.ssl.client-auth=need
server.ssl.trust-store-type=JKS
server.ssl.trust-store-provider=SUN
五.Android 客户端配置
1.这里把 server.crt 、test_client.keystore 拷贝到assets和raw下(只放到raw就可以了)
2、导入洋神的 implementation 'com.zhy:okhttputils:2.6.2'
3、 android7.0配置xml文件
res新建xml文件夹,然后新建 'network_security_config.xml'并配置
192.168.0.101
修改manifest配置
加入“”android:networkSecurityConfig="@xml/network_security_config"“”
4.
HttpsUtils.SSLParams sslParams =
HttpsUtils.getSslSocketFactory(new InputStream[]{getAssets().open("server.crt")},
getAssets().open("test_client.keystore"), "123456");
OkHttpClient okHttpClient = new OkHttpClient.Builder()
// .addInterceptor(new LoggerInterceptor("TAG"))
.sslSocketFactory(sslParams.sSLSocketFactory, sslParams.trustManager)
// .sslSocketFactory(SSLHelper.getSSLCertifcation(this))
.connectTimeout(10000L, TimeUnit.MILLISECONDS)
.readTimeout(10000L, TimeUnit.MILLISECONDS)
.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
// if (hostname.equals("192.168.0.101")){
return true;
// }else {
// return false;
// }
}
})
//其他配置
.build();
OkHttpUtils.initClient(okHttpClient);
OkHttpUtils
.get()
.url(url)
// .addParams("username", "hyman")
// .addParams("password", "123")
.build()
.execute(new StringCallback()
{
@Override
public void onError(Call call, Exception e, int id) {
Log.e("okhttp", e.toString());
}
@Override
public void onResponse(String response, int id) {
tvContent.setText(response);
}
});
到此 客户端和服务器都完成了 自建证书的双向认证