【问题标题】:(Java) No Required SSL certificate was sent (Works fine when used in curl call)(Java) 未发送所需的 SSL 证书(在 curl 调用中使用时工作正常)
【发布时间】:2019-07-22 10:32:01
【问题描述】:

因此,我正在尝试通过在 Java 程序中使用客户端证书来测试与我公司 Web 服务器的连接(使用 2 路 SSL)。 我尝试在 curl 调用中使用相同的证书(分离的证书和密钥)并设法获得所需的响应。 但是当我尝试在我的 Java 程序中使用它(组合成 pkcs12 格式)时,它会给出 400 响应,说没有发送所需的 SSL 证书。为什么会这样?

public static void main(String[] args) {
    System.out.println("Taufiq's mutual SSL-authentication test");
    org.apache.log4j.BasicConfigurator.configure();
    Logger.getRootLogger().setLevel(Level.INFO);

    try {
        final String CERT_ALIAS = "something", CERT_PASSWORD = "something";

        KeyStore identityKeyStore = KeyStore.getInstance("pkcs12");
        FileInputStream identityKeyStoreFile = new FileInputStream(new File("src/Cert.p12"));
        identityKeyStore.load(identityKeyStoreFile, CERT_PASSWORD.toCharArray());

        KeyStore trustKeyStore = KeyStore.getInstance("jks");
        FileInputStream trustKeyStoreFile = new FileInputStream(new File("src/truststore.jks"));
        trustKeyStore.load(trustKeyStoreFile, CERT_PASSWORD.toCharArray());

        SSLContext sslContext = SSLContexts.custom()
            // load identity keystore
            .loadKeyMaterial(identityKeyStore, CERT_PASSWORD.toCharArray(), new PrivateKeyStrategy() {
                @Override
                public String chooseAlias(Map<String, PrivateKeyDetails> aliases, Socket socket) {
                    return CERT_ALIAS;
                }
            })
            // load trust keystore
            .loadTrustMaterial(trustKeyStore, null)
            .build();

        SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext,
            new String[]{"TLSv1.2", "TLSv1.1"},
            null,
            SSLConnectionSocketFactory.getDefaultHostnameVerifier());

        CloseableHttpClient client = HttpClients.custom()
            .setSSLSocketFactory(sslConnectionSocketFactory)
            .build();

        // Call a SSL-endpoint
        callEndPoint (client);
    } catch (Exception ex) {
        System.out.println("Boom, we failed: " + ex);
        ex.printStackTrace();
    }
}

private static void callEndPoint(CloseableHttpClient aHTTPClient) {

    try {          
        String ServerUrl = "My Company URL";
        System.out.println("Calling URL: " + ServerUrl);
        HttpPost post = new HttpPost(ServerUrl);
        post.setHeader("Content-type", "application/json");

        System.out.println("**POST** request Url: " + post.getURI());

        HttpResponse response = aHTTPClient.execute(post);

        int responseCode = response.getStatusLine().getStatusCode();
        System.out.println("Response Code: " + responseCode);
        System.out.println("Content:-\n");
        BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
        String line;
        while ((line = rd.readLine()) != null) {
            System.out.println(line);
        }
    } catch (Exception ex) {
        System.out.println("Boom, we failed: " + ex);
        ex.printStackTrace();
    }

}

Curl 调用示例: curl -v --key key.pem --pass ****** --cert cert.pem MyCompanyURL

【问题讨论】:

  • 看看你在curl中使用的确切命令会很有用?
  • 我会说,在客户端,您需要服务器证书,而不是客户端证书。
  • @DmytroChasovskyi 我已经编辑了我的问题以包含 curl 调用
  • @VictorCalatramas 据我了解,服务器证书进入信任库,客户端证书将在进行 2 路 ssl 调用时发送。如果我错了,请纠正我
  • 一切都取决于服务器的实现,可以确定的是客户端和服务器需要彼此的证书(.pem)

标签: java ssl ssl-certificate client-certificates


【解决方案1】:

我想你知道 ssl 握手是如何工作的。如果没有,请熟悉一下。然后使用wireshark查看ssl握手。您将获得比一些该死的 http 库解释更好的 ssl 警报详细信息。如果有的话,这是一个误导性错误。

可以肯定的是,您的服务器必须信任您的客户端证书,因此我假设您首先已正确设置;你说你试过 curl 但你没有说它是否有效。

最后,我不认识这些 SSL 类,所以你导入的不是 jdk 的 jsse 类;您可能是此类库的受害者。

【讨论】:

  • 好的。那么您可以添加导入,告诉我们您正在使用的 ssl lib 吗?您是否仅尝试过核心 jdk jsse 类?确保你有 SSLSocket.setUseClientMode(true) (你不能通过使用库来判断)。再一次,wireshark 会告诉它失败的原因,在没有第三方的情况下更容易找到哪里。
【解决方案2】:

当我使用核心 jdk jsse 类时,程序运行良好。我使用上面的程序是因为我从网上复制了一个例子。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 2014-10-01
    • 2015-08-07
    • 1970-01-01
    • 2013-02-18
    相关资源
    最近更新 更多