sslcontext_证书校验_java请求_代码解析
背景
由于安全方面的需求,针对java发起的接口请求,需要使用https请求,同时需要进行证书校验,确保请求访问可信。但是经过调研发现,基本上很难有人说清楚该怎么校验,没有完整的模板套件,直接拿来用。综合整理下来,感觉原因无非1.与https的证书校验,如果需要达到百分百的校验,其实还是比较复杂的。 2.java后端请求有很多种请求方式,每种方式的使用的类,校验方式又不同,又进一步增加了复杂性。 3.填写了校验规则,实际校验有没有用,也很难验证,制作一个假的证书还是比较苦难的。
综上,所以想简单梳理一个模板,同时尽量验证,确保可用。仅做自用,不做交流
忽略证书校验
首先我们需要知道忽略证书大概长什么样,一般来说,我们说的证书校验,指的是被访问服务的证书校验
public static void main(String[] args) throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException {
uncheck();
}
public static void uncheck() throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException {
// 配置Apache HttpClient
HttpClient httpClient = HttpClients.custom()
.setSSLContext(new SSLContextBuilder()
// 忽略证书校验,信任所有证书
.loadTrustMaterial(null, TrustAllStrategy.INSTANCE)
.build()
)
// 忽略主机名称校验 主机名与证书的CN校验
.setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)
.build();
// 让RestTemplate使用Apache HttpClient访问网络
HttpComponentsClientHttpRequestFactory requestFactory =
new HttpComponentsClientHttpRequestFactory();
requestFactory.setHttpClient(httpClient);
RestTemplate restTemplate = new RestTemplate(requestFactory);
restTemplate.getMessageConverters().add(new FormHttpMessageConverter());
String resp = restTemplate.getForObject("这里填写URL",
String.class);
System.out.println(resp);
}
开启证书校验
步骤主要为:1.获取目标服务的公钥证书文件并生成jks文件 2.使用loadTrustMaterial信任目标证书 3.使用defaultHostnameVerifier进行主机名校验
public static void main(String[] args) throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException, CertificateException, IOException {
check();
}
public static void check() throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException, CertificateException, IOException {
// 配置Apache HttpClient
HttpClient httpClient = HttpClients.custom()
.setSSLContext(new SSLContextBuilder()
// 导入公钥证书jks路径
.loadTrustMaterial(new File("jks路径"),
"密码".toCharArray())
.build()
)
// 主机名校验,使用defaulthostnameVerifier
.setSSLHostnameVerifier(SSLConnectionSocketFactory.getDefaultHostnameVerifier())
.build();
// 让RestTemplate使用Apache HttpClient访问网络
HttpComponentsClientHttpRequestFactory requestFactory =
new HttpComponentsClientHttpRequestFactory();
requestFactory.setHttpClient(httpClient);
RestTemplate restTemplate = new RestTemplate(requestFactory);
restTemplate.getMessageConverters().add(new FormHttpMessageConverter());
String resp = restTemplate.getForObject("目标URL",
String.class);
System.out.println(resp);
}
公钥证书的生成
这一步没什么好说的,拿到目标的公钥证书就可以了。可以是对方给,也可以问对方要,主要讲一下keytool命令。
keytool可以将证书打包成java可识别的jks文件,命名如下:
将目标证书导入到库文件中:
keytool -importcert -alias ca -keystore d:\\xx.keystore -storepass 密码 -file d:\\xx.cer
后面可以根据在整理一下keytool命令, 然后将其中的keystore文件路径和密码填入代码中即可
- 点赞
- 收藏
- 关注作者
评论(0)