【发布时间】:2019-07-06 20:28:48
【问题描述】:
我有一个 Spring Boot 应用程序,我试图从该应用程序连接到 AWS RDS 上的 MySQL。 但是我遇到了以下错误:
localhost-startStop-1, handling exception: javax.net.ssl.SSLHandshakeException: Received fatal alert: unknown_ca
启用 ssl 握手调试后,我看到 CertificateRequest 步骤的 Cert Authorities: 为空。
根据我的理解,这是 client(spring boot 应用程序)需要向 server(mysql db)提供证书的部分。
-
Certificate Request步骤 - 服务器将向客户端发出证书请求。 - 下一步是
*** Certificate chain,这是客户端发送给服务器的证书。在这种情况下,对我来说,它正在发送keyStore_cert.jks的内容。
到目前为止我认为的问题:
服务器(mySQL db)不知道客户端(我的应用程序)正在发送的这个证书(我的 keyStore_cert.jks)。
但是,我的印象是除非您为用户设置REQUIRE X509,否则不需要客户端证书。
问题:
- 我还可以查看其他内容以找到确切的问题吗?
- 如果出现上述问题,我该如何解决?如何禁用客户端验证?
- 或者我怎样才能保持客户端验证但它可以工作?
- 我需要向
keyStore_cert.jks/trustStore_cert.jks添加任何内容吗?
这些是我的设置和我尝试过的。
- RDS 引擎版本:5.7.22
- mysql-connector-java v8.0.13
- 连接网址:
jdbc:mysql://<host>:<port>/<db_name>?useLegacyDatetimeCode=false&verifyServerCertificate=true&useSSL=true&requireSSL=true - 对于我正在使用的用户,我在 DB 上执行了以下操作:
ALTER USER '<my_db_user>'@'%' require SSL;
GRANT USAGE ON <db_name>.* TO '<my_db_user>'@'%' REQUIRE SSL;
- 基于AWS documentation:我将那些证书(根证书和中间证书)导入到trustStore。做某事:
keytool -import -keystore trustStore_cert.jks -storepass <trustStore_password> -alias "awsrds-us-east1" -file rds-ca-2015-us-east-1.pem - 我使用我们自己的密钥库。此时未对 keyStore 进行任何操作。
- 应用程序 trustStore 和 keyStore 作为 JVM 参数传递,如下所示:
-Djavax.net.ssl.keyStore=path/keyStore_cert.jks
-Djavax.net.ssl.keyStorePassword=<keyStore_password>
-Djavax.net.ssl.trustStore=path/trustStore_cert.jks
-Djavax.net.ssl.trustStorePassword=<trustStore_password>
- 对于特定用户,当我使用 MySQL Workbench 并在 Use SSL 的连接设置中指定:If available 或 Require。它与此消息相关联:
Host: <host>
Port: <port>
User: <user>
SSL: enabled with DHE-RSA-AES128-SHA
- 但是,如果我指定 要求并验证 CA 或 要求并验证身份,它会给出以下消息:
SSL connection error: CA certificate is required if ssl-mode is VERIFY_CA or VERIFY_IDENTITY。这是有道理的,因为我没有为 CA 文件指定任何内容。
握手步骤(将省略一些日志。):
*** ClientHello, TLSv1.1 (seems okay)
***
*** ServerHello, TLSv1.1 (seems okay)
***
*** Certificate chain (has the root key)
chain [0] = [
[
Version: V3
Subject: C=US, ST=Washington, L=Seattle, O=Amazon.com, OU=RDS, CN=**<my_rds_name>abcd.us-east-1.rds.amazonaws.com**
Signature Algorithm: SHA1withRSA, OID = 1.2.840.113549.1.1.5
...
...
chain [1] = [ (has the us-east-1 key)
[
Version: V3
Subject: CN=Amazon RDS us-east-1 CA, OU=Amazon RDS, O="Amazon Web Services, Inc.", L=Seattle, ST=Washington, C=US
Signature Algorithm: SHA1withRSA, OID = 1.2.840.113549.1.1.5
...
...
***
Found trusted certificate:
[
[
Version: V3
Subject: CN=Amazon RDS us-east-1 CA, OU=Amazon RDS, O="Amazon Web Services, Inc.", L=Seattle, ST=Washington, C=US
Signature Algorithm: SHA1withRSA, OID = 1.2.840.113549.1.1.5
...
...
*** CertificateRequest (the Authorities are empty)
Cert Types: RSA, DSS, ECDSA
Cert Authorities:
<Empty>
*** ServerHelloDone
matching alias: <my keyStoreAlias>
*** Certificate chain (seems entries from my own key Store)
chain [0] = [
[
Version: V3
Subject: CN=<the CN on my keyStore>, OU=Web Servers, O=Company , C=US
Signature Algorithm: SHA256withRSA, OID = 1.2.840.113549.1.1.11
***
*** ClientKeyExchange, RSA PreMasterSecret, TLSv1.1 (seems okay)
*** CertificateVerify (seem okay)
*** Finished
verify_data: { 50, 89, 33, 202, 193, 158, 226, 114, 128, 50, 198, 250 }
***
【问题讨论】:
-
您解决了吗?面临类似问题“致命警报:unknown_ca”
-
@user2677034 在与 AWS RDS 支持人员联系后,我确实找到了解决方案。不完全是我想要的,但它有效。我将在下面发布答案。
标签: java mysql spring-boot ssl amazon-rds