OpenSSL - 未处理的关键扩展

OpenSSL - 未处理的关键扩展

我们正在尝试创建一个应通过 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 答案

相关内容