java通过pfx证书请求接口

本文介绍了如何在Java代码中通过doHttpRequest方法实现对带有域名和证书的HTTPS接口的请求,包括使用getSSLFactory方法加载并绑定证书,确保调用过程的安全与顺利。
摘要由CSDN通过智能技术生成

携带java认证库请求接口时加上域名和证书的绑定关系会使调用更顺利

代码说明

public String httpsRequest(Map<String, String> headers,String requestBody,String url,String method) {
        try {
            HttpURLConnection connection = doHttpRequest(url, method, requestBody, headers);
            String responseBody = getResponseBodyAsString(connection);
            connection.disconnect();
            return responseBody;
        } catch (Exception e) {
            e.printStackTrace();
            return e.getMessage();
        }
    }

headers:请求头;requestBody:请求体;url:接口地址;method:接口类型

doHttpRequest方法
private HttpURLConnection doHttpRequest(String requestUrl, String method, String body, Map<String, String> header) throws Exception {
        HttpURLConnection conn;
        if (method == null || method.length() == 0) {
            method = "GET";
        }
        URL url = new URL(requestUrl);
        conn = (HttpURLConnection) url.openConnection();
        conn.setDoOutput(true);
        conn.setDoInput(true);
        conn.setUseCaches(false);
        conn.setInstanceFollowRedirects(true);
        conn.setRequestMethod(method);
        File file = new File(sslFileName);//证书文件名:test.pfx
        if (!file.exists()) {
            ClassPathResource resource = new ClassPathResource(sslFileName);
            try {
                FileUtil.writeFromStream(resource.getInputStream(), new File(sslFileName));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        String fileUrl = file.getAbsolutePath();
        if (requestUrl.matches("^(https)://.*$")) {
            ((HttpsURLConnection) conn).setSSLSocketFactory(this.getSSLFactory(fileUrl, cerPassWord));//证书密码
        }

        if (header != null) {
            for (String key : header.keySet()) {
                conn.setRequestProperty(key, header.get(key));
            }
        }
        if (!body.isEmpty()) {
            if (!"GET".equals(method)) {
                OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
                wr.write(body);
                wr.flush();
                wr.close();
            }
        }
        conn.connect();
        return conn;
    }
getSSLFactory方法
private synchronized SSLSocketFactory getSSLFactory(String certPath, String certPassword) throws Exception {

        KeyStore clientKeyStore = KeyStore.getInstance("PKCS12");
        try (FileInputStream fis = new FileInputStream(certPath)) {
            clientKeyStore.load(fis, certPassword.toCharArray()); // 使用您设置的密钥库密码
        }
        String alias = clientKeyStore.aliases().nextElement();
        KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
        kmf.init(clientKeyStore, certPassword.toCharArray());
        SSLContext sslContext = SSLContext.getInstance("TLSv1.3");

        X509TrustManager[] trustManagers = new X509TrustManager[1];
        trustManagers[0] = new UnsafeTrustManager();
        // 创建域名到证书别名的映射
        Map<String, String> domainToAliasMap = new HashMap<>();
        domainToAliasMap.put(testApiUrl, alias);//绑定域名

        // 获取默认的KeyManager数组
        KeyManager[] defaultKeyManagers = kmf.getKeyManagers();

        // 创建自定义的KeyManager
        X509KeyManager customKeyManager = new DomainX509KeyManager((X509KeyManager)defaultKeyManagers[0], clientKeyStore, domainToAliasMap);

        // 创建自定义的KeyManager数组
        KeyManager[] keyManagers = new KeyManager[defaultKeyManagers.length];
        keyManagers[0] = customKeyManager;
        for (int i = 1; i < defaultKeyManagers.length; i++) {
            keyManagers[i] = defaultKeyManagers[i];
        }
        sslContext.init(keyManagers, trustManagers, new java.security.SecureRandom());
            sslFactory = sslContext.getSocketFactory();
//        }
        return sslFactory;
    }

把刚导入的证书和域名绑定,注意是域名不是接口地址

如接口:https://test.com.cn/test-service/api/test,域名:test.com.cn

该方法和postman证书请求接口调用方式类似

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值