使用 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
这适用于最简单的情况:
- 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
,mTLS 就会成功执行,尽管 Int CA
]'s,这意味着 verify
不工作 as-is 以在 App 级别执行等效的 mTLS。
我知道 s_client
和 s_server
功能,但它们似乎是我需要的黑客,而不是适当的解决方案。
我想我的问题是:
- 是否可以根据 mTLS 规则使用
openssl
根据 CA 链验证证书?
- 如果不可能,那么有什么方法可以避免从头开始编写呢?
与 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 或类似包装器实现这应该是相当简单的。
我有一个 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
这适用于最简单的情况:
- 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
,mTLS 就会成功执行,尽管 Int CA
]'s,这意味着 verify
不工作 as-is 以在 App 级别执行等效的 mTLS。
我知道 s_client
和 s_server
功能,但它们似乎是我需要的黑客,而不是适当的解决方案。
我想我的问题是:
- 是否可以根据 mTLS 规则使用
openssl
根据 CA 链验证证书? - 如果不可能,那么有什么方法可以避免从头开始编写呢?
与 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 或类似包装器实现这应该是相当简单的。