AWS - Amazon / Technology · 2021年1月19日

如何正确地部署AWS证书?

我这个博客的证书要过期了,因此我在阿里云上又申请了DV证书。免费的版本是不支持通配符的(*.daylights.cn),所以还是得一个一个Domain一张一张地去申请。

拿我这个网站举例,我申请了一张www.daylights.cn的证书,又申请了一张www.kevin-wang.com的证书。

在申请这两张证书的同时,我突然想去尝试一下AWS的证书。登陆ACM后发现申请public的证书是免费的,包括可以通配符证书。

不过限制也是有的,只能用在AWS的服务上。

那么哪些服务可以用上证书呢?

简单的回答是CloudFront和ALB。当然证书可以被用在多个地方,但是首先要理解AWS自己是认为自己内部网络是足够安全的,因此它们给出的建议是解析到ALB之后的流量就都HTTP了。其实也是合理的,因为加密解密都是耗费资源的(比如它们推荐用CloudHSM单独来处理key和加密解密),所以内部作为“计算”的单元们,就专注在计算即可。

OK,那我们就来想这个场景(不用通配符证书的场景)。如果你的网站是www.daylights.cn,那么你需要申请几本证书并且如何应用它们呢?

首先我们看一下CloudFront和ALB那里怎么配置。

第一种,CloudFront绑定的Hostname是www.daylights.cn,然后SSL证书用www.daylights.cn的。然后ALB的hostname也用www.daylights.cn,SSL证书用www.daylights.cn。

这种一眼就知道不合理。由于你ALB那里用的hostname是www.daylights.cn,因此在CloudFront那边的Origin就是www.daylights.cn。CloudFront在发给这个Origin的时候,发现是hostname其实是自己,于是这里出现一个loop。

因此,CloudFront的Origin必须和自己的Hostname不一样,也就是说,ALB的Hostname必须和CloudFront的Hostname不一样。

OK,那么如果CloudFront绑定的Hostname是www.daylights.cn,然后SSL证书用www.daylights.cn的,Origin是www.kevin-wang.com。然后ALB的Hostname是www.kevin-wang.com,然后证书用www.kevin-wang.com怎么样?

答案是可行的。相当于各干各的。

但是这里用了两本证书 – 有没有办法只用一本证书?

我们试试,这次让CloudFront不变,即CloudFront绑定的Hostname是www.daylights.cn,然后SSL证书用www.daylights.cn的,Origin是www.kevin-wang.com。由于只用一本证书,因此ALB绑定的SSL证书必须是www.daylights.cn,但ALB的Hostname是www.kevin-wang.com – 这本证书不适用于这个Hostname啊!

怎么办?必须改。这里就用到了传说中的Lambda@Edge。

Lambda@Edge的出现,就是在最Edge的地方,即CloudFront那里,开始介入一些修改、操作或者验证。在这里,我们在CloudFront发送包给ALB的时候,将包里的Hostname修改成www.daylights.cn。这样ALB还是可以正常收到包的(因为解析Origin的时候还是找到ALB),但根据Hostname查询证书时,包里看到的是www.daylights.cn,不是www.kevin-wang.com。

少申请一本证书,代价就是多调用一步操作。

不过这个Case只是Case啦,算是特殊需求。因为本身ACM申请通配符的证书,是免费的哦。