java 指定信任库
前提:Windows系统信任根证书颁发机构 导出证书 生成信任库 导入到Java应用 中
应用没有根证书颁发机构的证书,无法信任内部颁发的所有证书,
直接访问带域名接口,报错
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Java 使用 Windows 系统证书信任库
-Djavax.net.ssl.trustStoreType=Windows-ROOT
接口即可正常访问(放在java命令最前面)
可以在windows导出cer证书文件(
win11:
1. win + r 输入mmc,左上角,文件-> 添加/删除管理单元,在可用的管理单元中,选择证书【需要往下找一下,在底部】,点击添加,点击确定即可看到证书菜单。
2. 在证书菜单中,点击证书 - 当前用户,点击受信任的根证书颁发机构,点击证书,选择要导出的证书,右键,选择所有任务->导出。
3. 在证书导出向导中,单击下一步,选择要使用的格式为Base64编码 X.509(.CER)(S),单击下一步,输入待生成的目标证书文件的名称为test_windows_cer,单击下一步,点击完成。
)
将证书添加到信任库(shift + 右键,选择在此处打开Powershell窗口(S))
keytool -importcert -file test_windows_cer.cer -keystore windows_copy.jks -alias ca-cert
- 输入秘钥库口令(随便输入,例如123456)
- 再次输入新口令(与上面保持一致)
- 是否信任此证书(输入y回车)
生成windows_copy.jks信任库文件。
Linux时,java应用指定信任库及秘钥即可
-Djavax.net.ssl.trustStore=windows_copy.jks -Djavax.net.ssl.trustStorePassword=123456
例如:
java -Djavax.net.ssl.trustStore=windows_copy.jks -Djavax.net.ssl.trustStorePassword=123456 test.TestUtils
keytool -list -v -keystore "D:\test\***.pfx" -storepass "***" -storetype PKCS12
在输出结果中,找到秘钥库包含的条目的别名的属性值,作为srcalias填入如下命令中
自定义导出的信任库的路径,以及自定义此信任库的密码,自定义新的别名
keytool -importkeystore -srckeystore "D:\test\***.pfx" -srcstorepass "***" -srcstoretype PKCS12 -srcalias "*****************************************************" -destkeystore "D:\custom-truststore.jks" -deststorepass "123456" -destalias "***-***-***"
curl --cacert ***.cer https://域名/***/***
| 参数 | 含义 | 说明 |
|---|---|---|
-importkeystore |
导入密钥库命令 | 用于将一个密钥库中的条目导入到另一个密钥库 |
-srckeystore |
源密钥库路径 | 指定要从中导出条目的源密钥库文件路径 |
-srcstorepass |
源密钥库密码 | 指定源密钥库的访问密码 |
-srcstoretype |
源密钥库类型 | 指定源密钥库的格式类型(如PKCS12、JKS等) |
-srcalias |
源条目别名 | 指定源密钥库中要导出的条目的别名 |
-destkeystore |
目标密钥库路径 | 指定要导入条目的目标密钥库文件路径 |
-deststorepass |
目标密钥库密码 | 指定目标密钥库的访问密码 |
-destalias |
目标条目别名 | 指定在目标密钥库中条目的新别名 |
测试类
package test;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
public class TestUtils {
public TestUtils() {
}
public static void main(String[] args) {
String url = "https://域名/xx/xxx";
try {
String res = get(url);
System.out.println(" res : " + res);
} catch (Exception e) {
System.out.println(e);
}
}
/**
* 向指定URL发送GET方法的请求
*
* @param url 请求URL
* @return 返回结果
*/
public static String get(String url) {
BufferedReader in = null;
try {
URL realUrl = new URL(url);
URLConnection connection = realUrl.openConnection();
// 设置通用的请求属性
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
connection.setRequestProperty("Content-type", "application/x-www-form-urlencoded;");
// 建立实际的连接
connection.connect();
// 读取URL的响应
in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
StringBuilder result = new StringBuilder();
String line;
while ((line = in.readLine()) != null) {
result.append(line);
}
return result.toString();
} catch (Exception e) {
System.out.println(e);
} finally {
closeQuietly(in);
}
return "";
}
/**
* 关闭BufferedReader,忽略关闭时的异常
*
* @param reader BufferedReader对象
*/
private static void closeQuietly(BufferedReader reader) {
if (reader != null) {
try {
reader.close();
} catch (Exception ignored) {
}
}
}
}

浙公网安备 33010602011771号