NodeJS(ExpressJS、Sequelizeを使用)をAzure AppServicesにデプロイしました。データベース接続のない単純なAPIは機能しますが、Azure MySQLデータベースからデータをロードするアプリの部分を使用すると、証明書に問題が発生します。AppServiceログストリームから次のログメッセージを受け取ります。
Unhandled rejection SequelizeConnectionError: unable to get local issuer certificate
ファイアウォールを有効にして証明書(BaltimoreCyberTrustRoot.crt.pem)を使用する方法については、ここからの手順に従いました。
同じ手順を使用して、ラップトップから、次のCLIを使用してリモートのAzureMySQLデータベースに接続できます。
$ mysql -h <my-db>.mysql.database.azure.com -u <my-user> --ssl-mode=REQUIRED --ssl-ca=.\BaltimoreCyberTrustRoot.crt.pem -p
私はこれに関連する他のStackOverflow / Githubの質問に従い、次のような構成に従いました。
const mysql = require('mysql2');
...
var sequelize = new Sequelize(config.db, config.username, config.password, {
host: "<my-db>.mysql.database.azure.com",
port: 3306,
dialect: 'mysql',
dialectOptions: {
ssl: {
ca: fs.readFileSync(__dirname + "/ssl/BaltimoreCyberTrustRoot.crt.pem")
}
}
});
下に追加のキー/証明書を設定する必要がありssl
ますか?
ssl: {
key: fs.readFileSync(__dirname + "./certs/client-key.pem"),
cert: fs.readFileSync(__dirname + "./certs/client-cert.pem"),
ca: fs.readFileSync(__dirname + "/ssl/BaltimoreCyberTrustRoot.crt.pem")
}
ノード12(Azure App Serviceのノード12.13)を使用していますが、package.json
依存関係は次のとおりです。
"dependencies": {
"body-parser": "^1.19.0",
"express": "^4.17.1",
"faker": "^4.1.0",
"mysql2": "^2.1.0",
"sequelize": "^5.21.5"
}
私のテストによると、mysqlに接続できます。キー/証明書を追加するかどうかを指定できます。
追加すると、以下のような私のコードを見ることができます、
/*configuration*/
const sequelizeInstance = new Sequelize("***db", "azure_root@***mysql", "Ja***.****20", {
host: "***mysql.mysql.database.azure.com",
dialect: 'mysql',
dialectOptions: {
ssl: {
ca: fs.readFileSync(path.resolve(__dirname, 'BaltimoreCyberTrustRoot.crt.pem'));
}
}
});
/*test connection*/
try
{
sequelizeInstance.authenticate();
console.log('Connection has been established successfully.');
}
catch (error) {
console.error('Unable to connect to the database:', error);
}
そうでない場合は、ドキュメントのssl=true
ように設定します。
それがあなたに役立つことを願っています。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加