我正在使用 mysqlkit 进行 Vapor 服务器端项目,并用于配置 MySQL,如下所示:
let config = MySQLConfiguration(hostname: "127.0.0.1", port: 3306, username: "root", password: "s3#12412r657f", database: "Admin", tlsConfiguration: nil)
已成功连接本地数据库。现在,我有了用于远程数据库的 SSL
CA
文件(SSL 证书颁发机构文件)。
在 mysql 工作台中,我在 SSL 选项卡的 SSL 证书颁发机构文件路径字段中选择了 ca_cert.crt 文件。效果很好!
但我不知道如何配置 TLS 或将我的
cacertificate.crt
文件放在哪里&我已经测试过 crt 文件仅为 PEM 格式。
static let prod: MySQLConfiguration = {
var tls = TLSConfiguration.makeClientConfiguration()
do {
let bytes = [UInt8]("""
-----BEGIN CERTIFICATE-----
EX_CERTIFICATE_STRINGS...
-----END CERTIFICATE-----
""".data(using: .utf8)!)
let cert: NIOSSLCertificate = try .init(bytes: bytes, format: .pem)
tls.certificateChain = [.certificate(cert)]
tls.privateKey = nil
let config = MySQLConfiguration(hostname: "192.65.85.577", port: 3658, username: "testadmin", password: "dd#246$@erjt!df^67", database: "Elevate", tlsConfiguration: tls)
return config
} catch {
fatalError("DB SSL CA Error: \(error.localizedDescription)")
}
}()
当我查询数据库时,我收到错误消息,
{
"error": true,
"reason": "handshakeFailed(NIOSSL.BoringSSLError.sslError([Error: 268435581 error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED at /Users/At4/Library/Developer/Xcode/DerivedData/Elevate-xcftyy3423/SourcePackages/checkouts/swift-nio-ssl/Sources/CNIOBoringSSL/ssl/handshake.cc:393]))"
}
但是相同的证书和其他参数可以在 MySQLWorkBench 上正常工作。
crt 应分配给
trustRoots
tls.certificateVerification = .fullVerification
tls.trustRoots = .certificates([cert])
或者证书链但没有验证
tls.certificateVerification = .none
tls.certificateChain = .certificates([cert])
两者都有效,我选择了
trustRoots
,但仍然不确定这是正确还是错误。