spring-boot - 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()
可能缺少启用的东西吗?
解决方案
我认为 cloudflare 正在终止 TLS 连接,然后启动与您的源的新连接,因此它不能(据我所知)只是通过代理证书,因为它从未看到客户端上的私钥。基于此,如果您是企业客户,您可以将根 CA 提供给 cloudflare,他们将根据该 CA 为您验证客户身份。第一篇文章还建议您可以打开“Authenticated Origin Pulls”,这将确保只有 cloudflare 可以直接与您的源服务器对话。
第二个链接还说:
对于使用客户端证书进行标识的公司,Cloudflare 还可以将客户端证书的任何字段作为自定义标头转发。
这表示您可以将密钥中的字段转发到您的来源,以便您的来源可以知道请求来自谁。
推荐阅读
- eclipse - maven:生命周期配置未涵盖插件执行
- mapstruct - MapStruct:如何映射作为源只有一个对象的对象列表
- python - 在 Django 中使用表单更新一对一模型
- python - 为什么我无法在 Keras 中加载我保存的连体模型?
- angularjs - 将现有捆绑的 JavaScript WebPack 模块与 TypeScript 结合并重新捆绑它们
- android - 迁移到 androidx 后的 ShareActionProvider NPE
- javascript - 故事书:moduleMetadata 不加载所需的服务、模块等
- twitter-bootstrap - 如何在桌面上按原样呈现移动视图?
- git - 如何在詹金斯管道中提取 Git 分支
- reactjs - 如何成功地为 a 设置 ref