这最初发布到nodejs Github问题页面,但似乎这是Ubuntu 22.04的问题,所以我在这里重新发布它希望得到进一步的建议。Github 上的原始线程在这里: https: //github.com/nodejs/node/issues/43132。
每当尝试使用 Nodejs 的加密模块对数据进行签名时,我都会收到一条错误消息,指出 OpenSSL 无法加载共享库。如果我将OPENSSL_CONF
变量设置/dev/null
为启动节点之前,那么我就可以毫无问题地签署数据。这表明问题很可能出在/etc/ssl/openssl.cnf
配置文件上;但是,我不知道如何进一步追踪它。我可以做什么来确定配置的哪一部分失败了?如果引擎丢失/损坏,我如何提供工作副本?
重现步骤
我正在运行从先前版本升级的 Ubuntu 22.04(可能是 21.10,但我不确定)。我最初在使用使用 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-----`)
Run Code Online (Sandbox Code Playgroud)
您会收到以下错误:
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'
}
Run Code Online (Sandbox Code Playgroud)
在 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==
Run Code Online (Sandbox Code Playgroud)
小智 13
Zoho 提供的解决方法对我有用:
因此,我们建议您注释掉
providers = provider_sect
文件中的行/etc/ssl/openssl.cnf
并重新启动应用程序一次。
即找到该openssl_init
部分并将其更改为:
[openssl_init]
#providers = provider_sect
Run Code Online (Sandbox Code Playgroud)
OpenSSL 声明,如果没有显式配置提供程序,则加载默认提供程序,因此删除显式提供程序(显然是 的一部分fipsinstall
)应该是安全的。
这个问题在最新的nodejs版本中已经得到解决。升级到 Ubuntu 22.04 后,我在节点 v16.15.0 上遇到了这个问题。将节点升级到 v16.16.0 后问题已解决
Github 讨论:https://github.com/nodejs/node/discussions/43184
归档时间: |
|
查看次数: |
9847 次 |
最近记录: |