如果我的应用程序未启用 SSL,为什么连接到我在 Azure 中的 MySQL 服务器会失败?

Why does connection to my MySQL server in Azure fail if my app does not have SSL enabled?

当我尝试从未启用 SSL 的 app/client 连接到 Azure 中的 MySQL 服务器时出现连接失败。报错信息如下:

需要 SSL 连接。请指定 SSL 选项并重试。

连接到 Azure 中的 MySQL 服务器时是否必须使用 SSL?有什么办法可以绕过这个要求吗?

默认情况下,MySQL 的 Azure 数据库在您的服务器和客户端应用程序之间强制执行 SSL 连接,以防止 MITM(中间人)攻击。这样做是为了尽可能安全地连接到您的服务器。

虽然不推荐,但如果您的客户端应用程序不支持 SSL 连接,您可以选择禁用要求 SSL 连接到您的服务器。请检查 How to Configure SSL Connectivity for your MySQL server in Azure 了解更多详情。您可以从门户或使用 CLI 禁用要求 SSL 连接。请注意,Azure 不建议在连接到服务器时禁用要求 SSL 连接。

选项 1 在 "Azure Database for MySQL servers" 下的 Azure 门户中 1) 选择 MySql 服务器 2) 转到定价层 -> 强制 SSL 连接和 select 禁用选项 -> 保存

选项 2 1) 从 https://www.digicert.com/CACerts/BaltimoreCyberTrustRoot.crt.pem 下载证书 2) 使用这些证书

连接到 MySql 服务器
mysql -h mydemoserver.mysql.database.azure.com -u Username@mydemoserver -p --ssl-ca=/opt/ssl/BaltimoreCyberTrustRoot.crt.pem

从 Docker 容器到 Azure MYSQL 通过 SSL 连接:

我的情况略有不同,但我写在这里是因为 Azure 文档 https://docs.microsoft.com/en-us/azure/mysql/howto-configure-ssl 没有详细说明应用程序如何从 docker 容器与 MYSQL 通信.

在我的例子中,我使用 docker 容器连接到 Azure MYSQL。我在 MYSQL 服务器上启用了 SSL 设置,并使用 sql workbench 验证了连接,并且我能够使用 BaltimoreCyberTrustRoot.crt.pem 通过 SSL 从本地连接它。但是我的应用程序抛出错误消息 -

SSL connection is required. Please specify SSL options and retry.

我在 docker compose yml 文件中传递 DATABASE_SSL_CERT: /etc/ssl/certs/BaltimoreCyberTrustRoot.crt.pem

我了解到 pem 文件中的 \n 有时会被解释为 docker 环境变量中的其他内容。 \n用notepad++打开每行都可以看到

我所做的修复是将 pem 文件转换为 base64 并在 yml 文件中更新相同的文件。像 -

DATABASE_SSL_CA: LS0tLS1CRUdJTiBDRVJUSUZ...=

在某些情况下,它还需要—— DATABASE_SSL_ENABLE: "true" 强制 SSL 连接到 MYSQL。

我的新 yml 看起来像-

version: "2.2"
services:
  redis:
    image: redis:3.2.6

  ckeditor-cs:
    image: docker.cke-cs.com/cs:3.9.1
    depends_on:
      - redis
    ports:
      - "8000:8000"
    restart: always
    init: true
    environment:
      DATABASE_DRIVER: mysql
      DATABASE_HOST: efg.mysql.database.azure.com
      DATABASE_USER: user@db
      DATABASE_PASSWORD: PASS
      DATABASE_PORT: 3306
      DATABASE_SSL_CA: LS0tLS1CRUdJTiB............S0=
      DATABASE_SSL_ENABLE: "true"
      REDIS_HOST: redis
      ENVIRONMENTS_MANAGEMENT_SECRET_KEY: ABC
      LICENSE_KEY: XYZ
    volumes:
      - ~/ckeditor-cloudservice/easyimage_files:/var/cs/easyimage

现在一切正常。

原因是 SSL 设置 在 MySQL 服务器

的 Azure 数据库设置中启用

您可以选择禁用它,如下所示:

  1. 转到“MySQL 服务器的 Azure 数据库”下的 Azure 门户
  2. 选择MySql服务器
  3. 转到“连接安全”菜单
  4. 转到“SSL 设置”部分
  5. 强制 SSL 连接和 select 禁用选项
  6. 单击页面顶部的“保存”按钮

虽然不推荐, 这是完整的细节 How to disable ssl

但简而言之。 选择“服务器参数”并为 require_secure_transport 搜索并将值设置为关闭。

您还可以按照提到的简单步骤配置 ssl here