【问题标题】:SSL Connection issue with Mongodb using Perl使用 Perl 的 Mongodb 的 SSL 连接问题
【发布时间】: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。事情可能会因版本而异......

标签: mongodb perl ssl


【解决方案1】:

您的错误信息来自这一行: https://metacpan.org/source/MONGODB/MongoDB-v2.0.0/lib/MongoDB/_Credential.pm#L211

如果你研究上面的代码,你会发现它依赖于:

'MONGODB-X509' => {
    password             => sub { ! length },
    source               => sub { $_ eq '$external' },
    mechanism_properties => sub { !keys %$_ },
},

这意味着当您使用MONGODB-X509 身份验证方案时,您不应提供密码,因为如果有密码,sub { ! length } 将触发并生成错误。

我猜密码是从您的 URL 中取出的,在 host 参数中,所以请尝试使用:

host => 'mongodb://username@ip_address1:port_number, ip_address2:port_number,ip_address3:port_number/myDB?ssl=true&replicaSet=mongo123'

(如果您使用证书,用户名本身可能实际上无关紧要)

https://metacpan.org/pod/MongoDB::MongoClient#MONGODB-X509-(for-SSL-client-certificate) 的手册页给出了这个例子:

my $mc = MongoDB::MongoClient->new(
    host => "mongodb://sslmongo.example.com/",
    ssl => {
        SSL_ca_file   => "certs/ca.pem",
        SSL_cert_file => "certs/client.pem",
    },
    auth_mechanism => "MONGODB-X509",
    username       => "CN=XXXXXXXXXXX,OU=XXXXXXXX,O=XXXXXXX,ST=XXXXXXXXXX,C=XX"
);

顺便说一下,确切地说,这不是 TLS(比 SSL 更好的名称)问题,而是与使用 X.509 证书进行身份验证有关的问题。

【讨论】:

  • 即使从主机 URL 中删除密码后,我也会收到相同的错误。
  • @AbhijitRoy 密码必须来自某个地方,图书馆可以看到。你确定你打电话给MongoDB::MongoClient-&gt;new()吗?
  • 不,我不确定。
  • 我对这个领域很陌生。那么,你能给我发一个完整的演示吗?如果有任何方法可以在没有身份验证的情况下执行代码,这对我很有帮助。
  • @AbhijitRoy 我已经添加了手册页中的示例。请注意,该 URL 没有任何用户名或密码。首先尝试一个简单的案例,只有一个名称或一个 IP,然后在它工作时根据需要使其更复杂。您必须同时进行很多事情(不确定您在 host 中的 URL 是否有效,所以从一个简单的开始)
猜你喜欢
  • 2017-11-25
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-14
  • 2014-09-13
相关资源
最近更新 更多