如何在@aws-crypto/client-node中配置代理及解决凭证缺失错误
我来帮你逐个解决这两个问题:
@aws-crypto/client-node 底层依赖 AWS SDK for JavaScript,所以代理配置逻辑和AWS SDK完全一致,这里有两种常用实现方式:
全局环境变量配置(简单快捷):
如果你希望所有AWS相关请求都走代理,可以直接设置系统环境变量:HTTP_PROXY=http://your-proxy-host:port HTTPS_PROXY=http://your-proxy-host:port NO_PROXY=localhost,127.0.0.1 # 可选,指定不需要走代理的地址配置后,所有基于AWS SDK的请求都会自动使用这个代理。
自定义KMS客户端配置(精准控制):
如果你只想让加密客户端的请求走代理,可以手动创建带代理配置的KMS客户端,再传给KmsKeyringNode:const { KmsKeyringNode, encrypt, decrypt } = require("@aws-crypto/client-node"); const { KMSClient } = require("@aws-sdk/client-kms"); const { NodeHttpHandler } = require("@aws-sdk/node-http-handler"); const http = require("http"); const https = require("https"); // 创建带代理的HTTP/HTTPS处理器 const httpHandler = new NodeHttpHandler({ httpAgent: new http.Agent({ proxy: "http://your-proxy-host:port", keepAlive: true }), httpsAgent: new https.Agent({ proxy: "http://your-proxy-host:port", keepAlive: true }) }); // 初始化带代理的KMS客户端 const kmsClient = new KMSClient({ region: "us-east-1", // 替换为你的KMS密钥所在区域 requestHandler: httpHandler }); // 使用自定义KMS客户端创建密钥环 const keyring = new KmsKeyringNode({ client: kmsClient, generatorKeyId: "arn:aws:kms:us-east-1:your-account-id:key/your-key-id" // 替换为你的KMS密钥ARN或ID });注意:如果还没安装依赖,需要先执行:
npm install @aws-sdk/client-kms @aws-sdk/node-http-handler
这个错误说明AWS SDK找不到访问KMS服务的合法凭证,你可以根据运行环境选择以下配置方式:
环境变量配置(适合测试/临时场景):
在终端或系统环境中设置以下变量:export AWS_ACCESS_KEY_ID=your-access-key-id export AWS_SECRET_ACCESS_KEY=your-secret-access-key重启终端后,SDK会自动读取这些凭证。
本地凭证文件(推荐开发/生产环境):
在用户目录下创建.aws/credentials文件(Windows路径为C:\Users\你的用户名\.aws\credentials),内容格式如下:[default] aws_access_key_id = your-access-key-id aws_secret_access_key = your-secret-access-key同时确保代码中指定了正确的AWS区域,SDK会自动加载这个文件的凭证。
代码中直接传入凭证(不推荐生产):
仅用于快速测试,不建议在生产环境硬编码凭证:const kmsClient = new KMSClient({ region: "us-east-1", credentials: { accessKeyId: "your-access-key-id", secretAccessKey: "your-secret-access-key" } });IAM角色(AWS服务环境专属):
如果你的代码运行在EC2、EKS、Lambda等AWS服务上,可以给资源绑定具有KMS访问权限的IAM角色,SDK会自动获取角色临时凭证,无需手动配置。
另外,别忘了确保你的IAM用户/角色拥有kms:GenerateDataKey(加密)和kms:Decrypt(解密)的权限,否则即使凭证正确,也会出现权限错误。
最后给你补全后的完整示例代码:
const { KmsKeyringNode, encrypt, decrypt } = require("@aws-crypto/client-node"); const { KMSClient } = require("@aws-sdk/client-kms"); // 初始化KMS客户端(可根据需要添加代理、凭证配置) const kmsClient = new KMSClient({ region: "us-east-1" }); const keyring = new KmsKeyringNode({ client: kmsClient, generatorKeyId: "arn:aws:kms:us-east-1:your-account-id:key/your-key-id" }); const encryptData = async (plainText, context) => { try { const { result } = await encrypt(keyring, plainText, { encryptionContext: context }); return result; } catch (e) { console.error("加密操作失败:", e); throw e; // 建议抛出错误让上层处理,而非仅打印 } }; // 调用加密函数 encryptData('hello world', { stage: "test", purpose: "poc", origin: "us-east-1" }) .then(encryptedBuffer => console.log("加密完成,结果(Buffer):", encryptedBuffer)) .catch(err => console.error("流程执行失败:", err));
内容的提问来源于stack exchange,提问作者Dharmendra Singh

