使用HttpClient进行客户端身份验证

伊戈尔·阿尔塔莫诺夫(Igor Artamonov)

尝试实施客户端密钥身份验证(带有自签名的ca)。

代码如下:

KeyStore keyStore = KeyStore.getInstance("PKCS12");
keyStore.load(new FileInputStream("client.p12"), "changeit".toCharArray())

SSLContext sslcontext = SSLContexts.custom()
            .loadTrustMaterial(null, new TrustSelfSignedStrategy()) //DONT DO THAT, IT'S JUST TO SIMPLIFY THIS EXAMPLE. USE REAL TrustStore WITH REAL SERVER CERTIFICATE IMPORTED. DONT TRUST SELF SIGNED
            .loadKeyMaterial(keyStore, "changeit".toCharArray())
            .build();
socketFactory = new SSLConnectionSocketFactory(
            sslcontext,
            new String[] {"TLSv1.2", "TLSv1.1"},
            null,
            new NoopHostnameVerifier()
);
HttpClient httpclient = HttpClients.custom()
            .setSSLSocketFactory(socketFactory)
            .build();

随着-Djavax.net.debug=all我可以看到它正确地选择我的证书,我看到的签名,我看到的证书请求,并有ECDHClientKeyExchange等,都看起来很好。

但是无论如何,我都收到来自Nginx(状态为400)的以下响应:

<head><title>400 The SSL certificate error</title></head>

请注意,对于不正确的证书/密钥,nginx通常会丢弃会话,而不会在纯文本响应中提供任何详细信息。

client.p12可以从命令行运行,例如:

$ curl -ivk --cert client.p12:changeit https://192.168.1.1


* Rebuilt URL to: https://192.168.1.1/
*   Trying 192.168.1.1...
* Connected to 192.168.1.1 (192.168.1.1) port 443 (#0)
* WARNING: SSL: Certificate type not set, assuming PKCS#12 format.
* Client certificate: client-es.certs.my
* TLS 1.2 connection using TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
* Server certificate: server.certs.my
* Server certificate: ca.my
> GET / HTTP/1.1
> Host: 192.168.1.1
> User-Agent: curl/7.43.0
> Accept: */*
>
< HTTP/1.1 200 OK

因此,此密钥绝对有效。但是,为什么它不适用于Java?java ssl配置中有什么我想念的吗?

伊戈尔·阿尔塔莫诺夫(Igor Artamonov)

问题是我的客户密钥还包括在密钥链中签名证书。不仅是我的客户证书(身份验证所必需),而且还包括整个证书链(当然没有密钥,只有证书)

它是:

> Root CA cert -> Client CA cert -> Client key + cert

我猜Java在这种情况下使用了错误的证书,可能是CA或中间证书。

通过添加p12keychain添加到客户的密钥和证书(无中间内容)来解决。

不应该-certfile选项(我以前有)。只是客户端密钥/证书。正确的导出命令是:

openssl pkcs12 -export \
    -in client.crt -inkey client.key \
    -out client.p12

client.p12然后可以导入到钥匙串:

keytool -importkeystore \
    -deststorepass changeit -destkeystore keystore \
    -srckeystore client.p12 -srcstoretype PKCS12 -srcstorepass changeit

并可以很好地用于自定义身份验证。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用jax-rs和cxf进行客户端身份验证

来自分类Dev

如何使用Emberjs进行客户端身份验证

来自分类Dev

使用JAX-WS进行客户端应用程序身份验证

来自分类Dev

使用jax-rs和cxf进行客户端身份验证

来自分类Dev

使用AAD进行客户端身份验证仍需要证书

来自分类Dev

Python套接字服务器通过使用令牌进行客户端身份验证

来自分类Dev

使用证书,证书订单列表或默认证书进行客户端身份验证

来自分类Dev

通过证书进行客户端身份验证的 Swift 3 UrlSession

来自分类Dev

在Jetty服务器中,当需要进行客户端身份验证时,如何获取使用的客户端证书?

来自分类Dev

具有相互身份验证证书的WCF Web服务无法进行客户端链信任验证

来自分类Dev

将根CA添加到Azure App Service中以进行客户端证书身份验证

来自分类Dev

使用Blazor进行客户端验证

来自分类Dev

使用MVC进行客户端验证

来自分类Dev

使用Vue 2进行客户端表单验证

来自分类Dev

申请客户端证书进行身份验证

来自分类Dev

如何通过身份验证方法FORM使用Jersey客户端(2.x)进行身份验证

来自分类Dev

Spring WS 客户端 — 使用 KeyStore/TrustStore 和凭据进行身份验证(基本身份验证)

来自分类Dev

客户端使用OpenPop进行身份验证时,密码是否需要编码?

来自分类Dev

从客户端应用程序使用Doorkeeper进行身份验证,而不传输秘密

来自分类Dev

使用Google OAuth 2.0对桌面客户端应用进行身份验证

来自分类Dev

如何使用客户端证书在Web API中进行身份验证和授权

来自分类Dev

如何使用ServiceStack中的证书对客户端进行身份验证?

来自分类Dev

如何使用Java 11 HTTP客户端进行抢占式身份验证?

来自分类Dev

使用Fabric和Twitter API客户端获取“已通过Twitter进行身份验证”

来自分类Dev

使用其余客户端/ javascript对Microsoft Outlook Web(owa)进行身份验证。

来自分类Dev

使用证书对 Kubernetes API(NodeJS)客户端进行身份验证不成功

来自分类Dev

如何使用客户端证书对 Hono 进行身份验证?

来自分类Dev

使用POCO的客户端摘要身份验证

来自分类Dev

Sharepoint客户端身份验证

Related 相关文章

  1. 1

    使用jax-rs和cxf进行客户端身份验证

  2. 2

    如何使用Emberjs进行客户端身份验证

  3. 3

    使用JAX-WS进行客户端应用程序身份验证

  4. 4

    使用jax-rs和cxf进行客户端身份验证

  5. 5

    使用AAD进行客户端身份验证仍需要证书

  6. 6

    Python套接字服务器通过使用令牌进行客户端身份验证

  7. 7

    使用证书,证书订单列表或默认证书进行客户端身份验证

  8. 8

    通过证书进行客户端身份验证的 Swift 3 UrlSession

  9. 9

    在Jetty服务器中,当需要进行客户端身份验证时,如何获取使用的客户端证书?

  10. 10

    具有相互身份验证证书的WCF Web服务无法进行客户端链信任验证

  11. 11

    将根CA添加到Azure App Service中以进行客户端证书身份验证

  12. 12

    使用Blazor进行客户端验证

  13. 13

    使用MVC进行客户端验证

  14. 14

    使用Vue 2进行客户端表单验证

  15. 15

    申请客户端证书进行身份验证

  16. 16

    如何通过身份验证方法FORM使用Jersey客户端(2.x)进行身份验证

  17. 17

    Spring WS 客户端 — 使用 KeyStore/TrustStore 和凭据进行身份验证(基本身份验证)

  18. 18

    客户端使用OpenPop进行身份验证时,密码是否需要编码?

  19. 19

    从客户端应用程序使用Doorkeeper进行身份验证,而不传输秘密

  20. 20

    使用Google OAuth 2.0对桌面客户端应用进行身份验证

  21. 21

    如何使用客户端证书在Web API中进行身份验证和授权

  22. 22

    如何使用ServiceStack中的证书对客户端进行身份验证?

  23. 23

    如何使用Java 11 HTTP客户端进行抢占式身份验证?

  24. 24

    使用Fabric和Twitter API客户端获取“已通过Twitter进行身份验证”

  25. 25

    使用其余客户端/ javascript对Microsoft Outlook Web(owa)进行身份验证。

  26. 26

    使用证书对 Kubernetes API(NodeJS)客户端进行身份验证不成功

  27. 27

    如何使用客户端证书对 Hono 进行身份验证?

  28. 28

    使用POCO的客户端摘要身份验证

  29. 29

    Sharepoint客户端身份验证

热门标签

归档