使用keytool、portecle完成ssl双向认证证书生成,并在android、springboot配置与开发

Springboot版本:2.1.9RELEASE
portecle下载地址:链接: https://pan.baidu.com/s/1UL6SX1utsZg-Vc6QYtyK9A 密码: 0tmg

脚本如下,密码123456需自行修改,dname需自行修改,alias也可根据需要自行修改:

#1、生成服务器证书库
keytool -validity 3650 -genkeypair -v -alias server -keyalg RSA  -keystore server.keystore -dname "CN=127.0.0.1,OU=V,O=V,L=FZ,ST=FJ,c=CN" -storepass 123456 -keypass 123456
#2、生成客户端证书库
keytool -validity 3650 -genkeypair -v -alias client -keyalg RSA  -keystore client.keystore -dname "CN=client,OU=V,O=V,L=FZ,ST=FJ,c=CN" -storepass 123456 -keypass 123456
#3、从客户端证书库中导出客户端证书
keytool -export -v -alias client -keystore client.keystore  -storepass 123456 -rfc -file client.cer
#4、从服务器证书库中导出服务器证书
keytool -export -v -alias server -keystore server.keystore -storepass 123456  -rfc -file server.cer
#5、生成客户端信任证书库(由服务端证书生成的证书库)
keytool -import -v -alias server -file server.cer -keystore client.truststore -storepass 123456
#6、将客户端证书导入到服务器证书库(使得服务器信任客户端证书)
keytool -import -v -alias client -file client.cer -keystore server.keystore -storepass 123456
#7、生成服务端信任证书库(由客户端证书生成的证书库)
keytool -import -v -alias client -file client.cer -keystore server.truststore -storepass 123456
#8、将服务端证书导入到客户端证书库(使得客户端信任服务端证书)
keytool -import -v -alias server -file server.cer -keystore client.keystore -storepass 123456
#9、查看服务端证书库中的全部证书
keytool -list -keystore server.keystore -storepass 123456
#10、查看客户端证书库中的全部证书
keytool -list -keystore server.keystore -storepass 123456

# 以下Springboot使用
keytool -importkeystore -srckeystore server.keystore -destkeystore server.p12 -srcalias server -destalias server -srcstoretype jks -deststoretype pkcs12 -noprompt

keytool -importkeystore -srckeystore server.truststore -destkeystore server_truststore.p12 -srcalias client -destalias server_truststore -srcstoretype jks -deststoretype pkcs12 -noprompt

Springboot里application.yml配置如下(节选)

server:
  port: 8443
  http:
    port: 8082
  ssl:
    key-store: classpath:server.p12
    key-alias: server
    key-store-type: PKCS12
    key-store-password: 123456

    trust-store: classpath:server_truststore.p12
    trust-store-password: 123456
    client-auth: need
    trust-store-type: PKCS12
  ...

需要在WebConfig里增加一些代码支持http访问

    // 同时支持http、https ---start---
    @Value("${server.http.port}")
    private int httpPort;

    @Bean
    public ServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
        tomcat.addAdditionalTomcatConnectors(createStandardConnector()); // 添加http
        return tomcat;
    }

    private Connector createStandardConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setPort(httpPort);
        return connector;
    }
    // 同时支持http、https ---end---
# 以下nginx用
openssl pkcs12 -clcerts -nokeys -out client_cert.pem -in client.p12
openssl pkcs12 -nocerts -out key.pem -in client.p12
# 处理导出的私钥,将pkcs#8格式的密钥文件转换为pkcs#1格式,这样apache/nginx才能识别。如果使用pkcs#8格式的密钥,apache启动的时候会报(missing or encrypted private key?)。另外如果是nginx,使用pkcs#8格式的密钥重启的时候要输入密码,报错cannot load certificate key "/etc/nginx/cert/client_key.pem": PEM_read_bio_PrivateKey() failed (SSL: error:0906406D:PEM routines:PEM_def_callback:problems getting password error:0907B068:PEM routines:PEM_READ_BIO_PRIVATEKEY:bad password read)而导出成pkcs#1格式则不需要。
openssl rsa -in key.pem -out client_key.pem
cat client_cert.pem key_new.pem >client.pem

# 以下供android及本机浏览器使用,android通过portecle生成bks文件
keytool -importkeystore -srckeystore client.keystore -destkeystore client.p12 -srcalias client -destalias client -srcstoretype jks -deststoretype pkcs12 -noprompt

生成的client.p12,可双击打开导入系统,以便能在浏览器测试访问https。
运行protecle.jar--》打开文件选中client.p12,选择tools-->change keystore type-->选择BKS,最后关闭保存为client.bks
运行protecle.jar--》打开文件选中client.truststore,选择tools-->change keystore type-->选择BKS,最后关闭保存为ca.bks
安卓需要在build.gradle里增加:

//retrofit
    implementation "com.squareup.retrofit2:retrofit:2.3.0"
    implementation "com.squareup.retrofit2:converter-scalars:2.3.0"
    implementation "com.squareup.retrofit2:converter-gson:2.3.0"
    implementation "com.squareup.okhttp3:logging-interceptor:3.8.1"

然后在Android Studio的Android视图下,将client.bks和ca.bks导入assets里。
代码如下,使用Retrofit2,

    public interface GetAppList {
        @GET("getAppList")
        Call<AppListBean> get();
    }
            //创建日志拦截器,用于日志打印
            HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
            interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
            //创建okhttp
            OkHttpClient httpClient = new OkHttpClient().newBuilder()
                    .addInterceptor(interceptor)
                    .sslSocketFactory(SSLHelper.getSSLCertifcation(this), new HttpsUtil.UnSafeTrustManager())
                    .hostnameVerifier(new HttpsUtil.UnSafeHostnameVerifier())//由于还没有域名,此处设置忽略掉域名校验
                    .build();
            //创建retrofit
            String baseUrl = "https://10.0.2.2:8443/";
            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl(baseUrl)
                    .client(httpClient)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();

            // 创建 网络请求接口 的实例
            GetAppList request = retrofit.create(GetAppList.class);
            //创建请求,传入参数
            Call<AppListBean> call = request.get();
            //异步请求
            call.enqueue(new Callback<AppListBean>() {
                @Override
                public void onResponse(Call<AppListBean> call, Response<AppListBean> response) {
                    System.out.println("response.toString():" + response.toString());
                }
                @Override
                public void onFailure(Call<AppListBean> call, Throwable t) {
                    t.printStackTrace();
                }
            });

参考了这些文章,感谢!
https://www.jianshu.com/p/661c0459b375
https://blog.csdn.net/anshi4203351518/article/details/101966682
https://www.cnblogs.com/nhdlb/archive/2004/01/13/12258225.html
https://blog.csdn.net/huweijian5/article/details/79365439
https://blog.csdn.net/mingjie1212/article/details/51908174
https://blog.csdn.net/lhc_makefunny/article/details/89528517
https://blog.csdn.net/qq_39403545/article/details/88832473
https://blog.csdn.net/weixin_41917987/article/details/80988197

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,084评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,623评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,450评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,322评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,370评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,274评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,126评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,980评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,414评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,599评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,773评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,470评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,080评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,713评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,852评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,865评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,689评论 2 354

推荐阅读更多精彩内容