sslcontext_证书校验_java请求_代码解析

举报
object 发表于 2025/04/11 09:31:10 2025/04/11
【摘要】 背景由于安全方面的需求,针对java发起的接口请求,需要使用https请求,同时需要进行证书校验,确保请求访问可信。但是经过调研发现,基本上很难有人说清楚该怎么校验,没有完整的模板套件,直接拿来用。综合整理下来,感觉原因无非1.与https的证书校验,如果需要达到百分百的校验,其实还是比较复杂的。 2.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文件路径和密码填入代码中即可


【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。