elliotsawyer / silverstripe-mysql-ssl
恢复Silverstripe 4对SSL MySQL连接的支持
Requires
Suggests
- silverstripe/cms: Allows you to easily edit file permissions in the CMS
- silverstripe/environmentcheck: Checks that SSL connection is successful
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连接,并强烈建议您不要将其关闭。
- 在开始之前:确保您的防火墙设置不会阻止连接。这些规则可以在Azure中配置
- 首先,您必须根据Azure文档获取特定的CA证书: https://www.digicert.com/CACerts/BaltimoreCyberTrustRoot.crt.pem
- 将此证书保存到您的 web 服务器可访问的位置,例如
/path/to/your/website/.well-known/BaltimoreCyberTrustRoot.crt.pem
- 将以下信息添加到您的 .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
,这很可能是原因。
- 您几乎完成了!如果您现在尝试运行 /dev/build,可能会看到消息 "未知数据库 '<your_database_name>'"。好消息是 Silverstripe 已通过 SSL 连接到您的数据库。坏消息是 Azure 提供给您的数据库用户可能没有创建数据库的权限,因此您无法自动创建指定的数据库。如果发生这种情况,您需要通过其他方式登录 Azure,例如 MySQL 客户端、Sequel Pro 或 MySQL Workbench,以手动创建数据库。
CREATE DATABASE your_database_name
- 再次运行 /dev/build。如果一切顺利,您应该会看到 CREATING DATABASE TABLES 运行缓慢但成功。
贡献
欢迎贡献!请提出一些问题或创建 Github 仓库上的 pull requests。
致谢
感谢 maxime-rainville 和 obj63mc 提供的原版示例代码,该模块就是基于此代码构建的。
支持
需要一些额外的帮助吗?或者只是喜欢我的工作?如果这个模块帮助您解决了问题,请考虑给我买杯咖啡或小额捐赠。我接受以下地址的加密货币
- 比特币:12gSxkqVNr9QMLQMMJdWemBaRRNPghmS3p
- 比特币现金:1QETPtssFRM981TGjVg74uUX8kShcA44ni
- 莱特币:LbyhaTESx3uQvwwd9So4sGSpi4tTJLKBdz
- 以太坊:0x0694E0704c70D8d178dd2e9522FC59EBBEe86748