Не удается подключиться с помощью SSL / TLS к mongodb - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь подключиться через SSL к локальному экземпляру mongodb через libmongoc.Соединение работает нормально, если я не использую SSL, и я могу нормально выполнять операции CRUD, но когда я включаю SSL и пытаюсь получить некоторые данные, функции mongoc_cursor_next() долго зависают, а затем завершаются с false.

На стороне сервера в журналах показано, что, хотя он застрял внутри функции, клиент подключается к серверу, принимает соединение, отключается и повторяется, пока через несколько минут оно не отклеится:

2019-02-13T15:34:45.792-0300 I NETWORK  [listener] connection accepted from 192.168.25.9:55256 #710 (1 connection now open)
2019-02-13T15:34:45.810-0300 I NETWORK  [conn710] received client metadata from 192.168.25.9:55256 conn710: { application: { name: "Test Client" }, driver: { name: "mongoc", version: "1.13.1" }, os: { type: "Linux", name: "Ubuntu", version: "18.10", architecture: "x86_64" }, platform: "cfg=0xa15ea0e9 posix=200809 stdc=201710 CC=GCC 8.2.0 CFLAGS="" LDFLAGS=""" }
2019-02-13T15:34:45.810-0300 I NETWORK  [conn710] end connection 192.168.25.9:55256 (0 connections now open)
2019-02-13T15:34:46.311-0300 I NETWORK  [listener] connection accepted from 192.168.25.9:55258 #711 (1 connection now open)
2019-02-13T15:34:46.328-0300 I NETWORK  [conn711] received client metadata from 192.168.25.9:55258 conn711: { application: { name: "Test Client" }, driver: { name: "mongoc", version: "1.13.1" }, os: { type: "Linux", name: "Ubuntu", version: "18.10", architecture: "x86_64" }, platform: "cfg=0xa15ea0e9 posix=200809 stdc=201710 CC=GCC 8.2.0 CFLAGS="" LDFLAGS=""" }
2019-02-13T15:34:46.328-0300 I NETWORK  [conn711] end connection 192.168.25.9:55258 (0 connections now open)
2019-02-13T15:34:46.829-0300 I NETWORK  [listener] connection accepted from 192.168.25.9:55260 #712 (1 connection now open)
2019-02-13T15:34:46.843-0300 I NETWORK  [conn712] received client metadata from 192.168.25.9:55260 conn712: { application: { name: "Test Client" }, driver: { name: "mongoc", version: "1.13.1" }, os: { type: "Linux", name: "Ubuntu", version: "18.10", architecture: "x86_64" }, platform: "cfg=0xa15ea0e9 posix=200809 stdc=201710 CC=GCC 8.2.0 CFLAGS="" LDFLAGS=""" }
2019-02-13T15:34:46.843-0300 I NETWORK  [conn712] end connection 192.168.25.9:55260 (0 connections now open)

Сначала я подумал, что ошибка в моем коде, поэтому я перестроил библиотеку libmongoc с опцией -DENABLE_TRACING=1, чтобы посмотреть, смогу ли я найти что-то, что могло бы помочь.Но, к моему удивлению, это «исправило» проблему: он больше не зависал на mongoc_cursor_next(), и документы возвращались бы нормально, но трассировка заполняет стандартный вывод избыточной отладочной информацией, даже сбрасывая отправленные / полученные TCP-пакеты.Если я включу трассировку, проблема исчезнет.Если я отключаю трассировку, она возвращается.

Я пытался установить параметры SSL с помощью функции mongoc_client_pool_set_ssl_opts, но результат такой же, как и передача их через URI.Я также пытался использовать сертификат на клиенте, но тоже не повезло.Единственное, что сработало, это сборка libmongoc с -DENABLE_TRACING=1 или не использование SSL на клиенте.

Я не знаю, связано ли это с тем, что я использую самозаверяющий сертификат, так как я нене имеет подписи доверия.Но я подумал, что sslAllowInvalidCertificates=true должен был игнорировать это требование, поскольку это просто база данных разработки с фиктивными данными.

Я что-то упустил?

Моя среда:

Клиенты:
Ubuntu 18.10 x64, libmongoc 1.13.1 / 1.9.5 (протестированы оба), GCC 8.2.0
Windows 10 Pro, libmongoc 1.9.5, MSVC 2015.

Сервер:
Ubuntu 18.10 x64
MongoDB 4.0.6 (версия git: caa42a1f75a56c7643d0b68d3880444375ec42e3)
Версия OpenSSL: OpenSSL 1.1.1 11 сен. 2018

1031 * Мой пример клиента:
int main(int argc, char *argv[])
{
    mongoc_init();
    mongoc_uri_t *uri = mongoc_uri_new("mongodb://Client:1234@localhost/?authSource=MyDatabase&ssl=true&sslAllowInvalidCertificates=true");

    if(!uri)
    {
        std::cout << "Failed to parse URI";
        return 1;
    }

    mongoc_client_pool_t *pool = mongoc_client_pool_new(uri);
    mongoc_client_pool_set_appname(pool, "Test Client");
    mongoc_client_pool_set_error_api(pool, MONGOC_ERROR_API_VERSION_2);

    mongoc_uri_destroy(uri);

    mongoc_client_t *client = mongoc_client_pool_pop(pool);

    mongoc_collection_t *col = mongoc_client_get_collection(client, "MyDatabase", "MyCollection");

    bson_error_t err;

    bson_t *filter = bson_new_from_json(reinterpret_cast<const uint8_t*>("{}"), 2, &err);
    bson_t *opts = bson_new_from_json(reinterpret_cast<const uint8_t*>("{}"), 2, &err);

    if(!filter || !opts)
        return 2;

    mongoc_cursor_t *cursor = mongoc_collection_find_with_opts(col, filter, opts, nullptr);
    bson_t *bson = nullptr;

    while(mongoc_cursor_next(cursor, const_cast<const bson_t **>(&bson)))
        std::cout << "Got document!" << std::endl;

    mongoc_cursor_destroy(cursor);

    mongoc_collection_destroy(col);

    mongoc_client_pool_push(pool, client);
    mongoc_client_pool_destroy(pool);

    mongoc_cleanup();

    return 0;
}

Конфигурация моего сервера (mongod.conf):

# mongod.conf

# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/

# Where and how to store data.
storage:
  dbPath: /var/lib/mongodb
  journal:
    enabled: true
#  engine:
#  mmapv1:
#  wiredTiger:

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log

# network interfaces
net:
  port: 27017
  bindIp: 0.0.0.0

  ssl:
    mode: allowSSL
    PEMKeyFile: /home/tyras/mongodb.pem
    allowConnectionsWithoutCertificates: true
    allowInvalidCertificates: true


# how the process runs
processManagement:
  timeZoneInfo: /usr/share/zoneinfo

#security:
security:
  authorization: enabled

#operationProfiling:

#replication:

#sharding:

## Enterprise-Only Options:

#auditLog:

#snmp:

РЕДАКТИРОВАТЬ:

После дальнейшего тестирования я обнаружил, что при подключениибез бассейна не застревает на mongoc_cursor_next().но не удается, и mongoc_cursor_error() возвращает:

Error 13053: No suitable servers found (`serverSelectionTryOnce` set): [Failed to receive length header from server. calling ismaster on 'localhost:27017']

Кроме того, я могу нормально подключиться через SSL с CLI Монго и Compass.

...