bug: worker fails in Node FIPS mode because BullMQ repeatable jobs default to MD5 hashing

当 Langfuse worker 运行在 Node.js FIPS 模式下时,BullMQ 的可重复任务(repeatable jobs)默认使用 md5 生成 key,而 FIPS 会拒绝 MD5,导致 crypto.createHash("md5") 抛错。优先排查是否启用了 Node.js

快速结论:当 Langfuse worker 运行在 Node.js FIPS 模式下时,BullMQ 的可重复任务(repeatable jobs)默认使用 md5 生成 key,而 FIPS 会拒绝 MD5,导致 crypto.createHash("md5") 抛错。优先排查是否启用了 Node.js FIPS 模式,以及 Langfuse 是否显式设置了 BullMQ 的 repeatKeyHashAlgorithm。

适用环境:Langfuse worker 3.195.0;BullMQ 5.76.3(Langfuse 依赖 ^5.76.3);运行时为 Node.js FIPS 模式 / 加固容器镜像。

最快修复方案:暂无确认的一步修复方案(Issue 未提供已验证的官方修复)。Issue 中讨论的可优先尝试方向是让 Langfuse 中央 BullMQ 选项传入 FIPS 安全算法,例如 settings.repeatKeyHashAlgorithm: "sha256",或在 WorkerManager.register() 中通过环境变量覆盖。

注意事项:切换哈希算法会改变可重复任务的 key,Redis 中已存在的可重复任务会被视为新任务,旧任务可能成为孤儿任务。升级前建议先 drain/remove 现有的可重复任务;该方案在 Issue 中仅为讨论/建议,未标记为已验证修复。

问题场景

在启用 Node.js FIPS 模式(或使用加固容器镜像)的环境中启动 Langfuse worker 时,只要代码路径去创建或更新 BullMQ 的可重复任务(repeatable jobs),就会触发该错误。Langfuse v3.195.0 依赖 BullMQ ^5.76.3,而 BullMQ 在未显式配置时,可重复任务的 key 生成默认回退到 md5,最终传入 crypto.createHash(...),在 FIPS 模式下被拒绝。

报错原文

Error: error:0308010C:digital envelope routines::unsupported

或来自 crypto.createHash("md5") 的等效 OpenSSL/FIPS 错误。

原因分析

Langfuse 目前没有在任何地方配置 repeatKeyHashAlgorithm,因此 BullMQ 会回退到 md5。BullMQ 5.76.3 中,可重复任务会优先使用 settings.repeatKeyHashAlgorithm,若未提供则回退 md5,该值随后被传入 crypto.createHash(...)。在 Node.js FIPS 模式下 md5 被禁止,于是 worker 初始化相关代码路径时失败。BullMQ 已提供受支持的选项 settings.repeatKeyHashAlgorithm,Langfuse 的中央 BullMQ queue/worker 选项位于 packages/shared/src/server/redis/redis.ts,worker 通过 worker/src/queues/workerManager.ts 传入这些选项,但均未设置该字段。

环境排查

  • 确认 Langfuse worker 版本(Issue 中为 3.195.0)。
  • 确认 BullMQ 版本(Issue 中为 5.76.3,Langfuse 依赖 ^5.76.3)。
  • 确认 Node.js 运行时是否启用了 FIPS 模式(或使用加固容器镜像)。
  • 检查是否在 Langfuse 代码/配置中设置了 repeatKeyHashAlgorithm(Issue 确认当前代码库中未配置)。
  • 检查 Redis 中是否已存在可重复任务,评估切换算法的影响。

解决步骤

  1. 确认当前环境确实处于 Node.js FIPS 模式,并复现 crypto.createHash("md5") 相关报错。
  2. 在 Langfuse 中央 BullMQ 选项(packages/shared/src/server/redis/redis.ts 的 settings)中补充 repeatKeyHashAlgorithm: "sha256",使其作为 FIPS 安全算法传入。
  3. 或在 worker/src/queues/workerManager.ts 的 WorkerManager.register() 中,利用已有的 additionalOptions: Partial<WorkerOptions> 机制,在 new Worker(...) 的 settings 里加入默认 repeatKeyHashAlgorithm(例如从环境变量读取,默认 sha256)。
  4. 如需支持部署方覆盖,可在共享 env.ts 中新增枚举环境变量(如 ["md5", "sha1", "sha256"]),允许回退 md5 以兼容已有的可重复任务 key。
  5. 升级/切换算法前,先 drain 或 remove Redis 中现有的可重复任务,避免旧任务成为孤儿任务。

验证方法

在启用了 Node.js FIPS 模式的环境中重新启动 Langfuse worker,并触发创建/更新 BullMQ 可重复任务的代码路径。若不再出现 error:0308010C:digital envelope routines::unsupported 或来自 crypto.createHash("md5") 的等效 OpenSSL/FIPS 错误,且 worker 能正常初始化并处理队列,即表示问题已解决。同时确认 Redis 中可重复任务的 key 已按新算法生成,无残留旧 key 引起的重复任务。

参考来源

langfuse/langfuse #14611

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 28212

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注