У меня есть приложение Spring Boot, из которого я пытаюсь подключиться к MySQL на AWS RDS.Однако у меня возникают проблемы со следующей ошибкой:
localhost-startStop-1, handling exception: javax.net.ssl.SSLHandshakeException: Received fatal alert: unknown_ca
После включения отладки для рукопожатия ssl я вижу, что для шага CertificateRequest
Cert Authorities:
пусты.Насколько я понимаю, это та часть, в которой клиент (приложение с весенней загрузкой) должен предоставить сертификат серверу (mysql db).
Certificate Request
step - Сервер выдаст запрос сертификата от клиента. - Следующим шагом будет
*** Certificate chain
, то есть сертификат, который клиент отправляет на сервер.В этом случае для меня это отправка содержимого keyStore_cert.jks
.
Что я думаю, проблема до сих пор: Сервер (MySQL DB) не знает об этомсертификат (мой keyStore_cert.jks), который отправляет клиент (мое приложение).Но у меня сложилось впечатление, что клиентские сертификаты не требуются, если вы не установите для пользователя REQUIRE X509
.
Вопросы:
- Есть личто-то еще, что я могу посмотреть, чтобы найти точную проблему?
- Если выше проблемы, как я могу это исправить?Как я могу отключить проверку клиента?
- Или как сохранить проверку клиента, но она работает?
- Нужно ли что-нибудь добавить к
keyStore_cert.jks
/ trustStore_cert.jks
?
Это мои настройки и то, что я пробовал.
- Версия RDS Engine: 5.7.22
- mysql-connector-java v8.0.13
- URL подключения:
jdbc:mysql://<host>:<port>/<db_name>?useLegacyDatetimeCode=false&verifyServerCertificate=true&useSSL=true&requireSSL=true
- для пользователя, которого я использую, я выполнил в БД следующее:
ALTER USER '<my_db_user>'@'%' require SSL;
GRANT USAGE ON <db_name>.* TO '<my_db_user>'@'%' REQUIRE SSL;
- На основе документации AWS : я импортировал эти сертификаты (root ипромежуточный) в trustStore.Делать что-то:
keytool -import -keystore trustStore_cert.jks -storepass <trustStore_password> -alias "awsrds-us-east1" -file rds-ca-2015-us-east-1.pem
- Я использую наш собственный хранилище ключей.В это время ничего не было сделано с хранилищем ключей.
- приложения 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 и в настройках соединения для Использую SSL Я указываю: Если доступно или Требуется .Он связывается с этим сообщением:
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 }
***