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;
    }

 

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