我们正在尝试创建一个应通过 HTTPS(>TLS v1.2)与服务器交互的 node.js 应用程序。我们获得了一些密钥、证书文件列表,以便与服务器建立连接。Node HTTPS 需要 CA、证书、密钥文件(即 CA 文件)、服务器证书和密钥文件。提供这些后,我们收到以下错误:
Error: unhandled critical extension.
在网上搜索了一段时间后,我们发现 CA 证书有一些自定义扩展。之后我们openssl verify -CAfile ca_file.pem server_cert.pem
就可以重现它了:
error 34 at 0 depth lookup:unhandled critical extension
OK
所以,这似乎与 OpenSSL 有关。我们如何让 OpenSSL 理解我们的自定义扩展?这些自定义扩展也很重要,因此我们不能仅仅通过设置来忽略错误-ignore_critical
。
答案1
我在 openvpn 中收到 ssl 错误。
VERIFY ERROR: depth=1, error=unhandled critical extension: CN=xxxx
OpenSSL: error:xxx:SSL routines:tls_process_server_certificate:certificate verify failed
我的理解是,CA 坚持认为某些值至关重要,而这些值在证书中不存在或者错误。
使用 OpenVPN 为我修复该问题的方法是将 CA 中设置为 critical=True 的“subjectKeyIdentifier”改为 False。
答案2
来自 OpenSSL 文档X509_VERIFY_PARAM_set_flags:
[对于 OpenSSL,]默认情况下,任何未处理的关键扩展在证书 [...] 中产生致命错误。
在 Node.js HTTPS/TLS 服务器中,一种解决方法是将选项设置rejectUnauthorized
为 false。如果客户端证书被拒绝(在req.client.authorized
请求期间检查),我们可以手动重新检查(可能使用 pkijs、node-forge 或其他 x509 证书感知包),忽略有问题的扩展。
查看我的Stack Overflow 答案。