使用 OpenSSL 的应用程序级别的相互 TLS

Mutual TLS at the application level with OpenSSL

我有一个 Node.js 服务器接收一个请求,其中包含 XFCC header.

中提供的客户端 TLS 证书

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

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

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

这适用于最简单的情况:

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

具有以下内容:

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 不工作 as-is 以在 App 级别执行等效的 mTLS。

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

我想我的问题是:

dave_thompson_085 pointed out in his other answer 一样,要使 openssl verify 正常工作,您需要注意 它不会从提供的客户端证书文件中读取整个证书链,仅最后一张(叶子)证书.

所以我相信this method in pem package is not entirely correct (in fact they do have open issue),但那是另一回事了。

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

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

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

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