elliotsawyer/silverstripe-mysql-ssl

恢复Silverstripe 4对SSL MySQL连接的支持

安装次数: 7,353

依赖项: 0

建议者: 0

安全性: 0

星标: 2

关注者: 3

分支: 2

公开问题: 2

类型:silverstripe-vendormodule

1.0.0 2022-09-15 21:39 UTC

This package is auto-updated.

Last update: 2024-09-13 00:52:45 UTC


README

这个项目的存在意义是什么?

Silverstripe 4不允许通过SSL进行MySQL连接。由于未知原因,该功能在早期测试版中被移除,并且尚未恢复。 已提出一个问题 但尚未修复。此模块添加了这一支持。

更新:此模块不再适用于Silverstripe 4.13和Silverstripe 5,上述问题现已解决。此模块将保留在线,因为文档提供了在Azure上设置上下文。

安装

composer require elliotsawyer/silverstripe-mysql-ssl

配置

在您的.env文件中设置以下变量

SS_DATABASE_CLASS="ElliotSawyer\SSLMySQLDatabase\SSLMySQLDatabase"
#this must be an IP address, localhost will not work
SS_DATABASE_SERVER="127.0.0.1"
SS_DATABASE_USERNAME="..."
SS_DATABASE_PASSWORD="..."
SS_DATABASE_SSL_KEY="/path/to/client-key.pem"
SS_DATABASE_SSL_CERT="/path/to/client-cert.pem"
SS_DATABASE_SSL_CA="/path/to/ca-cert.pem"

如果未定义证书和密钥,数据库将不使用SSL连接。

PDO将不起作用(见下文)- 您必须使用MySQLi。默认情况下,MySQLi将在连接之前尝试验证SSL证书。如果您使用自签名证书,则需要禁用此功能。

ElliotSawyer\SSLMySQLDatabase\SSL_MySQLiConnector:
  verify_ssl_certificate: false

本地主机与127.0.0.1与IP地址

当您的Web服务器和MySQL位于同一服务器上时,通信是通过套接字连接进行的,SSL在很大程度上是不相关的。MySQLi在使用SSL时期望IP地址,所以在这种情况下请使用127.0.0.1。

对于网络连接,您必须使用IP地址或数据库主机作为主机名。

如果您看到错误 此流不支持SSL/crypto,这可能是最可能的原因。

更多信息: https://blog.machek.co.uk/2016/06/php-with-mysql-and-ssl.html

MySQLi与PDO

当使用PDO和SSL时,PHP会因“陷阱6”错误而中止。这通常是由于使用了未经验证的证书,并且可能与证书的CN属性中不存在的主机名相关。存在一个标志可以覆盖此行为,但在某些PHP的最新版本中似乎不起作用。

MySQLi也有类似的问题,但其标志确实起作用。因此,此模块要求您使用MySQLiConnector而不是PDOConnector。实际上,这不应该是一个问题,因为Silverstripe的ORM将处理数据库抽象。

验证SSL连接

您可以通过运行以下SQL命令来验证安全连接是否工作: DB::query("SHOW STATUS LIKE '%ssl_cipher'");。如果您通过SSL连接,您将得到一个只有一个结果的数组

[
    Variable_name => Ssl_cipher,
    Value => DHE-RSA-AES256-SHA
]

如果您已安装environmentcheck模块,这将自动检查并如果使用了不安全的连接则失败。

Microsoft Azure for MySQL用户

此模块可以用于通过安全的SSL连接连接到Azure。出于安全原因,Azure默认强制执行SSL连接,并强烈建议您不要将其关闭。

  1. 在开始之前:确保您的防火墙设置不会阻止连接。这些规则可以在Azure中配置
  2. 首先,您必须根据Azure文档获取特定的CA证书: https://www.digicert.com/CACerts/BaltimoreCyberTrustRoot.crt.pem
  3. 将此证书保存到您的 web 服务器可访问的位置,例如 /path/to/your/website/.well-known/BaltimoreCyberTrustRoot.crt.pem
  4. 将以下信息添加到您的 .env 文件或环境变量中
SS_DATABASE_USERNAME="YourAzureDBUsername"
SS_DATABASE_PASSWORD="YourAzureDBPassword"
SS_DATABASE_SERVER="YourAzureDBHostname.mysql.database.azure.com"
SS_DATABASE_SSL_KEY=NULL
SS_DATABASE_SSL_CERT=NULL
SS_DATABASE_SSL_CIPHER=NULL
SS_DATABASE_SSL_CA="/path/to/your/website/.well-known/BaltimoreCyberTrustRoot.crt.pem"

该模块将将这些特定数据库变量中精确的字符串 "NULL" 转换为 PHP 的 null 值。或者,您也可以将以下内容定义到 config.yml 文件中,而不是使用 SS_DATABASE_SSL_CIPHER

SilverStripe\ORM\Connect\MySQLiConnector:
  ssl_cipher_default: null

MySQLiConnector 类默认使用的加密方式与 Azure 不兼容。如果您看到错误 Abort trap: 6,这很可能是原因。

  1. 您几乎完成了!如果您现在尝试运行 /dev/build,可能会看到消息 "未知数据库 '<your_database_name>'"。好消息是 Silverstripe 已通过 SSL 连接到您的数据库。坏消息是 Azure 提供给您的数据库用户可能没有创建数据库的权限,因此您无法自动创建指定的数据库。如果发生这种情况,您需要通过其他方式登录 Azure,例如 MySQL 客户端、Sequel Pro 或 MySQL Workbench,以手动创建数据库。
CREATE DATABASE your_database_name
  1. 再次运行 /dev/build。如果一切顺利,您应该会看到 CREATING DATABASE TABLES 运行缓慢但成功。

贡献

欢迎贡献!请提出一些问题或创建 Github 仓库上的 pull requests。

致谢

感谢 maxime-rainvilleobj63mc 提供的原版示例代码,该模块就是基于此代码构建的。

支持

需要一些额外的帮助吗?或者只是喜欢我的工作?如果这个模块帮助您解决了问题,请考虑给我买杯咖啡或小额捐赠。我接受以下地址的加密货币

  • 比特币:12gSxkqVNr9QMLQMMJdWemBaRRNPghmS3p
  • 比特币现金:1QETPtssFRM981TGjVg74uUX8kShcA44ni
  • 莱特币:LbyhaTESx3uQvwwd9So4sGSpi4tTJLKBdz
  • 以太坊:0x0694E0704c70D8d178dd2e9522FC59EBBEe86748