首页 > 解决方案 > SSLConnectionSocketFactory 始终返回 400(2 路 ssl 客户端证书)未收到证书

问题描述

我有一个 ssl 连接(2 次握手),我无法理解为什么以下代码过程 400(openJdk 11,服务器提供的 p12 文件和密码,服务器提供的 cer 文件),

我通过以下命令从 cer 文件创建了 jks 文件:

keytool -importcert -file example-api.cer -keystore example-api.jks

编码

    File keyFile = new File(Objects.requireNonNull(exampleController.class.getClassLoader().
            getResource("example-client-api1.p12")).getFile());
    File trustFile = new File(Objects.requireNonNull(exampleController.class.getClassLoader().
            getResource("example-api.jks")).getFile());
    KeyStore keyStore  = KeyStore.getInstance("PKCS12");
    try(FileInputStream inStream = new FileInputStream(keyFile)) {
        keyStore.load(inStream, "password".toCharArray());
    }
    SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(trustFile, "password".toCharArray() ,new TrustAllStrategy()).
                            loadKeyMaterial(keyStore , "password".toCharArray()).build();
    HostnameVerifier hostnameVerifier = new NoopHostnameVerifier();
    SSLConnectionSocketFactory socketFactory =
            new SSLConnectionSocketFactory(sslContext, hostnameVerifier);
    CloseableHttpClient httpclient = HttpClients.custom()
            .setSSLHostnameVerifier(hostnameVerifier)
            .setSSLSocketFactory(socketFactory)
            .useSystemProperties()
            .build();
    HttpGet httpget = new HttpGet("https://example-api/link?token=@Secret_Token@");

    System.out.println("executing request" + httpget.getRequestLine());

    return  httpclient.execute(httpget);

上面的代码总是返回 400(没有发送所需的 SSL 证书)。

但以下 curl 有效(在 IOS 上):

curl https://example-api/link?token=@secret_token@ --cacert ./example-api-ca.crt --cert ./example-client-api1.p12:password

任何帮助将不胜感激

标签: javasslcertificatejkssslcontext

解决方案


好的,所以在一些令人沮丧的日子之后:我不知道原因,但是问题出在 URL 的主机名中的连字符('-'),删除连字符修复了问题,不知道为什么,但还是发布了,也许有人可以解释这种现象。示例(使用上面的代码):

example-api -> not working
example.api -> Works OK

推荐阅读