我有一个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。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
据我所知,只要所有证书都有效并导致相同的, mTLS就会成功执行。Root CA
,尽管不同的Int CA
,这意味着verify
不能按原样工作,以在应用程序级别做mTLS等效。
我知道s_client
和s_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或类似的包装器来实现应该是相当简单的。