Как я могу помочь Vapor успешно установить SSL-подтверждение моего сервера PostgreSQL?

Я использую Vapor на сервере Ubuntu для подключения к моей базе данных PostgreSQL, управляемой DigitalOcean.

Из командной строки нормально работает следующее:

psql postgresql://user:password@host:port/dbname?sslmode=require

Но запуск эквивалента со следующим кодом дает мне:

Fatal error: Error raised at top level: NIOOpenSSL.NIOOpenSSLError.handshakeFailed(NIOOpenSSL.OpenSSLError.sslError([Error: 337047686 error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed])): file /home/buildnode/jenkins/workspace/oss-swift-5.1-package-linux-ubuntu-18_04/swift/stdlib/public/core/ErrorType.swift, line 200

Вот код:

    let postgres = PostgreSQLDatabase(config: PostgreSQLDatabaseConfig(
        hostname: Environment.get("POSTGRESQL_HOSTNAME")!,
        port: Int(Environment.get("POSTGRESQL_PORT")!)!,
        username: Environment.get("POSTGRESQL_USERNAME")!,
        database: Environment.get("POSTGRESQL_DATABASE")!,
        password: Environment.get("POSTGRESQL_PASSWORD")!,
        transport: .standardTLS
    ))

Переключение транспортного аргумента на .unverifiedTLS работает.

Мне нужна помощь, чтобы позволить Vapor правильно настроить SSL-соединение, но я не знаю, с чего начать.

1 ответ

Недавно я работал с Vapor 4 и MySQL в Digital Ocean, подозреваю, что то же самое будет работать и с PostgreSQL. Основная часть заключалась в том, чтобы настроить Vapor так, чтобы он доверял сертификату Digital Ocean.

  1. Загрузите сертификат ЦС с панели управляемой базы данных в Digital Ocean (раздел сведений о подключении) .

  2. Настроить базу данных tlsConfigurataionдоверять этому сертификату. Вот пример того, как это может выглядеть:

      import NIOSSL

public func configure(_ app: Application) throws {
    app.databases.use(.postgres(
        hostname: Environment.get("DATABASE_HOST") ?? "localhost",
        port: Environment.get("DATABASE_PORT").flatMap(Int.init(_:)) ?? PostgresConfiguration.ianaPortNumber,
        username: Environment.get("DATABASE_USERNAME") ?? "vapor_username",
        password: Environment.get("DATABASE_PASSWORD") ?? "vapor_password",
        database: Environment.get("DATABASE_NAME") ?? "vapor_database",
        tlsConfiguration: try makeTlsConfiguration()
    ), as: .psql)
  // ...
}

private func makeTlsConfiguration() throws -> TLSConfiguration {
    var tlsConfiguration = TLSConfiguration.makeClientConfiguration()
    if let certPath = Environment.get("DATABASE_SSL_CERT_PATH") {
        tlsConfiguration.trustRoots = NIOSSLTrustRoots.certificates(
            try NIOSSLCertificate.fromPEMFile(certPath)
        )
    }
    return tlsConfiguration
}

В этом примере я использую DATABASE_SSL_CERT_PATHпеременная среды, чтобы установить путь к загруженному ca-certificate.crtфайл.

Другие вопросы по тегам