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