Ошибка аутентификации Mongocxx X509 — сбой SSLHandshakeFailed», «errmsg»: «нет SSL-сертификата, предоставленного одноранговым узлом; соединение отклонено»

#c #mongodb #x509 #mongo-cxx-driver #self-signed-certificate

#c #mongodb #x509 #mongo-cxx-driver #самозаверяющий сертификат

Вопрос:

Я пытаюсь подключиться к MongoDB, используя аутентификацию x509. Я сгенерировал самозаверяющие сертификаты. Даже если я указал точный путь к сертификатам в своем коде, я все равно получаю следующую ошибку на сервере mongodb:

{«t»:{«$ date»:»2020-09-14T15:14:20.108 05:30″},» s»: «I», «c»: «NETWORK», «id»: 22944, «ctx»: «conn5», «msg»: «соединение завершено», «attr»: {«remote»: «192.168.43.20:62215», «connectionCount»: 1}} {«t»:{«$ date»:»2020-09- 14Т15:14:47.154 05:30″},» s»: «I», «c»: «NETWORK», «id»: 22944, «ctx»: «conn4», «msg»: «соединение завершено», «attr»: {«remote»: «192.168.43.20:62187», «connectionCount»: 0}} {«t»:{«$ date»:»2020-09- 14Т17:03:04.641 05:30″},» s»: «I», «c»: «NETWORK», «id»: 22943, «ctx»: «listener», «msg»: «соединение принято», «attr»: {«remote»: «192.168.43.20:62813», «SessionID»: 6, «connectionCount»: 1}} {«t»:{«$date»: «2020-09-14T17:03:04.720 05:30″},» s»: «E», «c»: «СЕТЬ», «id»: 23280, «ctx»: «conn6», «msg»: «Нет SSL-сертификата, предоставленного одноранговым узлом; соединение отклонено»} {«t»:{«$ date»:»2020-09-14T17:03:04.720 05:30″},» s»: «I», «c»: «СЕТЬ», «id»: 22988, «ctx»: «conn6», «msg»: «Ошибка при получении запроса от клиента. Завершение соединения с удаленного», «attr»:{«ошибка»:{«код»: 141, «Кодовое имя»: «SSLHandshakeFailed», «errmsg»: «нет SSL-сертификата, предоставленного одноранговым узлом; соединение отклонено»}, «удаленный»: «192.168.43.20:62813», «connectionId»: 6}} {«t»:{«$ date «:»2020-09-14T17:03:04.721 05:30»}, «s»: «I», «c»: «NETWORK», «id»: 22944, «ctx»: «conn6», «msg»: «соединение завершено», «attr»:{«remote»: «192.168.43.20:62813», «connectionCount»: 0}}

Мой код:-

std::string ca_file = «D:/Certs/my.crt «; std::string pem_file = «D:/Certs/user.pem «;

 /*if (FILE *file = fopen(ca_file.c_str(), "r")) {
    fclose(file);
}
if (FILE *file = fopen(pem_file.c_str(), "r")) {
    fclose(file);
}*/
std::fstream filestream;
filestream.open(ca_file);
if (filestream.fail())
{
    std::cout << "certificate not passed";
}
else 
{
    std::cout << "certificate passed"<<std::endl;
}



tls_options.ca_file(ca_file);
tls_options.ca_dir("D:/Certs/");
tls_options.pem_file(pem_file);
tls_options.pem_password("1234");
tls_options.allow_invalid_certificates(true);
client_options.tls_opts(tls_options);
m_cpp_client = NULL;

try
{
    mongocxx::instance inst{};
    mongocxx::client conn{ mongocxx::uri{"mongodb://192.168.43.20:27017/?authMechanism=MONGODB-X509amp;tls=true"},client_options};
    // auto collection = conn["test"]["restaurants"];
    mongocxx::database db = conn["admin"];
    auto cursor1 = db.list_collections();
    for (const bsoncxx::document::viewamp; doc : cursor1)
    {
        bsoncxx::document::element ele = doc["name"];
        std::string name = ele.get_utf8().value.to_string();
        std::cout << name << std::endl;

    }
}
  

Пожалуйста, дайте мне знать, если вы можете мне помочь

Комментарии:

1. Можете ли вы подключиться через оболочку mongo к этому файлу pem? Я также не понимаю, почему вы указываете путь к центру сертификации, каталог центра сертификации и разрешаете недействительные сертификаты — все эти параметры по существу переопределяют друг друга.

2. Да, я могу подключиться к оболочке mongo с помощью следующих команд: =

3. mongo —tls —tlsCertificateKeyFile «D:Certsuser.pem » —authenticationDatabase ‘$external’ —Механизм аутентификации MONGODB-X509 —хост 192.168.43.20

4. mongo —tls —tlsCertificateKeyFile «D:Certsuser.pem » —tlsCAFile «D:Certsmy.crt » —authenticationDatabase ‘$external’ —Механизм аутентификации MONGODB-X509 —хост 192.168.43.20

5. Я предлагаю обратиться к документации, которой вы следуете из вопроса, и добавить mcve.