这篇文章最初发布在 nodejs Github 问题页面上,但看起来这是 Ubuntu 22.04 的一个问题,所以我在这里重新发布它,希望得到进一步的建议。Github 上的原始帖子在这里:https://github.com/nodejs/node/issues/43132。
每当尝试使用 nodejs 的加密模块对数据进行签名时,我都会收到错误,提示 OpenSSL 无法加载共享库。如果我在启动节点之前将OPENSSL_CONF
变量设置为,/dev/null
那么我就可以毫无问题地对数据进行签名。这表明问题很可能出在/etc/ssl/openssl.cnf
配置文件中;但是,我不知道如何进一步追踪它。我该怎么做才能确定配置的哪一部分出现故障?如果引擎丢失/损坏,我该如何提供工作副本?
重现步骤
我正在运行从先前版本(可能是 21.10,但我不确定)升级的 Ubuntu 22.04。我最初在使用使用 nvm 安装的节点版本时遇到了这个问题,但我也可以使用nodejs
apt 安装的软件包重现它。
启动node
然后运行此代码(注意:此密钥是为此示例生成的):
var crypto = require('crypto')
var sign = crypto.createSign('RSA-SHA256')
sign.update("TEST INPUT")
sign.sign(`-----BEGIN PRIVATE KEY-----
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDHCN7vsxauuh4M
+VCqxdMwYMV2zLTcCGOIYYRMuCd6Rt3TNKpLmjxmXx3QPvv1QNjDeokFGlnpcxOG
DPs7abkULC12Qdk1wld8apo0qU5xDXDT/beLzc52ykOOySkz0+WxI4sNMqUnLcQq
4FMMTM2CCk4W9z/hZitjqlUyYxLWqgn/Vtp6C1qMD2gFOU3WAFe9jQNvDHJ7H6+5
2nWwFzkaswxHy++6PvzsLtop6/D+cqdKpaiXLzUJvHJbLX4ZLxdMdGq0y7hwhvA8
o2vLf+5cqeoQyobcdczUNC+GjKo9gaMw3j2RSxkfkJT1Mgs0AtBopFrIKLr1Medu
CObjb2vPAgMBAAECggEARrbvokFCQ1UL/TcNQodjp9ISBknnzi9K0bc37pwVJpwM
DxCsmozTfdm4eXcPRM1D1nvwN7hrjoZcvulYz3yaDcE+a8AsgK2qMKGdZS1sGb2Z
QzBnKIw4GTt2skHlWi0kdAG5UziVtexMQKGP0BRvhY7MvNsevqHys4femjbaCBsk
Nv+RoAT1Q/xOAXAy0tBVCOEdVmwiy+beVzl164wjABv8KhVNjnDZYUlCRtlm0hpn
r9+mQ1Gq5d97LaFojgXLKbpPv5Hi6nyaFzA1HVGnqGP97GfAgj/aFg0j/0k19l2l
YLiDtxN7B4ZOhS/B6q5y2KMd1lZIbR8VMpN9Uc9vqQKBgQDtJxiOyjtnAl9eaNhH
9HHI8DG2i406FO0zTzlhAJY0ZFZDJtrfy5ggIu6tAg2VDurbSlvHxepThvX856g0
TjDbAJQB5sNouB7M+k5+eyZxH8ctnhEXrp3FiryZME7maQOepUaT6sK4eaaXwgIb
2zWWVvi5WG9uHtvWvCGCk+JOeQKBgQDW2kH40LIdYh+WU3TFh8676PewN66BRoJp
s/V0vm8Nj2dgM9dpIgekmPpjdMGYhqWC++dSkl7ix76ivHIg31Wg1x2ugV9Mr/Dd
HITCrsF/McCOdDvx2RQJtPI/BRVimZJmFXr5MbyVXcrUkIhQBvMV+/1kGr2x7Tn8
xtoKTS3ahwKBgQCJJhwIsCHsb63Rvpad/lszlt1ZMZmKJoILM1z+oUU8pW5RxY28
8VRX+XvIqDBMrOTbz0QG44mhpqJqEVrwbOvKK6ps8xS9YgXGC1gLw5K2x2b8FbbS
2FQ74wExIoPusnq6a+DGOHVGFGxoxXVMwNhbyo5rOh6vM791jzVd+8JcGQJ/V0hT
hMFDmqxCKM++oICLe8so1G3KdrouQMLa9JJoixm25V4qJIuujy+WiNDl1RDeLFgp
oWHVKkv7JiFoO/J+1tiNNldYX88aCrmLNYvJD+MmVrjhoV6OxWK9Bt0J0wSQdOhF
DPcnpYZ03+XXeqtYFZZJWmGCrsWwyP//lC/GcQKBgQC9TIvLQb3s6BZyjuJLV/Lg
99+sJG8hUJ9KWgSkUYCByCUjFv4W+nByhgie5kP07cL5oIZbWmxWdJ/sRLYvZ+n7
aRkhcCzYPzYRDNu7erzzWVS31vGWXUeUiMMO9/Q4SVIBPN1c/VSkjgZcn/Hft3C1
tSy7RFfrQHILNt5U3N60XA==
-----END PRIVATE KEY-----`)
您收到以下错误:
Uncaught:
Error: error:25066067:DSO support routines:dlfcn_load:could not load the shared library
at Sign.sign (internal/crypto/sig.js:103:29) {
opensslErrorStack: [
'error:0E076071:configuration file routines:module_run:unknown module name',
'error:0E07506E:configuration file routines:module_load_dso:error loading dso',
'error:25070067:DSO support routines:DSO_load:could not load the shared library'
],
library: 'DSO support routines',
function: 'dlfcn_load',
reason: 'could not load the shared library',
code: 'ERR_OSSL_DSO_COULD_NOT_LOAD_THE_SHARED_LIBRARY'
}
在 nodejs 之外签名数据工作正常(junk.pem 包含与上面相同的密钥):
$ openssl dgst -sha256 -sign junk.pem junk.pem | openssl base64
L5ujucYKKzi+ajZi4vVkJNIpoznMLbzZOdgYtS9Y6qrwBlbt9VTpNpzUM3IeWtDe
2gDk563T3qL+1TeLwcbUHiCWeUrCBUdsQofnrAf5pJq9PW4zaWEHjre3g9Gcnqu6
jaWX7K/g1s9RRM0Kif10a3gAzV6Ij3Bw/NsXMouupBd8hUZrqaxwXtcv3pKAtKIS
aIXP34FXtB5qdsAC9kDNH0Sk9hBlhs33eCxhBIOP4xq4IpLWct0aGGDYD8OB1LTC
6JybDir2QqlZ/qmNuesaI7EmW1Pi90MGeTdSG/9nhBTCE0Q0JttNxOfWkSusJADE
N/rBdOR3Fp0PS6FB7hWNzQ==
答案1
这Zoho 提供的解决方法对我有用:
因此,我们建议您注释掉
providers = provider_sect
文件中的行/etc/ssl/openssl.cnf
并重新启动应用程序一次。
也就是找到该openssl_init
部分,然后将其改为:
[openssl_init]
#providers = provider_sect
OpenSSL 指出,如果没有明确配置提供程序,则会加载默认提供程序,因此删除明确的提供程序(显然是的一部分fipsinstall
)应该是安全的。
答案2
这个问题已在最新的 nodejs 版本中得到解决。我在升级到 Ubuntu 22.04 后遇到了 node v16.15.0 的这个问题。将 node 升级到 v16.16.0 后问题得到解决