【问题标题】:How to connect to database with SSL in google apps script?如何在谷歌应用程序脚本中使用 SSL 连接到数据库?
【发布时间】:2017-06-13 17:43:46
【问题描述】:

我正在尝试通过 Google Apps 脚本中的 SSL 连接到数据库,引用这些 docs。错误是:

Execution failed: Failed to establish a database connection. Check connection string, username and password.

我可以从另一个数据库客户端 (Sequel Pro) 使用这些完全相同的参数,并且效果很好。我已经让数据库接受来自任何 IP 地址 (0.0.0.0/0) 的连接。

我相信我已经消除了所有其他变量(用户名、密码等),只有当我尝试在 Apps 脚本中使用 SSL 时它才会失败。

谁能提供一个在 Google Apps 脚本中使用 SSL 连接到 MySQL 数据库的工作示例?

我的应用脚本:

function connectDb() {
  var address = 'x.x.x.x';  // no, I'm not literally using x's in my ip address

  var instanceUrl = 'jdbc:mysql://' + address + ':3306/';

  var clientSslKey = '-----BEGIN RSA PRIVATE KEY-----\n' +
    'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n' +
    /* snip */
    '-----END RSA PRIVATE KEY-----';

  var clientSslCertificate = '-----BEGIN CERTIFICATE-----\n' +
    'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n' +
    /* snip */
    '-----END CERTIFICATE-----';

  var serverSslCertificate = '-----BEGIN CERTIFICATE-----\n' +
    'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n' +
    /* snip */
    '-----END CERTIFICATE-----';

  // https://developers.google.com/apps-script/reference/jdbc/jdbc#getconnectionurl-info
  var connParams = {
    user: 'temp',
    // no password set
    _serverSslCertificate: serverSslCertificate,
    _clientSslCertificate: clientSslCertificate,
    _clientSslKey: clientSslKey,
  };
  var conn = Jdbc.getConnection(instanceUrl, connParams);
}

编辑

我提交了一个错误here,它被标记为与this other one 重复,它是“P2”优先级。也许这意味着它很快就会修复?

【问题讨论】:

  • 只包含url、用户名和密码(不包括sslkeys之类的高级参数)是否有效?
  • 是的,这样就可以了。但很明显,连接没有使用 SSL。
  • 您是否尝试过 UrlFetchApp 来查看 SSL 问题是否是您的证书/密钥? developers.google.com/apps-script/reference/url-fetch/…
  • 你不需要在 jdbc url 中指定数据库名称吗?我一般做jdbc:mysql://<server:port>/<my-db>?useSSL=[true|false]
  • 否,指定要使用的数据库对于所有连接都是可选的。

标签: ssl jdbc google-apps-script


【解决方案1】:

我可以确认我可以在 Google Apps 脚本中使用 SSL 连接到 MySQL 数据库。

需要注意的是 useSSL=true 确实是必要的

按照https://issuetracker.google.com/issues/36761592#comment18 的示例,我能够让它工作(相关的sn-p 在下面重复):

var conn = Jdbc.getConnection('jdbc:mysql://<ip address>/<db name>?useSSL=true', { 
  user: '<user>', 
  password: '<pass>', 
  _serverSslCertificate: '-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----', 
  _clientSslCertificate: '-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----', 
  _clientSslKey: '-----BEGIN RSA PRIVATE KEY-----\n...\n-----END RSA PRIVATE KEY-----' 
});

如果您使用的是 Google Cloud SQL 实例,您可能需要考虑使用 getCloudSqlConnection()。大概它也被加密了(基于当相应实例启用“仅允许安全连接连接到此实例”时我确实可以获得连接的事实。),并且重要的是,不需要您管理(即不要失去对密钥和证书的控制。

【讨论】:

  • 快乐!我错过了useSSL=true。 @Richeek 的道具,他很久以前在 cmets 中提到过这个,但我错过了。
  • 这似乎是 MySQL 的一个特性。找到docs here
猜你喜欢
  • 1970-01-01
  • 2019-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-16
  • 1970-01-01
相关资源
最近更新 更多