gpt4 book ai didi

swift - 如何帮助 Vapor 成功地与我的 PostgreSQL 服务器进行 SSL 握手?

转载 作者:行者123 更新时间:2023-12-04 22:35:22 27 4
gpt4 key购买 nike

我在 Ubuntu 服务器上使用 Vapor 连接到我的 DigitalOcean 管理的 PostgreSQL 数据库。

从命令行,运行以下工作正常:

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 连接,但我不知道从哪里开始。

最佳答案

我最近在 Digital Ocean 上使用 Vapor 4 和 MySQL,我怀疑这同样适用于 PostgreSQL。主要的一点是配置 Vapor 以信任 Digital Ocean 的证书。

  • 从 Digital Ocean 上的托管数据库仪表板(连接详细信息部分)下载 CA 证书。
  • 配置数据库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文件。

    关于swift - 如何帮助 Vapor 成功地与我的 PostgreSQL 服务器进行 SSL 握手?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59023131/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com