我从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类?
答案 0 :(得分:1)
要回答我自己的问题,罪魁祸首实际上是CloudFront。即使在API网关中关闭了API缓存,CloudFront仍会缓存某些API请求的响应。
如果有人遇到同样的问题,那么解决方案就是"胸围"通过将查询参数附加到请求URL来实现CloudFront缓存:
GET /api/generateKeyPair?timestamp=1507843759370