Проблема SSL-соединения с Mongodb с использованием Perl - PullRequest
0 голосов
/ 03 июля 2018

Я пытаюсь подключиться к серверу Mongodb (используя SSL) в сценарии Perl, но не смог подключиться.

Исходный код:

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;
}

Error

NPP_EXEC: «Запустить Perl»
NPP_SAVE: C: \ Users \ royabhix \ Desktop \ perl_program \ MysqlDataBaseConnection.pl
CD: C: \ Users \ royabhix \ Desktop \ perl_program
Текущий каталог: C: \ Users \ royabhix \ Desktop \ perl_program
C: \ perl64 \ bin \ perl "MysqlDataBaseConnection.pl"
Процесс запущен (PID = 11400) >>>
MongoDB :: UsageError: неверный пароль поля в учетных данных MONGODB-X509 в строке (eval 595) 291.
MongoDB :: _ Credential :: new (undef, «механизм», «MONGODB-X509», «механизм_свойств», HASH (0x5935f10), «имя пользователя», «user123», «пароль», ...), вызываемый в 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 line 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 line 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
<<< Процесс завершен (PID = 11400). (Код выхода 255) </p>

================ ГОТОВ ================

Без 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 ================

Приведенный выше фрагмент кода работает нормально, поскольку SSL здесь не применяется.

Но я хочу иметь тот же код с SSL.

Любая помощь будет принята с благодарностью. Заранее спасибо

1 Ответ

0 голосов
/ 03 июля 2018

Ваше сообщение об ошибке приходит с этой строки: 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...