-1

我有一个 Node.js 服务器,它接收带有XFCC标头中提供的客户端 TLS 证书的请求。

我想在应用程序级别执行相互 TLS,即针对服务器的 CA 信任库验证客户端 TLS 证书 - 所有这些都在应用程序代码中完成,而不是依赖于 Web 代理配置。

我正在使用 NPM 的pem依赖项,它本质上是一堆 JS 包装器openssl。特别是,类似于 mTLS 所需的验证是verify方法:

openssl verify -CAfile /my/server/ca-chain.crt client-chain.crt

这适用于最简单的情况:

  • ca-chain.crt:Root CA->Int 1 CA
  • 客户端链.crt Root CA-> Int 1 CA->Leaf 1

但在 Int CA 不同的更复杂的情况下它会失败:

  • ca-chain.crt:Root CA->Int 1 CA
  • 客户端链.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,mTLS 就会成功执行,尽管Int CA's 不同,这意味着verify不能按原样工作,以便在 App 级别执行 mTLS 等效。

我知道s_clients_server能力,但它们似乎是我需要的黑客,而不是一个适当的解决方案。

我想我的问题是这样的:

  • 是否可以openssl根据 mTLS 规则使用 CA 链验证证书?
  • 如果不可能,那么不从头开始编写它的方法是什么?
4

1 回答 1

0

正如dave_thompson_085在他的另一个答案中指出的那样,openssl verify要使其正常工作,您需要注意它不会从提供的客户端证书文件中读取整个证书链,而只会读取最后一个(叶)证书

所以我相信这个包中的方法并不pem完全正确(事实上他们确实对此有未解决的问题),但这是另一回事。

假定的openssl命令应该被翻译成这样:

openssl verify -CAfile /my/server/ca-chain.crt -untrusted client-ca-chain.crt client-leaf.crt

在这里,我将叶子客户端证书与在参数中传递的链的其余部分分开-untrusted,同时-CAfile包含一个具有不同 a 的链Int CA,但最终导致相同Root CA- 这就是有效地使客户端证书链有效的原因。

使用 Node.js 的openssl或类似的包装器来实现这应该是相当简单的。

于 2021-08-26T13:52:13.273 回答