keyfile原始字节长度必须严格为6–1024字节,需用openssl rand -base64反向计算(如756字节生成约1008字节编码后内容),禁用echo/dd等非安全方式;权限必须为600且属主正确;所有节点内容须字节级一致;配置中必须同时启用security.keyfile和clusterauthmode: keyfile。

keyFile长度和内容必须严格满足6–1024字节
mongod启动时会校验keyFile原始字节长度(不是base64编码后长度),必须落在6–1024范围内。用openssl rand -base64生成时,要反向计算原始字节数:base64编码会使长度膨胀约33%,所以填741、756或768这类数字才保险——例如openssl rand -base64 756 > /data/mongodb/keyfile,编码后约1008字节,符合要求。
别用echo "abc" > keyfile,哪怕加了chmod也会报错:key file is empty或key file does not have permissions restricted;也别用dd if=/dev/urandom bs=1 count=100 > keyfile,因为二进制内容可能含不可见控制字符,mongod拒绝加载。
文件权限必须是600且属主正确
Linux下keyFile必须仅属主可读写,组和其他用户不能有任何权限。设置命令必须是chmod 600 /path/to/keyfile,用chmod 400或chmod 700都不行——前者缺少写权限导致mongod无法打开文件,后者多出执行位也会被拒绝。
还要确保运行mongod进程的用户(通常是mongod或mongodb)是文件属主:chown mongod:mongod /path/to/keyfile。如果用root生成却没改属主,启动时会静默失败或报Permission denied。
所有副本节点必须用完全相同的keyFile内容
副本集里每个mongod实例(包括primary、secondary、arbiter)加载的keyFile,字节级内容必须一模一样。哪怕只差一个换行或空格,节点间握手就会失败,rs.status()里对应成员状态变成UNREACHABLE或STARTUP2卡住。
同步方法推荐scp或rsync -a直接复制文件本体,不要重新生成、不要重定向追加、不要解压再打包——这些操作都可能引入不可见差异。路径也要保持一致,比如全用/etc/mongo/keyfile,避免某台机器写成/data/keyfile导致启动时报Failed to load keyfile。
启动时必须显式指定--keyFile参数或配置文件中启用
光有文件不等于启用认证。必须在启动命令里加--keyFile /path/to/keyfile,或者在配置文件mongod.conf里写:
security: keyFile: /path/to/keyfile clusterAuthMode: keyFile
clusterAuthMode不能省——它告诉mongod用keyFile做集群内认证,而不是仅靠--auth做客户端登录认证。漏掉这行,副本集节点能连上,但很快因心跳失败被踢出,日志里反复出现no valid connection to config server或could not authenticate。
注意:--keyFile和--auth要一起用。只开keyFile不做用户认证,客户端仍能无密码访问;只开auth没keyFile,副本集根本组不起来。
sha256sum手动校验;而权限和路径错误往往只在某一台节点上发生,排查时容易陷入“为什么就这一台连不上”的误区。











