【问题标题】:Why would PK11_GenerateRandom() return an error -8023?为什么 PK11_GenerateRandom() 会返回错误 -8023?
【发布时间】:2014-03-10 14:38:32
【问题描述】:

我正在通过 Internet 查找 PK11_GenerateRandom() 函数的来源,以了解该函数为何会失败。我有一个程序可以完美地使用这个功能,但是当我们迁移到新版本的 Linux 时,它在分叉后失败了 (fork()) 由于我不认为 N​​SS 存在问题,因此我怀疑我们做错了一些事情,这在旧版本的 Linux 中被忽略了,但在新版本中存在问题。

OpenSSL 包在“好”和“坏”服务器上是相同的:

OpenSSL 0.9.8e-fips-rhel5 01 Jul

NSS rpm 不同。 '好'有

nss-3.12.2.0-2.el5

bas 有这个版本

nss-3.15.3-4.el5_10

“好的”服务器使用相当过时的 Linux:

Linux GOOD 2.6.18-128.el5 #1 SMP Wed Jan 21 08:45:05 EST 2009 x86_64 x86_64 x86_64 GNU/Linux
Enterprise Linux Enterprise Linux Server release 5.3 (Carthage)
Red Hat Enterprise Linux Server release 5.3 (Tikanga)

“坏”服务器较新:

Linux BAD 2.6.18-371.4.1.el5 #1 SMP Wed Jan 29 11:05:49 PST 2014 x86_64 x86_64 x86_64 GNU/Linux
Oracle Linux Server release 5.10
Red Hat Enterprise Linux Server release 5.10 (Tikanga)

任何关于我在哪里可以找到来源或失败原因(如来自fork() 的副作用)的线索将不胜感激。

  • 格雷格

编辑

这是代码,太简单了,我认为不需要。

/* random points to properly allocated memory, let=32 */
SECStatus rv = PK11_GenerateRandom((unsigned char *)random, (int)len);
if ( rv != SECSuccess )
    printf( "PK11_GenerateRandom error = %d\n", PR_GetError()) ;

输出消息当然是:

PK11_GenerateRandom error = -8023
  • 格雷格

【问题讨论】:

  • 请在输入时显示命令和错误信息
  • @sabbahillel:将代码添加到原始帖子中,但我不相信您会在那里发现任何问题,因为问题不在于调用。相同的代码在数千个站点上运行了多年。正是新的 Linux 风格暴露了我们现在正在研究的一些东西。不过,感谢您的关注。
  • @Grzegorz:当 PK11_GenerateRandom() 似乎是 NSS 函数时,我不明白你为什么提供 OpenSSL 版本。您的问题与您忘记提及的 OpenSSL 之间是否有任何关系?您能否提供您正在使用的 NSS 版本?也许您正在使用 PK11_GenerateRandom 可以使用的任何启用 PKCS#11 的加密硬件(HSM 模块等)?
  • @jariq - 你的问题给了我希望你能提供帮助,因为我正在被添加到项目中,他们告诉我有关 OpenSLL 和 NSS 的信息,好像一切都是相互关联的。如何查看 NSS 版本?我如何知道我们是否使用了启用的加密硬件功能?感谢您的帮助!
  • @jariq - 旧的 nss rpm 是 nss-3.12.2.0-2.el5,新的是 nss-3.15.3-4.el5_10。

标签: c linux rhel nss


【解决方案1】:

PK11_GenerateRandom()函数的来源:http://mxr.mozilla.org/mozilla-central/source/security/nss/lib/pk11wrap/pk11slot.c#2285

根据我的计算,-8023 对应错误SEC_ERROR_PKCS11_DEVICE_ERROR

这里描述了原因(感谢 jariq 的提示):https://bugzilla.mozilla.org/show_bug.cgi?id=331096

在过去,可以 fork 并继续使用 PKCS11 函数。他们认为不能那样做,现在的结论是,如果期望分叉后的子代使用这些函数,则父代不应该初始化这些函数。

PKCS11 内部函数正在检查是否存在分叉(它们使用各种方法,具体取决于代码构建的平台。)例如,它们将进程的 pid 存储在内部存储器中,并且在一些昂贵的函数中或调用不这样他们经常将这个保留的 pid 与当前的 getpid() 进行比较。

解决我们的问题需要重新设计代码。

【讨论】:

  • 并且 SEC_ERROR_PKCS11_DEVICE_ERROR 的错误描述是“A PKCS #11 模块返回 CKR_DEVICE_ERROR,表示令牌或插槽出现问题。” PK11_GenerateRandom() 在内部 NSS SoftToken 或外部 PKCS#11 模块(在许多情况下类似于加密硬件的驱动程序)上调用 C_GenerateRandom()。如果您没有使用任何 HSM 或智能卡,我相信您应该查看 NSS SoftToken 的代码。
  • 您应该在此处继续:C_GenereateRandom NSS SoftToken 中的源。 BTW 3.12.2.0-2 于 2008 年 12 月 10 日发布,3.15.3-4 于 2013 年 12 月 13 日发布 - 相差五年。
  • @jariq - 非常感谢。我现在正在查看此页面。
  • @jariq - 我找到了一个与分叉相关的地方。我还发现 PKCS#11 标准规定,在分叉后,所有 PKCS#11 模块都必须重新初始化。我现在正在寻找一种方法来重新初始化 PKCS#11 模块或我需要做的任何事情......
猜你喜欢
  • 1970-01-01
  • 2016-01-08
  • 2023-03-18
  • 1970-01-01
  • 2014-05-09
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 2021-07-01
相关资源
最近更新 更多