【问题标题】:Mutual TLS at the application level with OpenSSL使用 OpenSSL 在应用程序级别实现双向 TLS
【发布时间】: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_clients_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


【解决方案1】:

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

所以我认为pem 包中的this method 并不完全正确(实际上他们确实有open issue),但这是另一回事。

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-03
    • 2020-09-29
    • 1970-01-01
    • 1970-01-01
    • 2012-05-26
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多