node.js - AWS Lambda - 错误 : unable to get local issuer certificate

标签 node.js postgresql amazon-web-services aws-lambda amazon-rds

我正在尝试使用 NodeJS lambda 连接到 amazon postgreSQL RDS。

lambda 与 RDS 实例位于同一 VPC 中,据我所知,安全组已设置为授予 lambda 对 RDS 的访问权限。 lambda 通过 API 网关调用,我使用 knex js 作为查询构建器。当 lambda 尝试连接到数据库时,它会抛出“无法获取本地颁发者证书”错误,但连接参数符合我的预期。

我知道这种连接是可行的,因为我已经在不同的环境中实现了它,但没有收到证书问题。我比较了这两种环境,但找不到任何直接的区别。

连接代码如下所示:

import AWS from 'aws-sdk';
import { types } from 'pg';
import { Moment } from 'moment';
import knex from 'knex';

const TIMESTAMP_OID = 1114;
// Example value string: "2018-10-04 12:30:21.199"
types.setTypeParser(TIMESTAMP_OID, (value) => value && new Date(`${value}+00`));

export default class Database {
  /**
   * Gets the connection information through AWS Secrets Manager
   */
  static getConnection = async () => {
    const client = new AWS.SecretsManager({
      region: '<region>',
    });

    if (process.env.databaseSecret == null) {
      throw 'Database secret not defined';
    }

    const response = await client
      .getSecretValue({ SecretId: process.env.databaseSecret })
      .promise();

    if (response.SecretString == undefined) {
      throw 'Cannot find secret string';
    }

    return JSON.parse(response.SecretString);
  };

  static knexConnection = knex({
    client: 'postgres',
    connection: async () => {
      const secret = await Database.getConnection();

      return {
        host: secret.host,
        port: secret.port,
        user: secret.username,
        password: secret.password,
        database: secret.dbname,
        ssl: true,
      };
    },
});
}

任何关于如何解决这个问题甚至从哪里开始寻找的指导都将不胜感激。

最佳答案

首先,绕过 ssl 验证不是一个好主意,这样做会使您容易受到各种攻击并跳过 TLS 握手中的关键步骤。

您可以做的是以编程方式从 Amazon 下载 ca 证书链包,并将其与处理程序一起放在 lambda 的根目录中。

wget https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem -P path/to/handler

注意:您可以在 buildspec.yaml 或打包上传到 aws 的 zip 文件的脚本中执行此操作

然后在代码 postgres 客户端配置中将 ssl 配置选项设置为 pem 文件的内容,如下所示:

let pgClient = new postgres.Client({
  user: 'postgres',
  host: 'rds-cluster.cluster-abc.us-west-2.rds.amazonaws.com',
  database: 'mydatabase',
  password: 'postgres',
  port: 5432,
  ssl: {
   ca: fs.readFileSync(path.resolve('rds-combined-ca-bundle.pem'), "utf-8")
  }
})

关于node.js - AWS Lambda - 错误 : unable to get local issuer certificate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62116314/

相关文章:

python - 将 aws 后端连接到 firebase 数据库

linux - 将 ssh key 添加到 ssh-agent 失败 w/running agent,设置环境变量

node.js - karma 测试通过,但 npm 测试给出错误

node.js - cookie node.js express

PostgreSQL 存储 ID 列表的有效方法

python - 如何在django查询中获取每个人最近添加的记录

PostgreSQL 用户组和权限

amazon-web-services - AWS CloudFormation : Provide an attribute itself (not the value! ) 有条件

javascript - 我如何计算各种字符的终端列宽?

node.js - 如何在 Jade 中每三次迭代插入新的 tr