我在关于证书/公钥固定的 OWASP 备忘单中读到“Google 会轮换其证书……大约每月一次……[但] 基础公钥……保持静态”。
增加密钥轮换的频率对我来说是有意义的,因为如果密钥在没有被发现的情况下被泄露,持续损坏的时间框架就会减少。
如此频繁地轮换证书有什么好处?是否允许他们使用 SHA1(用于旧浏览器兼容性)同时限制对手查找匹配签名的范围?还是我还缺少其他东西?
我在关于证书/公钥固定的 OWASP 备忘单中读到“Google 会轮换其证书……大约每月一次……[但] 基础公钥……保持静态”。
增加密钥轮换的频率对我来说是有意义的,因为如果密钥在没有被发现的情况下被泄露,持续损坏的时间框架就会减少。
如此频繁地轮换证书有什么好处?是否允许他们使用 SHA1(用于旧浏览器兼容性)同时限制对手查找匹配签名的范围?还是我还缺少其他东西?
一大优势是在发生妥协时无需撤销。
执行此操作的“典型”方式是发布证书吊销列表 (CRL)或使用OSCP 协议以防万一吊销证书。但是,CRL 或 OSCP 检查非常容易绕过。能够执行 MITM 攻击的攻击者可以简单地阻止客户端与托管 CRL 的服务器通信,并且客户端将简单地愉快地开展其业务。这是必要的,因为在常见情况下,例如通过 HTTPS 工作的强制门户但会阻止所有其他流量,包括到 CRL 服务器的流量。
短期证书的优势在于,一旦发生泄露,泄露的证书只能在非常有限的时间内工作,直到证书过期,从而限制了可能造成的损害。
如果需要进一步阅读,Adam Langley 已就该主题撰写了大量文章。
Terry Chia 回答了“如此频繁地轮换证书有什么好处?”的问题。完全正确,所以我没有什么要补充的。
但是,我想补充一点,谷歌也经常更改他们的公钥,所以备忘单的假设是无效的。这确实增加了很多混乱,并且可能是原始问题的部分原因。
仅来自我个人的 x509 档案:
$ openssl x509 -in google-oct.pem -noout -subject -dates -modulus
subject= /C=US/ST=California/L=Mountain View/O=Google Inc/CN=www.google.com
notBefore=Sep 24 10:48:54 2014 GMT
notAfter=Dec 23 00:00:00 2014 GMT
Modulus=AF384ED52C86FBDCD4F3117AD63652874889E442C80B4B112B3AEFA978607B33758927E75F92838D1A42B19F1DB59BC55322068FB197D38BBCB68984CAB4F0328E10A1B0D98DA794AAA379AB7C3CAFF177663127EC5069872F801E925AEDB76C865209A00A55618A2D1BB91F368D5739A1DE88C9FE66F5E0108C1FF1025D62DEE3BFBFB9BCFD3E71EC9C6E91A05AECD9833AE32B89B432DCD4C489D69C2BEC7E325C621184A8E8658CD3B755E62E65E19A2649ADC668E5C2705280884FC5D3B9D5914AC27D22B050F819233A0DDFF4194F55BDE358AABA6376567087BA69407B17EA364DB3A842A1972199B9B5632088F0E1C45B50DD1AD123F49573094051F3
$ openssl x509 -in google-nov.pem -noout -subject -dates -modulus
subject= /C=US/ST=California/L=Mountain View/O=Google Inc/CN=www.google.com
notBefore=Oct 22 12:57:51 2014 GMT
notAfter=Jan 20 00:00:00 2015 GMT
Modulus=C15236913979042DF078DF5B73AF463A636F98CE32A2AABAC378180566A87C382BB3A82A6808D4103D626A37CA4FBF8ABEA5939DD6C9874A8D318593F5481F59756E76817CBD38B73A5C703438BB9A824FD054B168ED3C9E5CD0445F744ED2A4EAA6327A94813A98C941BD60F3B19C5DC8CDFB34DE9293C53D41A234B4499A4F19C6AF193084F61C6636D7E89AEA86110231E6EE03F4C853841B0FB46122E6D73E7EF08D058665C7297B1A329F16F0EEB856E7614EB16B23CB4B6BBC5B567685F02638B52ECEBC71B06A1503776C0945A75E3227F71FE2956FC48533A6529066C840433A6705E94523843D10C45A8BC9CD58FCA6A6AABD79F2FFFEE6CB254AB9
[...]
$ openssl x509 -in google-apr.pem -noout -subject -dates -modulus
Modulus=924D62DDCD6B012D33F6CF12A5FD6291B490867ABB1E4F7F356FA8BBD424400C283EE7BB14DA8D1268239814A490F7D88EBA5EA3A9ED8DFEE6B6FF841405A964D47B1F76DB6F39A6990FD024060248FA889580271D6DDA6A7ADEB1538425268FAA8C2D824865DA3F30F78D48887D4C90D86F0A8A95F0A9CC951B7562FC98EC91D132C1C9418182045652BF510D357F1792201126DF230CD76BCA58B367A30088E6606FE7B80265582BD9A235F36AC60A2A6C266775979B52501355C51C7927ABA5DD0FFAFA39DFA240B3F21826188A9818B5E9761D38E15ACA980EF12BA14BEE00CA3D8C7F66112B56CEDCE2CA8BE67DD8ACA8B594D906CAE752217F67419E59
实际的密钥是完全不同的,从安全的角度来看这很好。
假设给定足够的时间和资源,例如可以尝试暴力计算私钥以匹配已知公钥。或者像 heartbleed 这样的事情确实又发生了一次,导致私钥泄露。缓解这两种威胁的一种简单方法是定期更改密钥。
据我观察,谷歌的证书有效期为三个月,但每月更换一次。从操作的角度来看,这很好:您不希望在同一秒内重新加载新证书,但可能会开始在 1% 的受影响服务器上部署新证书并增加到整个服务器群。如果出现问题,您仍然可以恢复到旧的、仍然有效的证书,并有最多两个月的时间来修复新证书、服务器配置、服务器软件或任何导致与新证书(损坏)相关的问题证书。
根据Ayrx 的回答,Steve Sether 指出:
我同意史蒂夫的观点。那么换新证书有什么用呢?
这里的症结不是更改为新证书,而是旧证书的有限有效期或到期。如果未检测到私钥泄露(上面的#2),那么这个过期将无济于事 - 但是,如果我们知道泄露(通常是这种情况),我们可以尝试撤销证书(由 Ayrx 提到) -无论撤销是否独立,我们都知道我们必须使用新的私钥。我们旧证书的到期意味着我们的私钥也将同时“到期”,因为它们是一对密钥。
刷新证书可能有助于减轻其他攻击,但我认为上述用例是一个突出的用例。