mongodb 7.0 彻底移除 scram-sha-1 支持,必须手动重建用户并显式指定 scram-sha-256 机制,同时更新客户端驱动认证配置,否则连接失败。

直接说结论:MongoDB 7.0 不再支持 SCRAM-SHA-1,必须切换为 SCRAM-SHA-256;所谓“平滑升级”不是服务端自动兼容,而是你得手动重建用户、更新客户端驱动和连接配置,否则连接会直接失败。
为什么不能继续用 SCRAM-SHA-1?
MongoDB 7.0 已完全移除 SCRAM-SHA-1 支持(包括服务端存储格式和认证逻辑),不是“默认不启用”,是彻底删了。如果你在 7.0 上执行 db.createUser() 并指定 mechanisms: ["SCRAM-SHA-1"],命令会报错:InvalidOptions: unrecognized authentication mechanism "SCRAM-SHA-1"。
这个变化不是临时策略,而是安全合规强制要求——SHA-1 已被 NIST 等机构明确弃用,MongoDB 自 6.0 起就警告弃用,7.0 是最终裁剪点。
重建用户时必须用 db.createUser() 指定 SHA-256
旧用户不会自动迁移,db.updateUser() 也不能把 SCRAM-SHA-1 用户“升级”成 SCRAM-SHA-256;你必须删掉旧用户,用新机制重新创建:
- 先删除旧用户:
db.dropUser("myuser") - 再创建新用户(显式指定机制):
db.createUser({ user: "myuser", pwd: "newpass", roles: [{ role: "readWrite", db: "test" }], mechanisms: ["SCRAM-SHA-256"] }) - 注意:
mechanisms字段必须是数组且只含"SCRAM-SHA-256",留空或不传会 fallback 到默认机制(仍是SCRAM-SHA-256,但显式声明更稳妥)
如果省略 mechanisms,MongoDB 7.0 仍会用 SCRAM-SHA-256 创建用户,但建议写明——避免未来版本语义变更带来的歧义。
客户端驱动必须显式声明 AuthMechanism
很多老项目依赖驱动默认行为,但在 MongoDB 7.0 + 新用户组合下,这会出问题:
- Java 驱动:不能只用
MongoCredential.createScramSha1Credential(),必须改用MongoCredential.createScramSha256Credential() - Python PyMongo:URI 中若没带
authMechanism=SCRAM-SHA-256,且驱动版本 - Node.js:
mongodb://user:pass@host:27017/?authMechanism=SCRAM-SHA-256是必须项,不能省略
关键点:驱动版本也得达标。PyMongo 至少 4.0+,Node.js 驱动至少 5.0+,否则即使 URI 写对了,驱动内部仍可能尝试协商 SCRAM-SHA-1 导致握手失败。
最容易被忽略的坑:AuthSource 和密码哈希存储位置
SCRAM-SHA-256 要求密码哈希必须由服务器端生成(即你在 admin 库执行 createUser,哈希就存在 admin.system.users;如果在 test 库执行,哈希就在 test.system.users)。这意味着:
- 连接时
authSource必须指向用户实际创建所在的库,不能只写admin假设全局有效 - 如果你过去习惯在
admin创建用户但连其他库时没加authSource=admin,现在会报Authentication failed—— 因为驱动默认去目标库找用户凭证,而凭证其实在admin - 验证方式:
mongo -u myuser -p --authenticationDatabase admin或 URI 中写mongodb://myuser:pass@host:27017/mydb?authSource=admin
这个细节在升级后高频出错,错误日志里不提示 authSource 错误,只报泛泛的认证失败,容易绕远路排查。











