我目前正在升级几个根本不使用身份验证的 Mongodb 服务器以使用 x509 证书进行身份验证。
在此过程中,我希望客户端能够连接到服务器,无论服务器是否配置为使用身份验证。
基本上我希望能够在配置授权和未配置授权时在客户端上使用相同的连接字符串。这将是一个临时设置。这可能吗?如果没有,欢迎其他建议。
需要明确的是,客户端将使用类似这样的方式进行连接
$server = 'mongodb://mongoserver1:27017/';
$options = [
'authMechanism' => 'MONGODB-X509',
'username' => 'C=US,ST=DC,L=DC,O=YES,OU=CLIENT,CN=user1',
'authSource' => '$external',
'ssl' => false,
'tlsCertificateKeyFile' => '/etc/ssl/certs/user1.pem',
'tlsCAFile' => '/etc/ssl/certs/CA.pem',
'tlsInsecure' => 'true'
];
$driverOptions = [];
$database = 'test';
$client = new MongoDB\Client($server, $options, $driverOptions);
$db = $client->selectDatabase($database);
在服务器上,在 /etc/mongod.conf 中我会使用这样的东西
net:
tls:
mode: preferTLS
certificateKeyFile: /etc/ssl/certs/server1.pem
CAFile: /etc/ssl/CA.pem
allowConnectionsWithoutCertificates: true
我还通过 mongosh 在服务器上添加用户
db.getSiblingDB("$external").runCommand(
{
createUser: "C=US,ST=DC,L=DC,O=NO,OU=CLIENT,CN=user1",
roles: [
{ role: "readWriteAnyDatabase", db: "admin" },
{ role: "clusterMonitor", db: "admin" }
],
writeConcern: { w: "majority" , wtimeout: 5000 }
}
)
相关证书将位于服务器上或客户端可以根据需要访问。
我尝试了上述和其他一些方法,但没有成功。通过上述配置,我收到错误 - “AuthenticationFailed:客户端没有可用的已验证主题名称”
一些一般要点:
我认为你应该跳过
'username' => 'C=US,ST=DC,L=DC,O=YES,OU=CLIENT,CN=user1'
,用户名取自客户端证书DistinguishedName。请注意,您的用户名与创建的用户 O=NO
不同。它们必须相同 - 但也许这只是您问题中的拼写错误。为什么使用O=YES
?您拥有所有可用证书,因此您还应该通过 TLS/SSL 加密连接。
关于你的具体问题。设置参数security.transitionToAuth
使用
security:
authorization: enabled
transitionToAuth: true
运行的
mongod
接受经过身份验证和未经身份验证的连接。在此转换状态期间连接到 --transitionToAuth
的客户端可以对任何数据库执行读取、写入和管理操作。