Android中如何通过keystore生成https证书,并设置证书到我们请求

需要使用keytool命令

输入keytool --help 会出现下面帮助类

 -certreq            生成证书请求
 -changealias        更改条目的别名
 -delete             删除条目
 -exportcert         导出证书
 -genkeypair         生成密钥对
 -genseckey          生成密钥
 -gencert            根据证书请求生成证书
 -importcert         导入证书或证书链
 -importpass         导入口令
 -importkeystore     从其他密钥库导入一个或所有条目
 -keypasswd          更改条目的密钥口令
 -list               列出密钥库中的条目
 -printcert          打印证书内容
 -printcertreq       打印证书请求的内容
 -printcrl           打印 CRL 文件的内容
 -storepasswd        更改密钥库的存储口令

 

再通过keytool -exportcert --help 获取导出证书的帮助

 -rfc                            以 RFC 样式输出
 -alias <alias>                  要处理的条目的别名
 -file <filename>                输出文件名
 -keystore <keystore>            密钥库名称
 -storepass <arg>                密钥库口令
 -storetype <storetype>          密钥库类型
 -providername <providername>    提供方名称
 -providerclass <providerclass>  提供方类名
 -providerarg <arg>              提供方参数
 -providerpath <pathlist>        提供方类路径
 -v                              详细输出
 -protected                      通过受保护的机制的口令

 

我们可以根据帮助选择对应的命令

下面这行命令是我通过/Volumes/windows/kestores/httpscert这个keystroe生成的一个叫httpscert.cer的证书

keytool -exportcert -alias httpscert -file httpscert.cer -keystore /Volumes/windows/kestores/httpscert

tomcat 9.0怎么配置https

打开conf文件下下的server.xml文件

把下面这个打开并配置自己的kestore 和密码

 

这样重新启动tomcat 然后输入https://localhost:8443/#/就可以访问了

这个时候打开会提示有风险,这是因为我们证书没有得到认证

这样我们生成了证书,也配置了tomcat的https请求,我们怎么才能将证书添加我们项目中呢

其实很简单,主要是下面一段代码放到项目中运行就可以,这也是官方给的文档

                    SSLContext sslContext = SSLContext.getInstance("TLS");
                    KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
                    ks.load(null);//清除默认证书,使用我们自己制定的证书

                    CertificateFactory cf = CertificateFactory.getInstance("X.509");
                    InputStream caInput = getAssets().open("httpscert.cer");
                    Certificate cert = cf.generateCertificate(caInput);
                    //设置自己的证书
                    ks.setCertificateEntry("fanlelong",cert);

                    TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
                    trustManagerFactory.init(ks);
                    //创建信任管理器
                    TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
                    sslContext.init(null, trustManagers, null);

                    SSLSocketFactory sf = sslContext.getSocketFactory();
                    //设置信息管理器
                    HttpsURLConnection.setDefaultSSLSocketFactory(sf);

                    URL url = new URL("https://192.168.1.101:8443/#/");
//                    URL url = new URL("https://www.csdn.net/");
                    HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection();

                    //如果没有安装证书,跳过认证
                    urlConnection.setHostnameVerifier(new HostnameVerifier() {
                        @SuppressLint("BadHostnameVerifier")
                        @Override
                        public boolean verify(String hostname, SSLSession session) {
                            return true;
                        }
                    });
                    InputStream is = urlConnection.getInputStream();
                    if (is != null) {
                        StringBuilder sb = new StringBuilder();
                        String line;
                        try {
                            BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
                            while ((line = reader.readLine()) != null) {
                                sb.append(line).append("\n");
                            }
                        } finally {
                            is.close();
                        }

                        String response = sb.toString();
                        Log.e("ancely", response);
                    }

                } catch (Exception e) {
                    e.printStackTrace();
                }

我们再来看看Okhttp是怎么使用这个的,只需要在创建okhttpClient里面的构造者方法中添加就可以

    public Builder sslSocketFactory(
        SSLSocketFactory sslSocketFactory, X509TrustManager trustManager) {
      if (sslSocketFactory == null) throw new NullPointerException("sslSocketFactory == null");
      if (trustManager == null) throw new NullPointerException("trustManager == null");
      this.sslSocketFactory = sslSocketFactory;
      this.certificateChainCleaner = CertificateChainCleaner.get(trustManager);
      return this;
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章