【发布时间】:2018-07-03 16:16:33
【问题描述】:
我正在尝试在 Perl 脚本中连接 Mongodb 服务器(使用 SSL)但连接失败。
源码:
use strict;
use IO::Socket::SSL;
use MongoDB;
use MongoDB::OID;
my $client = MongoDB::MongoClient->new(
host => 'mongodb://username:password@ip_address1:port_number, ip_address2:port_number,ip_address3:port_number/myDB?ssl=true&replicaSet=mongo123',
ssl => {
SSL_ca_file => " certificates/chain_prod.pem",
SSL_cert_file => " certificates/cert.pem",
},
auth_mechanism => "MONGODB-X509",
username => " CN=XXXXXXXXXXX,OU=XXXXXXXX,O=XXXXXXX,ST=XXXXXXXXXX,C=XX ",
# using openssl x509 -in certs/client.pem -inform PEM -subject -nameopt RFC2253
);
my $db = $client->get_database( "mydb" );
my $coll = $db->get_collection( "customers" );
my $messages = $coll->find;
while ( my $msg = $messages->next ) {
print $msg;
}
错误
NPP_EXEC:“运行 Perl”
NPP_SAVE: C:\Users\royabhix\Desktop\perl_program\MysqlDataBaseConnection.pl
光盘:C:\Users\royabhix\Desktop\perl_program
当前目录:C:\Users\royabhix\Desktop\perl_program
C:\perl64\bin\perl "MysqlDataBaseConnection.pl"
进程已启动 (PID=11400) >>>
MongoDB::UsageError: (eval 595) line 291 的 MONGODB-X509 凭证中的字段密码无效。
MongoDB::_Credential::new(undef, "mechanism", "MONGODB-X509", "mechanism_properties", HASH(0x5935f10), "username", "user123", "password", ...) 在 C:/ Perl64/site/lib/MongoDB/MongoClient.pm 第 1181 行
MongoDB::MongoClient::_build__credential(MongoDB::MongoClient=HASH(0x594db50)) 在 (eval 450) 第 21 行调用
MongoDB::MongoClient::_credential(MongoDB::MongoClient=HASH(0x594db50)) 在 C:/Perl64/site/lib/MongoDB/MongoClient.pm 第 1149 行调用
MongoDB::MongoClient::_build__topology(MongoDB::MongoClient=HASH(0x594db50)) 在 (eval 446) 第 21 行调用
MongoDB::MongoClient::_topology(MongoDB::MongoClient=HASH(0x594db50)) 在 C:/Perl64/site/lib/MongoDB/MongoClient.pm 第 1291 行调用
MongoDB::MongoClient::BUILD(MongoDB::MongoClient=HASH(0x594db50), HASH(0x62e87f8)) 在 (eval 590) 第 1014 行调用
MongoDB::MongoClient::new(undef, "host", "mongodb://username1:password123\@ip_address:port_number,1"..., "ssl", HASH(0xa5dc68), "auth_mechanism", "MONGODB- X509", "username", ...) 在 MysqlDataBaseConnection.pl 第 4 行调用================ 准备好了================
没有 SSL(Mongodb + perl):
use MongoDB ();
use Data::Dumper qw(Dumper);
my $client = MongoDB::MongoClient->new(host => 'localhost', port => 27017);
my $db = $client->get_database( 'mydb');
my $messages_coll = $db->get_collection('customers');
my $messages = $messages_coll->find;
while (my $p = $messages->next) {
print Dumper $p;
}
输出:
NPP_EXEC: "Run Perl"
NPP_SAVE: C:\Users\royabhix\Desktop\perl_program\MongoDBConnection.pl
CD: C:\Users\royabhix\Desktop\perl_program
Current directory: C:\Users\royabhix\Desktop\perl_program
C:\perl64\bin\perl "MongoDBConnection.pl"
Process started (PID=16796) >>>
$VAR1 = {
'password' => 'intel123',
'username' => 'rpn',
'_id' => bless( {
'value' => '5b3b96ea7517d164f102d614'
}, 'MongoDB::OID' )
};
$VAR1 = {
'_id' => bless( {
'value' => '5b3b96f27517d164f102d615'
}, 'MongoDB::OID' ),
'username' => 'faizkhax',
'password' => 'intel456'
};
$VAR1 = {
'_id' => bless( {
'value' => '5b3b96f27517d164f102d616'
}, 'MongoDB::OID' ),
'username' => 'kunal',
'password' => 'intel789'
};
<<< Process finished (PID=16796). (Exit code 0)
================ READY ================
上面的代码 sn-p 工作正常,因为这里没有应用 SSL。
但我想使用 SSL 使用相同的代码。
任何帮助将不胜感激。提前谢谢你
【问题讨论】:
-
编辑问题以更好地格式化您的代码。
-
###Without SSL (Mongodb+perl): 使用 MongoDB ();使用 Data::Dumper qw(Dumper);我的 $client = MongoDB::MongoClient->new(host => 'localhost', port => 27017);我的 $db = $client->get_database('mydb');我的 $messages_coll = $db->get_collection('customers');我的 $messages = $messages_coll->查找; while (my $p = $messages->next) { print Dumper $p; } ###O/P $VAR1 = { 'password' => 'intel123', 'username' => 'royabhix', '_id' => bless( { 'value' => '5b3b96ea7517d164f102d614' }, 'MongoDB: :OID') };
-
您是否尝试从
host属性中的 URL 中删除用户名和密码? (也无需在您的问题中混淆它们,它们以明文形式出现在您的错误消息转储中......所以您现在至少需要更改此密码y2sK...) -
在这种情况下,理想情况下,您还需要提供 MongoDB 模块的版本号,以及使用它时的 perl。事情可能会因版本而异......