如何管理要在 AWS Lambda 中使用的双向 TLS 的客户端证书
How to manage client certificates for mutual TLS to be used within AWS Lambda
我们的团队正在使用 AWS Lambda 函数和 API 网关来促进与欧洲 API 开放银行业务的连接。 (PSD2).
我们的 Lambda 是用 NodeJS 编写的。
PSD2 需要双向 TLS,这很好,我们已正确实施所有内容并在沙盒环境中工作。
示例请求如下所示:
{
hostname: '[bank hostname]',
path: '[bank api endpoint]',
method: 'GET',
headers: {
accept: 'application/json',
signature: 'XXX',
date: 'XXX',
digest: 'XXX',
'x-request-id': 'XXX',
'tpp-signature-certificate': '[PATH_TO_CERTIFICATE]',
authorization: 'Bearer [accessToken]',
},
cert: fs.readFileSync('/var/task/certs/cert.crt'), // Buffer
key: fs.readFileSync('/var/task/certs/private.key'), // Buffer
}
我们目前遇到的问题是我们不确定在哪里安全地存储我们的证书。目前,我们只是将它们存储在我们代码库的资产文件夹中,这并不理想,出于显而易见的原因,我们希望将它们移出我们的代码库。
我们一直在关注 AWS ACM。但是,尚不清楚我们如何检索证书的路径(在上传证书后)以便在上面的请求中使用它。
所以我的问题是 我们如何使用 AWS 以我们可以在 HTTPS 请求中使用它们的方式安全地存储我们的证书?
您无法从 ACM 检索证书,事实上,这些证书仅附加到 AWS 资源,例如 CloudFront、ELB 和 API 网关。
要检索内容,有几个解决方案。
首先是将其存储在 credential/secrets 存储中,AWS 在 secrets manager service. Additionally you can store a SecureString in the systems manager parameter store.
中提供此功能
或者您可以使用第三方解决方案,例如 HashiCorp Vault。
使用这种方法,如果您需要文件存在于磁盘上,您需要将输出存储在 tmp 文件存储中。
如果这些方法对您不起作用,您可以使用 AWS EFS. A recent addition 添加了支持以允许 Lambdas 将 NFS 装载附加到共享存储。
我认为您最终会寻找像 AWS KMS or CloudHSM 这样的解决方案,它可以让您安全地存储私钥并执行加密功能,而不是泄露密钥以供“外部使用”。这是最安全的方式,因为即使您看不到密钥(尽管 CloudHSM 实际上允许 upload/download 个密钥)。
作为 Node.js TLS module is based on OpenSSL and CloudHSM comes with ready-made openssl engine,您将能够将其用于双向 TLS。为此,将使用 tls.createSecureContext
的选项 privateKeyEngine
、privateKeyIdentifier
、publicKeyEngine
和 publicKeyIdentifier
。
对于 AWS KMS(这是一种更具成本效益的解决方案),open source openssl engine written in Rust。
也就是说,我不确定您是否能够在 Lambda 中使用自定义 openssl 引擎,或者 CloudHSM 引擎是否包含在 Lambda 的 Node.js 环境中(这很合乎逻辑)。因此,您也可以选择将相互 TLS 连接“卸载”到 Lambda 外部的“微服务”运行。我们采用这种方式并使用安全存储的私钥实现了一个非常简单的代理“代理”mTLS 调用。
我们的团队正在使用 AWS Lambda 函数和 API 网关来促进与欧洲 API 开放银行业务的连接。 (PSD2).
我们的 Lambda 是用 NodeJS 编写的。
PSD2 需要双向 TLS,这很好,我们已正确实施所有内容并在沙盒环境中工作。
示例请求如下所示:
{
hostname: '[bank hostname]',
path: '[bank api endpoint]',
method: 'GET',
headers: {
accept: 'application/json',
signature: 'XXX',
date: 'XXX',
digest: 'XXX',
'x-request-id': 'XXX',
'tpp-signature-certificate': '[PATH_TO_CERTIFICATE]',
authorization: 'Bearer [accessToken]',
},
cert: fs.readFileSync('/var/task/certs/cert.crt'), // Buffer
key: fs.readFileSync('/var/task/certs/private.key'), // Buffer
}
我们目前遇到的问题是我们不确定在哪里安全地存储我们的证书。目前,我们只是将它们存储在我们代码库的资产文件夹中,这并不理想,出于显而易见的原因,我们希望将它们移出我们的代码库。
我们一直在关注 AWS ACM。但是,尚不清楚我们如何检索证书的路径(在上传证书后)以便在上面的请求中使用它。
所以我的问题是 我们如何使用 AWS 以我们可以在 HTTPS 请求中使用它们的方式安全地存储我们的证书?
您无法从 ACM 检索证书,事实上,这些证书仅附加到 AWS 资源,例如 CloudFront、ELB 和 API 网关。
要检索内容,有几个解决方案。
首先是将其存储在 credential/secrets 存储中,AWS 在 secrets manager service. Additionally you can store a SecureString in the systems manager parameter store.
中提供此功能或者您可以使用第三方解决方案,例如 HashiCorp Vault。
使用这种方法,如果您需要文件存在于磁盘上,您需要将输出存储在 tmp 文件存储中。
如果这些方法对您不起作用,您可以使用 AWS EFS. A recent addition 添加了支持以允许 Lambdas 将 NFS 装载附加到共享存储。
我认为您最终会寻找像 AWS KMS or CloudHSM 这样的解决方案,它可以让您安全地存储私钥并执行加密功能,而不是泄露密钥以供“外部使用”。这是最安全的方式,因为即使您看不到密钥(尽管 CloudHSM 实际上允许 upload/download 个密钥)。
作为 Node.js TLS module is based on OpenSSL and CloudHSM comes with ready-made openssl engine,您将能够将其用于双向 TLS。为此,将使用 tls.createSecureContext
的选项 privateKeyEngine
、privateKeyIdentifier
、publicKeyEngine
和 publicKeyIdentifier
。
对于 AWS KMS(这是一种更具成本效益的解决方案),open source openssl engine written in Rust。
也就是说,我不确定您是否能够在 Lambda 中使用自定义 openssl 引擎,或者 CloudHSM 引擎是否包含在 Lambda 的 Node.js 环境中(这很合乎逻辑)。因此,您也可以选择将相互 TLS 连接“卸载”到 Lambda 外部的“微服务”运行。我们采用这种方式并使用安全存储的私钥实现了一个非常简单的代理“代理”mTLS 调用。