尝试实施客户端密钥身份验证(带有自签名的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配置中有什么我想念的吗?
问题是我的客户密钥还包括在密钥链中签名证书。不仅是我的客户证书(身份验证所必需),而且还包括整个证书链(当然没有密钥,只有证书)
它是:
> Root CA cert -> Client CA cert -> Client key + cert
我猜Java在这种情况下使用了错误的证书,可能是CA或中间证书。
通过添加p12
或keychain
仅添加到客户的密钥和证书(无中间内容)来解决。
它不应该有-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] 删除。
我来说两句