如何使用Laravel 5.3

时间:2017-05-19 03:53:43

标签: mysql database ssl laravel-5

我一直在网上搜索并没有取得任何成功。

例如:https://laravel.io/forum/06-18-2014-connecting-mysql-over-ssl?page=1 https://laracasts.com/discuss/channels/lumen/connecting-to-mysql-via-ssl-from-lumen

我正在尝试从我的laravel应用程序通过ssl连接到azure mysql数据库。

如果我关闭了ssl,我已经确认可以连接到数据库。所以设置是正确的。让我兴奋的是,我找不到的文件是如何通过ssl连接。我有一个sslkey - 我已经确认可以使用我的一个数据库管理程序连接到数据库 - 所以这些部分就在那里。

然而,Laravel似乎失败了。

这是我的数据库驱动程序:

'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', 'localhost'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'charset' => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix' => '',
            'strict' => false,
            'engine' => null,
            'sslmode' => env('DB_SSLMODE', 'prefer'),
            'options'   => array(
                            PDO::MYSQL_ATTR_SSL_KEY    => '\ssl\DatabaseCACert.pem'),
        ],

我错过了什么?数据库目前只是拒绝连接。 SQLSTATE[HY000] [2002]所以它很接近。

3 个答案:

答案 0 :(得分:1)

您需要提供文件的完整路径。如果它们在您的laravel应用程序文件夹中,那么您可以使用base_path方法生成完整的poth。您可能还需要定义cert和ca。

'options' => [
    PDO::MYSQL_ATTR_SSL_KEY => base_path('ssl/client-key.pem'),
    PDO::MYSQL_ATTR_SSL_CERT => base_path('ssl/client-cert.pem'),
    PDO::MYSQL_ATTR_SSL_CA => base_path('ssl/ca-cert.pem')
]

答案 1 :(得分:0)

确定。解决了这个问题。与microsoft一起打电话,注意到其中一个日志错误是:

PDO::__construct(): Peer certificate CN=`resourceregion-a.control.database.windows.net' did not match expected CN=`db.mysql.database.azure.com'

在@alexejenko指出的文档中的那一行,在那之后的位:

"如果您需要使用" - ssl-mode = VERIFY_IDENTITY",那么您可以ping您的服务器名称以解析区域服务器名称,例如westeurope1-a.control.database.windows.net,并使用解决此问题之前连接中的区域服务器名称。我们计划在将来取消此限制。"

原来这就是发生的事情。数据库连接路由到区域数据库,而不是我的。所以对于不完整的产品而言。

将DB_HOST更改为该区域后,它已成功连接(请注意:请确保已将您的ips列入白名单)。

答案 2 :(得分:0)

有时,当您没有远程访问数据库的权限时,也会显示相同的错误。

此处的示例:

  • Server1-app:123.123.123.12
  • Server2-数据库:456.456.456.45

因此,您可以尝试从Server1-app:

$ mysql -u youruser -h yourpassword;

并进入mysql终端,检查您是否能够访问数据库:

$ show databases;

如果显示了数据库,则您具有特权,并且一切正常,如果没有,则必须访问Server2-数据库并向用户授予特权。

一次进入Server2-数据库;

$ mysql -u root -p
$ GRANT ALL PRIVILEGES ON your_database.* TO 'youruser'@'123.123.123.12';
$ FLUSH PRIVILEGES;
$ exit;

希望会有所帮助;