我如何在本地的node.js中通过SSL连接到运行在PlanetScale上的MySQL数据库服务器?

4

我正在尝试连接到PlanetScale上的MySQL服务器,但是由于需要SSL,所以无法连接。

这是他们的文档,但不清楚它在说什么。 https://planetscale.com/docs/concepts/secure-connections

这是连接URL:DATABASE_URL='mysql://co30rXXXXXXX:pscale_pw_XXXXXXX@hoqx01444p30.us-east-4.psdb.cloud/restaurant?ssl={"rejectUnauthorized":true}'

当我运行yarn run migration-run时,下面是终端中显示的内容:

yarn run v1.22.18 $ npx prisma migrate dev 从 .env 加载环境变量 从prisma/schema.prisma加载Prisma模式 数据源“db”: MySQL数据库“restaurant”位于“hoqx0XXXXX.us-east-4.psdb.cloud:3306”

Error: Migration engine error: unknown error: Code: UNAVAILABLE server does not allow insecure connections, client must use SSL/TLS

error Command failed with exit code 1. info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

有没有人尝试从本地主机上的Node.js连接到PlanetScale DB?我已经尝试了Stackoverflow上的一些其他建议,但好像不起作用。


1
你可能需要 sslcert=<PATH>设置根证书的路径 - RickN
1
@DreamBig 谢谢,它起作用了,但之后又出现了一个错误,错误:P1001无法连接到 ap-northeast.connect.psdb.cloud:3306 数据库服务器请确保您的数据库服务器在 ap-northeast.connect.psdb.cloud:3306 上运行。/// 当我在本地主机上运行时,一切都很好,只有在云端(GCP)运行时才会出现问题。 - dontknowhy
1
@nounlace 将本地环境中的 /etc/pki/tls/certs/ca-bundle.crt 替换为 /etc/ssl/certs/ca-certificates.crt 解决了问题。对我来说,此时的解决方案是在环境变量列表中拥有四个不同的 URL(两个使用 /etc/ssl/certs/ca-certificates.crt 用于本地环境,另外两个使用 /etc/pki/tls/certs/ca-bundle.crt 用于预览和生产环境)。您可以在此处阅读更多信息:https://github.com/prisma/prisma/issues/8875 希望能帮到您! - DreamBold
嗨@dreambold,你是如何为Planetscale数据库创建SSL证书的?之后还有其他错误吗? - Jriffs
应用程序是否具有带SSL的域名? - DreamBold
显示剩余4条评论
3个回答

6

?ssl={"rejectUnauthorized":false}&sslcert=/etc/ssl/certs/ca-certificates.crt

在连接链接末尾添加这些参数,问题已经解决。 :)


有人可以帮我解决如何创建 SSL 证书的问题吗? - Jriffs
你可以使用 letsencrypt(https://letsencrypt.org/getting-started/)来获取证书,或者你可以从你的域名注册商那里申请一个。 - DreamBold
对于运行Apache服务器的 Ubuntu,请访问https://certbot.eff.org/instructions?ws=apache&os=ubuntufocal。 - DreamBold

3

Windows 上的 SSL 问题

如果您正在使用 Windows 计算机并使用 .env 文件作为连接字符串,以下是我在本地运行时有效的解决方法(Windows 没有默认的 /etc/ssl/certs/ 引用 如此回答)。

您可以通过 PlanetScale 控制台上的 "概述" > "连接" 获取连接字符串。

它看起来应该像这样:

DATABASE_URL='mysql://xxxxxx:*****@aws-eu-west-1.connect.psdb.cloud/dbName?ssl={"rejectUnauthorized":true}'

当你直接使用这个时,很可能会得到以下错误信息(正如问题所述):

Code: UNAVAILABLE server does not allow insecure connections, client must use SSL/TLS

因此,您需要提供本地证书,可以从以下受信任的位置下载:

接下来,您需要将此文件保存到逻辑位置上,以便在连接字符串中进行引用,例如 c:/temp/cacert.pem

保存后,您可以将以下内容附加到连接字符串中:

&sslcert=C:\\temp\\cacert.pem

重新启动您的服务器,然后您就可以开始了!

NodeJs中等效的SSL证书更新如下:

const connection = mysql.createConnection({
    host: 'hostNameHere',
    user: 'userNameHere',
    password: 'passwordHere',
    database: 'dbHere',
    ssl: {
        ca: fs.readFileSync('C:\\temp\\cacert.pem')
    }
});

1
@Jean-François Fabre - 在删除之前请更加关注答案的具体细节!原始的得到赞同的答案并不能解决Windows用户的问题。 - Matt D. Webb

0
这对我有用:
?ssl={"rejectUnauthorized":false}&sslaccept=strict

1
您的回答可以通过提供额外的支持信息来改善。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认您的答案是否正确。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接