【发布时间】:2021-10-26 09:34:44
【问题描述】:
我有一个 Node.js 服务器,它接收带有 XFCC 标头中提供的客户端 TLS 证书的请求。
我想在应用程序级别执行 Mutual TLS,即根据服务器的 CA 信任库验证客户端 TLS 证书 - 所有这些都在应用程序代码中完成,而不是依赖于 Web 代理配置。
我正在使用 NPM 的 pem 依赖项,它本质上是围绕 openssl 的一堆 JS 包装器。特别是,类似于 mTLS 所需的验证是 verify 方法:
openssl verify -CAfile /my/server/ca-chain.crt client-chain.crt
这适用于最简单的情况:
- ca-chain.crt:
Root CA->Int 1 CA - client-chain.crt
Root CA->Int 1 CA->Leaf 1
但在 Int CA 不同的更复杂情况下它会失败:
- ca-chain.crt:
Root CA->Int 1 CA - client-chain.crt
Root CA->Int 2 CA->Leaf 2
以下内容:
openssl verify -CAfile /my/server/ca-chain.crt client-chain.crt
error 20 at 0 depth lookup:unable to get local issuer certificate
据我所知,只要所有证书都有效并导致相同 Root CA,尽管Int CA 不同,这意味着verify,mTLS 将成功执行不能按原样在应用级别执行 mTLS 等效操作。
我知道 s_client 和 s_server 功能,但它们似乎是我需要的黑客,而不是适当的解决方案。
我想我的问题是这样的:
- 是否可以使用
openssl根据 mTLS 规则针对 CA 链验证证书? - 如果不可能,那么在不从头开始编写的情况下,有什么方法可以做到这一点?
【问题讨论】:
-
@user207421 IDK 甚至从哪里开始解决这样的恶意评论,但这并不像您想象的那么不寻常,事实上,一些非常知名的解决方案在应用程序级别执行 mTLS。例如,看看 Kong 是如何做到的。
-
另外:
verify that the identity established by the authenticated client certificate is authorized to access this part of your application- 好吧,在我的例子中,应用程序本身是身份验证服务器,它的唯一职责就是进行此类验证。但是它位于 L7 API 网关之后,除了标头之外,没有简单的方法可以通过底层 TLS 证书。 -
不明显关于编程或开发,以及 dupe stackoverflow.com/questions/65204616/… 和其他几个链接(由我),主要在他们所属的 security.SX 中。
-
@dave_thompson_085 我不一定同意这不是一个编程问题,因为它在 Node.js 的范围内并且它是模块
pem- 例如,其中一个建议可能是求助于不同模块的使用。但是,您是对的,您的 SO 答案之一可能包含我需要的内容,特别是这个非常有用的 stackoverflow.com/questions/44375300/…。我会看看然后解决这个问题,如果它之后有效。
标签: node.js openssl tls1.2 mtls