首页 > 解决方案 > Java + Cloudflare + 相互身份验证

问题描述

我正在尝试进行相互身份验证......我目前的问题是无法使用域......看起来云耀斑没有转发我的证书。

基本上,如果我直接访问 IP 工作正常:

$ curl -k -E clientkey.pem https://18.228.142.39:8443/logged_info 

(这很好用)

$ curl -E clientkey.pem https://xxx.mysite.com:8443/logged_info 

(我得到 525:SSL 握手失败)

我启用了 ssl 调试器并且证书永远不会到达服务。

我调用域时的一些 ssl 日志:

upcoming handshake states: server finished[20]
*** Certificate chain
https-jsse-nio-8443-exec-2, fatal error: 42: null cert chain
javax.net.ssl.SSLHandshakeException: null cert chain
%% Invalidated: [Session-1, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256]
https-jsse-nio-8443-exec-2, SEND TLSv1.2 ALERT: fatal, description = bad_certificate
https-jsse-nio-8443-exec-2, WRITE: TLSv1.2 Alert, length = 2
https-jsse-nio-8443-exec-2, fatal: engine already closed. Rethrowing javax.net.ssl.SSLHandshakeException: null cert chain
https-jsse-nio-8443-exec-2, called closeOutbound()
https-jsse-nio-8443-exec-2, closeOutboundInternal()

可能缺少启用的东西吗?

标签: spring-bootsslcloudflare

解决方案


我认为 cloudflare 正在终止 TLS 连接,然后启动与您的源的新连接,因此它不能(据我所知)只是通过代理证书,因为它从未看到客户端上的私钥。基于如果您是企业客户,您可以将根 CA 提供给 cloudflare,他们将根据该 CA 为您验证客户身份。第一篇文章还建议您可以打开“Authenticated Origin Pulls”,这将确保只有 cloudflare 可以直接与您的源服务器对话。

第二个链接还说:

对于使用客户端证书进行标识的公司,Cloudflare 还可以将客户端证书的任何字段作为自定义标头转发。

这表示您可以将密钥中的字段转发到您的来源,以便您的来源可以知道请求来自谁。


推荐阅读