android https 双向认证

一 、首先是  单向认证的原理,首先说下,下面的文章我没看出来是双向认证的原理(我觉得是单向认证的),你们自己理解

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'并配置

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config>
       
        <domain includeSubdomains="true">192.168.0.101</domain>
        <debug-overrides>
            <trust-anchors>
                <certificates
                    src="@raw/server"/>
                <certificates
                    src="@raw/test_client"/>
            </trust-anchors>
        </debug-overrides>
    </domain-config>
</network-security-config>

修改manifest配置

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:name=".App"
    android:theme="@style/AppTheme"
    android:networkSecurityConfig="@xml/network_security_config">

加入“”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);
                    }
                });

到此 客户端和服务器都完成了 自建证书的双向认证

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值