Logstash 7 和 jvm 9+ 以下。
好的,我终于想出了将不同来源的信息拼凑在一起的方法。此解决方案已使用 google cloud SQL 和 hibernate 进行了测试,但也应适用于其他设置。
该解决方案需要使用 java 密钥库(客户端证书/密钥)和信任库(服务器 CA 证书)并传递一些 jdbc URL 参数和 JVM 选项。
首先,让我们从 server-ca.pem 文件创建一个 truststore:
keytool -importcert -alias gcpRoot -file server-ca.pem -keystore truststore.jks -storepass <chose a password and remember>
编辑:或者将 CA 添加到 jvms 现有的 cacerts 文件中(以确保其他 https 调用可以正常工作),复制 cacerts 并将其重命名为 truststore.jks 并运行:
OR: keytool -importcert -alias gcpRoot -file server-ca.pem -keystore truststore.jks -storepass changeit
其次,我们需要分两步将客户端证书和密钥导入密钥库文件(我使用我的 SQL 用户名作为别名,但我认为这并不重要)
openssl pkcs12 -export -in client-cert.pem -inkey client-key.pem -out keystore.p12 -name "<keystore-alias>" -passout pass:<chose a password and remember>
keytool -importkeystore -alias <keystore-alias> -srckeystore keystore.p12 -srcstoretype pkcs12 -destkeystore keystore.jks -srcstorepass <insert same password here> -deststoretype JKS -deststorepass <password-for-output-jks-keystore>
接下来,我们需要修改 jdbc 连接 URL(注意!一些 IDE - 比如 intelliJ - 需要 &amp; 转义并替换为 &amp;
jdbc:mysql://<server-ip>/<db-name>?verifyServerCertificate=true&useSSL=true&requireSSL=true
最后,我们需要提供 keystore 和 truststore 的位置和密码作为 JVM 参数:
-Djavax.net.ssl.trustStore="truststore.jks"
-Djavax.net.ssl.trustStorePassword="<password>"
-Djavax.net.ssl.keyStore="keystore.jks"
-Djavax.net.ssl.keyStorePassword="<password>"
更新:
如果您在 jvm 版本 9 或更高版本上运行(例如 7+ 的 logstash docker 映像),则需要解决一些类加载问题以使 jdbc 驱动程序均匀加载,并且您需要最新版本的 mysql 驱动程序TLS 工作。
首先您显然必须将 jdbc 驱动程序的 .jar 文件放在<logstash-dir>/logstash-core/lib/jars/mysql-connector-java-8.0.17.jar 中(这将导致 jar 自动加载)。我们还需要在输入配置中添加以下内容:
jdbc_driver_library => ""
jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
由于某种原因,我仍然收到警告 Loading class com.mysql.jdbc.Driver. This is deprecated. The new driver class iscom.mysql.cj.jdbc.Driver'` 但尽管有此警告,它仍然有效。