大家好,
我正在尝试集成 SE050 以便在 node.js 网络服务器中使用。我成功编译了包括 OpenSSL 提供商在内的中间件,还让 sscli 正常工作。
我使用 ssscli 创建了一个密钥对,将其注入 SE 并创建了一个 refpem 密钥。我还修改了系统的 openssl.cnf 文件,使其与 simwtop/demos/linux/common/openssl30_sss_se050.cnf 文件中的一致。
但是,与服务器的任何 TLS 连接都会在握手中失败,因为 OpenSSL 使用对密钥槽的参考作为实际私钥,而不是调用 SE050 提供商。
我还尝试让它与 OpenSSL CLI(即 openssl s_server)配合使用。我可以使用 nxp:
以下命令会导致错误:
openssl s_server -accept 12345 -cert server.pem -key server.refpem.key -CAfile root.pem错误:
SSL3 alert read:fatal:decrypt error
SSL_accept:error in error
ERROR
20203CA4FFFF0000:error:1B80006E:lib(55):ossl_parse_query:trailing characters:../openssl-3.0.13/crypto/property/property_parse.c:454:HERE-->/usr/lib/libsssProvider.so
20203CA4FFFF0000:error:0A00041B:SSL routines:ssl3_read_bytes:tlsv1 alert decrypt error:../openssl-3.0.13/ssl/record/rec_layer_s3.c:1590:SSL alert number 51
shutting down SSL不过,如果我使用 nxp 网址方案,就能成功连接到服务器。
openssl s_server -accept 12345 -cert server.pem -key nxp:0x6789ABCD -CAfile root.pem但是,我无法在 node.js 代码中指定 nxp: 0x6789ABCD 密钥参考,但必须使用 refpem 文件。有办法做到这一点吗?
我还尝试通过在配置文件中指定一个 propquery,让 OpenSSL 优先使用 SE050 提供程序,而不是默认提供程序。但目前还没有收获。
# Relevant parts from openssl.cnf
[openssl_init]
providers = provider_sect
alg_section = evp_properties
[provider_sect]
default = default_sect
nxp_prov = nxp_prov_sec
[default_sect]
activate = 1
[nxp_prov_sec]
identity = nxp_prov
module = /usr/local/lib/libsssProvider.so
activate = 1
[evp_properties]
default_properties = ?provider=nxp_prov如能得到任何帮助,将不胜感激!
我忘了说,我使用的 Node 版本是 20.12.2。
,20.x 之后的版本可能没有这个问题,但我目前无法验证。
经过进一步调查,发现客户端解密问题是由于提供程序加载顺序不正确造成的。
不过,这个版本的 Node 在处理随机数生成方面存在问题。
问题与 Node 如何初始化提供程序有关。
node.cc 文件包含一个修复程序(在源代码中带有注释),但它不适用于 libsssProvider.so。
我在此分享一系列变通方法,以防有人遇到类似情况。
首先,我要说的是,这些都与 libsssProvider 有关,主要目的是不更改 Node 或 OpenSSL,因此显然可以采用其他更简洁的解决方案。
我不能分享代码,希望下面的信息足够清楚。
可用选项:
1.在 CMakeLists.txt 文件中,设置 SSS_PROV_DISABLE_SE05X_RNG 变量。
这就完全禁止了 SE05X 的随机使用。
这并不理想,但如果你没有任何特殊需要,它还是可行的。
2.在 sssProvider_main.c 中文件,更改 srands 结构的算法,使提供的名称不是已知名称之一(尤其不是默认名称)。
3. 与第 2 点类似,但在这种情况下,名称可选择由环境变量提供(srands 显然不能是常量)。这样,只有在 Node 应用程序中才能避免使用 SE05X 随机发生器,而将其用于其他用途。
有了这些选项, refpems 可以正常工作。
我遇到了与@tksec 完全相同的问题。
如果使用 OpenSSL cli 工具,一切正常,我可以通过 libsssProvider.so 使用 SE052 模块中的密钥建立 TLS 连接。
关于 Node.js、我确认 libsssProvider 已加载,但握手总是失败,错误如下:
SSL3 alert write:fatal:decrypt error
SSL_connect:error in error
20109DB6FFFF0000:error:0A00007B:SSL routines:tls_process_cert_verify:bad signature:/usr/src/debug/openssl/3.2.1/ssl/statem/statem_lib.c:584:
@Kan_Li所建议的通过 id 调用键似乎并不奏效:
- 如果我在 options.key 中提供 refpem 文件的路径,服务器就能顺利启动并监听连接,但正如报告所述,握手失败。
- 如果我在 options.key 中提供 urk 密钥路径(nxp:
-如果我在 options.key 中提供密钥参考 (nxp:
那么,能否请@Kan_Li分享一段可以成功初始化服务器的 Node.js 代码,假设如上所述,这应该可以正常工作?
谢谢!
嗨 @tksec,
你找到在 node.js 中使用密钥参考的合适方法了吗?
我也有类似的问题。我正在使用带有 OpenSSL 3.0.14 的 se05x-openssl-provider (v01.00.03) 来生成密钥对,但我无法按照 openssl 提供商 Github 仓库自述文件中的描述使用文件格式为 " 的 " 参考密钥。
其他两个版本(带有参考密钥的标签(示例-恩智浦:" 参考密钥文件路径 ")和带有密钥 ID 的
标签(示例-nxp: 0x12345678)运行良好。
自述文件内容如下:" 注意:使用此方法时,必须先加载 sss 提供程序。这将确保 sss 提供商可以解码引用密钥中存在的密钥 ID 信息 。 "
遗憾的是,我不知道如何做到这一点。通过在 openssl.cnf 文件中添加提供程序来加载提供程序对我来说不起作用。如果我想使用文件格式的参考密钥,我仍然会遇到解密错误。
在此先表示感谢。
致以最诚挚的问候
托马斯
你好@tksec、
感谢您提供的信息!您使用 refpem 文件的用例是什么?签署&验证?我可以尝试在这里重现这个问题。
顺祝商祺!
坎
你好@Kan_Li、
是的,我使用了 ssscli 工具。我运行的是 MW v4.05.00。我在另一个系统上用 OpenSSL 创建了原始密钥。使用 ssscli set 命令将其加载到 SE 中,并使用 ssscli refpem 命令创建 refpem。在使用 s_client、s_server、rsa 等 openssl 命令时,可以成功使用和解析该密钥。也可以使用 OSSL_STORE API(openssl 命令的内部功能)将其转换为 EVP_PKEY,但使用 PEM_read_bio_PrivateKey 无法解析,而 NXP 引擎(在 EmbSe_LoadPrivKey 中)和 node.js 都使用 PEM_read_bio_PrivateKey。
谢谢您!
你好@tksec、
您是如何为 RSA 密钥生成 refpem 的?您现在使用的是哪个版本的 MW?请予以澄清。
祝您愉快,
Kan
-------------------------------------------------------------------------------
注:
- 如果本帖回答了您的问题,请点击"标记正确" 按钮。谢谢!
- 我们会在最后一次发帖后的 7 周内跟踪主题,之后的回复将被忽略
如果您以后有相关问题,请另开新主题,并参考已关闭的主题。
-------------------------------------------------------------------------------
你好@Kan_Li
谢谢你说明 refpem 密钥只能用于 openssl 引擎。特别是 node.js 的问题在于,它们会直接对提供的任何密钥字符串调用 PEM_read_bio_PrivateKey 函数,而当密钥字符串不是 PEM 字符串或文件路径而是 uri 时,该函数显然会失效。目前还没有对 OpenSSL 提供商的直接支持。
我改回使用 OpenSSL 引擎,结果也遇到了类似的问题。使用 EC 密钥时工作正常,而使用 RSA 密钥时,在解析 PEM 文件时再次出现错误:1E08010C:DECODER routines::unsupported from OpenSSL。我调试了代码,可以将错误追溯到 PEM_read_bio_PrivateKey 函数,该函数在引擎代码中的 EmbSe_LoadPrivKey 中调用。
您知道在 OpenSSL 引擎中处理 RSA refpem 密钥的问题吗?如何解决这个问题?在我看来,RSA 的 refpem 比 EC 密钥的侵入性更强,这可能是个问题?
你好@tksec、
refpem 密钥文件仅适用于 openssl 引擎,但由于您使用的是带有提供程序的 openssl 3.xx,因此请使用"nxp:key_id" 代替。你可以将"se05x_mw_v04.05.01\simw-top\demos\linux\tls_client\scripts\tlsSeClient.sh" 与"se05x_mw_v04.05.01\simw-top\demos\linux\tls_client\scripts\tlsSeClient_3_0.sh" 进行比较,检查两者的区别。 我还想知道你对此是否有任何网络安全问题,实际上从我的选择来看,它只是大多数脚本应该接受的字符串,为什么不能在 node.js 代码中指定 nxp: 0x6789ABCD 密钥参考?请澄清。
祝您愉快,
Kan
-------------------------------------------------------------------------------
注:
- 如果本帖回答了您的问题,请点击"标记正确" 按钮。谢谢!
- 我们会在最后一次发帖后的 7 周内跟踪主题,之后的回复将被忽略
如果您以后有相关问题,请另开新主题,并参考已关闭的主题。
-------------------------------------------------------------------------------