httpClient发送携带pem证书和key文件

1、jar包

<dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.0</version>
        </dependency>

2、证书
我的pem是通过jks生成的
jks生成key文件


keytool -importkeystore -srckeystore mfi-key.jks -destkeystore server.p12 -srcstoretype jks -deststoretype pkcs12
openssl pkcs12 -in server.p12 -nocerts -nodes -out server.key

3、逻辑代码

public class apple {
    public static void main(String[] args) throws Exception {

		// post body 参数
        String param = "";
       //证书路径
        String pemPath = "";
        //key文件路径
        String keyPath = "";
        SSLSocketFactory sslsf =getSocketFactoryPEM(pemPath, keyPath);
        String body = HttpRequest.post("")
                .setSSLSocketFactory(sslsf)
                .body(param)
                .execute().body();
        System.out.println(body);

    }



    protected static SSLSocketFactory getSocketFactoryPEM(String pemPath, String keypath) throws Exception {
        byte[] pem = fileToBytes(pemPath);
        byte[] pemKey = fileToBytes(keypath);

        byte[] certBytes = parseDERFromPEM(pem, "-----BEGIN CERTIFICATE-----", "-----END CERTIFICATE-----");
        byte[] keyBytes = parseDERFromPEM(pemKey, "-----BEGIN PRIVATE KEY-----", "-----END PRIVATE KEY-----");

        X509Certificate cert = generateCertificateFromDER(certBytes);
        RSAPrivateKey key  = generatePrivateKeyFromDER(keyBytes);

        KeyStore keystore = KeyStore.getInstance("JKS");
        keystore.load(null);
        keystore.setCertificateEntry(cert.getSubjectX500Principal().getName(), cert);
         //生成证书的密码,修改为自己的
        keystore.setKeyEntry("key-alias", key, "123456".toCharArray(), new Certificate[] {cert});

        KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
        kmf.init(keystore, "123456".toCharArray());

        KeyManager[] km = kmf.getKeyManagers();
       //根据你的jdk版本决定是TLS、TLSv1.1、TLSv1.2
        SSLContext context = SSLContext.getInstance("TLSv1.2");
        context.init(km, null, null);
        SSLSocketFactory sslsf = context.getSocketFactory();
        return sslsf;
    }

    public static byte[] parseDERFromPEM(byte[] pem, String beginDelimiter, String endDelimiter) {
        String data = new String(pem);
        String[] tokens = data.split(beginDelimiter);
        tokens = tokens[1].split(endDelimiter);
        return DatatypeConverter.parseBase64Binary(tokens[0]);
    }

    public static RSAPrivateKey generatePrivateKeyFromDER(byte[] keyBytes) throws InvalidKeySpecException, NoSuchAlgorithmException {
        PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);
        KeyFactory factory = KeyFactory.getInstance("RSA");
        return (RSAPrivateKey)factory.generatePrivate(spec);
    }

    public static X509Certificate generateCertificateFromDER(byte[] certBytes) throws CertificateException {
        CertificateFactory factory = CertificateFactory.getInstance("X.509");
        return (X509Certificate)factory.generateCertificate(new ByteArrayInputStream(certBytes));
    }
    
    public static byte[] fileToBytes(String filePath) {
        //传文件名字,自动获取根目录下
        Resource resource = new ClassPathResource(filePath);
        InputStream is = resource.getStream();
        byte[] buffer = null;
        //File file = new File(filePath);

        //FileInputStream fis = null;
        ByteArrayOutputStream bos = null;

        try {
            //fis = new FileInputStream(is);
            bos = new ByteArrayOutputStream();
            byte[] b = new byte[1024];
            int n;
            while ((n = is.read(b)) != -1) {
                bos.write(b, 0, n);
            }
            buffer = bos.toByteArray();
        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            try {
                if (null != bos) {
                    bos.close();
                }
            } catch (IOException ex) {
            } finally{
                try {
                    if(null!=is){
                        is.close();
                    }
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        }
        return buffer;
    }
}

如果出现401权限问题,有可能是你证书读取错误,或者body参数传的不对,或者更换httpClient版本

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用Apache HttpClient发送GET请求并携带参数和请求头。下面是一个示例代码: ```java import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.NameValuePair; import org.apache.http.client.utils.URIBuilder; import org.apache.http.message.BasicNameValuePair; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { HttpClient httpClient = HttpClientBuilder.create().build(); try { // 构建请求参数 List<NameValuePair> params = new ArrayList<>(); params.add(new BasicNameValuePair("param1", "value1")); params.add(new BasicNameValuePair("param2", "value2")); // 构建请求URI URI uri = new URIBuilder() .setScheme("http") .setHost("example.com") .setPath("/api/endpoint") .setParameters(params) .build(); // 创建GET请求 HttpGet request = new HttpGet(uri); // 添加请求头 request.addHeader("User-Agent", "Mozilla/5.0"); // 发送请求并获取响应 httpClient.execute(request); } catch (IOException | URISyntaxException e) { e.printStackTrace(); } } } ``` 在上面的示例中,我们通过`URIBuilder`构建了带参数的请求URI,并使用`HttpGet`创建了GET请求。然后,我们使用`request.addHeader()`方法添加了请求头,并使用`httpClient.execute()`方法发送请求并获取响应。请注意,示例中的参数和URI仅供参考,请根据实际情况进行修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值