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



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

我想在应用程序级别执行互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。crtRoot CA->Int 1 CALeaf 1

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

  • ca-chain。crt:Root CA->Int 1 CA
  • client-chain。crtRoot CA->Int 2 CALeaf 2

openssl verify -CAfile /my/server/ca-chain.crt client-chain.crt
error 20 at 0 depth lookup:unable to get local issuer certificate

据我所知,只要所有证书都有效并导致相同的, mTLS就会成功执行。Root CA,尽管不同的Int CA,这意味着verify不能按原样工作,以在应用程序级别做mTLS等效。

我知道s_clients_server的功能,但它们似乎是我需要的hack,而不是一个合适的解决方案。

我想我的问题是:

  • 是否可以使用openssl根据mTLS规则对CA链验证证书?
  • 如果不可能,那么在不诉诸于从头开始编写的情况下,有什么方法可以做到这一点呢?

正如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包含一个与Int CA不同的链,但最终导致相同的Root CA-这就是有效地使客户端证书链有效的原因。

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

最新更新