mysql - შესაძლებელია TypeORM-ით დაკავშირება SQL GCloud-ის ინსტანციასთან SSL-ით?


ვცდილობ შევქმნა SSL კავშირი SQL ეგზემპლართან google cloud-ში. მე ვიყენებ node.js, typescript და typeorm როგორც orm.

მინდა ეს გავაკეთო ormconfig.json-ის გამოყენებით. ოფიციალური დოკუმენტაცია ამბობს, რომ ეს შესაძლებელია, მაგრამ მას მხოლოდ ერთი პარამეტრი (CA ფაილი) გამოიყენება. მე მსურს გამოვიყენო 3 SSL ფაილი: server-ca.pem, client-cert.pem და client-key.pem.

მოვახერხებ დაკავშირებას შემდეგი mysql ბრძანებით:

"mysql -uroot -p -h 35.225.71.53 --ssl-ca=server-ca.pem --ssl-cert=client-cert.pem  --ssl-key=client-key.pem"

ვცადე ამ ormconfig.json-ით, მაგრამ არ მუშაობდა:

{
   "type": "mysql",
   "host": "IP",
   "port": 3306,
   "username": "user",
   "password": "password",
   "database": "database",
   "ssl": {
      "ca": "path/to/server-ca.pem",
      "cert": "path/to/server-cert.pem",
      "key": "path/to/erver-key.pem"
   }
...
}

და სხვა კომბინაციები.

შეცდომა, რომელიც მე მივიღე როცა ვასრულებ ბრძანებას (მაგალითად: typeorm migration:run) არის:

typeorm migrations:run
Error during migration run:
{ Error: error:0906D06C:PEM routines:PEM_read_bio:no start line
    at Object.createSecureContext (_tls_common.js:104:17)
    at createSecureContext (C:\Users\Lucas\Desktop\koa\cloudfunctions\functions\node_modules\mysql\lib\Connection.js:466:19)
    at PoolConnection._startTLS (C:\Users\Lucas\Desktop\koa\cloudfunctions\functions\node_modules\mysql\lib\Connection.js:282:5)
    at Handshake.<anonymous> (C:\Users\Lucas\Desktop\koa\cloudfunctions\functions\node_modules\mysql\lib\protocol\Protocol.js:172:24)
    at emitNone (events.js:106:13)
    at Handshake.emit (events.js:208:7)
    at Handshake.HandshakeInitializationPacket (C:\Users\Lucas\Desktop\koa\cloudfunctions\functions\node_modules\mysql\lib\protocol\sequences\Handshake.js:78:10)
    at Protocol._parsePacket (C:\Users\Lucas\Desktop\koa\cloudfunctions\functions\node_modules\mysql\lib\protocol\Protocol.js:291:23)
    at Parser._parsePacket (C:\Users\Lucas\Desktop\koa\cloudfunctions\functions\node_modules\mysql\lib\protocol\Parser.js:433:10)
    at Parser.write (C:\Users\Lucas\Desktop\koa\cloudfunctions\functions\node_modules\mysql\lib\protocol\Parser.js:43:10)
    --------------------
    at Protocol._enqueue (C:\Users\Lucas\Desktop\koa\cloudfunctions\functions\node_modules\mysql\lib\protocol\Protocol.js:144:48)
    at Protocol.handshake (C:\Users\Lucas\Desktop\koa\cloudfunctions\functions\node_modules\mysql\lib\protocol\Protocol.js:51:23)
    at PoolConnection.connect (C:\Users\Lucas\Desktop\koa\cloudfunctions\functions\node_modules\mysql\lib\Connection.js:119:18)
    at Pool.getConnection (C:\Users\Lucas\Desktop\koa\cloudfunctions\functions\node_modules\mysql\lib\Pool.js:48:16)
    at C:\Users\Lucas\AppData\Roaming\npm\node_modules\typeorm\driver\mysql\MysqlDriver.js:764:18
    at new Promise (<anonymous>)
    at MysqlDriver.createPool (C:\Users\Lucas\AppData\Roaming\npm\node_modules\typeorm\driver\mysql\MysqlDriver.js:761:16)
    at MysqlDriver.<anonymous> (C:\Users\Lucas\AppData\Roaming\npm\node_modules\typeorm\driver\mysql\MysqlDriver.js:274:51)
    at step (C:\Users\Lucas\AppData\Roaming\npm\node_modules\typeorm\node_modules\tslib\tslib.js:133:27)
    at Object.next (C:\Users\Lucas\AppData\Roaming\npm\node_modules\typeorm\node_modules\tslib\tslib.js:114:57) code: 'HANDSHAKE_SSL_ERROR', fatal: true }

C:\Users\Lucas\Desktop\koa\cloudfunctions\functions>

უპასუხე #1

TypeORM-ის დოკუმენტაციაში SSL პარამეტრების შესახებ ისინი აღნიშნავენ:

გაითვალისწინეთ, რომ არგუმენტები ელიან სერთიფიკატის სტრიქონს, არა სერთიფიკატის ფაილის სახელს.

ამიტომ თქვენ უნდა ატვირთოთ ფაილები Google Cloud SQL ინსტანციასთან დაკავშირებისათვის, ნაცვლად მხოლოდ გზის მითითებისა:

const fs = require("fs");

{
   "type": "mysql",
   "host": "IP",
   "port": 3306,
   "username": "user",
   "password": "password",
   "database": "database",
   "ssl": {
     "ca": fs.readFileSync(__dirname + '/server-ca.pem'),
     "cert": fs.readFileSync(__dirname + '/client-cert.pem'),
     "key": fs.readFileSync(__dirname + '/client-key.pem'),
   }
...
}

პასუხი #2

MySql-თან მუშაობისთვის SSL-ში TypeORM-თან 2021 წელს, თქვენ უნდა დააინსტალიროთ mysql2 და არა mysql.

npm install mysql  // Isn't correct

npm install mysql2  // Is correct