为什么Lambda在初始化后生成相同的加密密钥以及如何修复它?

时间:2017-11-21 21:42:09

标签: java aws-lambda amazon-cloudfront jce

我从AWS Lambda生成密钥对时发现了一些奇怪的东西 - 每次运行代码时它都会生成相同的密钥。我知道Lambda容器在每次调用后都被冻结,这可能是为什么从内存加载底层JCE类并保持其初始状态的原因。有问题的代码相对简单:

KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA", "BC");
keyPairGen.initialize(2048);
KeyPair keyPair = keyPairGen.generateKeyPair();
RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();
RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();

return new RSAKey.Builder(rsaPublicKey).privateKey(rsaPrivateKey)
            .keyID(kid).keyUse(KeyUse.SIGNATURE)

我尝试过vanilla提供者和Bouncy Castle,但结果是相同的 - 当Lambda是"温暖"时,相同的密钥对。一旦容器终止并重新开始冷却"州,我得到一套新的不同的钥匙。

我也使用AWS Cognito,该服务通过API Gateway和CloudFront提供。

任何想法如何"刷新"基础JCE类?

1 个答案:

答案 0 :(得分:1)

要回答我自己的问题,罪魁祸首实际上是CloudFront。即使在API网关中关闭了API缓存,CloudFront仍会缓存某些API请求的响应。

如果有人遇到同样的问题,那么解决方案就是"胸围"通过将查询参数附加到请求URL来实现CloudFront缓存:

GET /api/generateKeyPair?timestamp=1507843759370