gpt4 book ai didi

java - 强制发送客户端证书

转载 作者:太空宇宙 更新时间:2023-11-03 13:00:14 26 4
gpt4 key购买 nike

我正在使用 Java SE Jersey客户端连接到使用双向 SSL 的 HTTPS 资源。

我的 SSLContext 看起来像这样:

private SSLContext getSSLContext() {
SslConfigurator sslConfig = SslConfigurator.newInstance()
.keyStoreFile("src/main/certificates/testcert.p12")
.keyPassword("mypassword");

return sslConfig.createSSLContext();
}

问题是永远不会发送客户端证书。

我收到错误“警告:未找到合适的证书 - 在没有客户端身份验证的情况下继续”并且我已经追踪到客户端证书未颁发给服务器 中列出的证书颁发机构之一这一事实的原因发送给客户端的 CertificateRequest 消息。我从 cURL 的测试中知道,服务器无论如何都会接受证书。端点是一个公共(public)测试系统。

我的问题:如何强制发送我的客户端证书?(即我的 Java SE 客户端应该忽略 testcert.p12 证书的颁发者不是服务器已表示将接受的发行者列表)

请不要向我指出有关禁用服务器证书检查或使用自签名证书的答案。服务器的证书就好了。

更新

原来我的问题是另一个问题。我通过设置系统属性 javax.net.debug=all 进行调试。在检查了结果输出之后,在我看来,即使在执行了上述操作之后, keystore 仍然是空的。所以难怪为什么“找不到合适的证书”。

Jersey 有这个“聪明” SslConfigurator可以帮助您设置 SSLContext 的类。也许对我来说太聪明了,因为我无法让它与上面的代码一起工作。因此,我现在像下面这样配置我的 SSLContext:

    KeyStore ks = KeyStore.getInstance("PKCS12");
FileInputStream fis = new FileInputStream("src/main/certificates/testcert.p12");
ks.load(fis, "mypassword".toCharArray());
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, "mypassword".toCharArray());
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(kmf.getKeyManagers(), null, null);
// now use 'sc' in Jersey

这对我有用,而 Jersey 的助手类没有。我完全赞同 Jersey 的 SSLContext 辅助类的想法,因为对于这样一个简单的用例,JSSE 在这里似乎过于复杂。好吧好吧。

最佳答案

你不能。这将违反 TLS 协议(protocol),因此没有支持它的 API。各种 TLS API 只会在以下情况下发送客户端证书:

  1. 这是被要求的,并且
  2. 可以找到符合 CertificateRequest 消息中指定内容的客户端证书。

您必须安排您的服务器信任您的客户端证书,方法是通过 CA 签名或将其导出到服务器的受信任证书存储区,无论服务器采用何种形式。

关于java - 强制发送客户端证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51090935/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com