需要使用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;
}