使用 *.appspot.com 进行 SSL 固定:我怎么知道 Google 何时会更改他们的公钥



我有一个iOS应用程序即将在App Store中上线,该应用程序使用Google App Engine作为其服务器后端。捆绑在应用程序二进制文件中的是 *.appspot.com。通配符证书,允许我要求使用捆绑证书的公钥对任何 HTTPS 连接进行 SSL 固定。这有助于防止对我的客户端/服务器通信的中间人攻击。

当我设置这个时,我知道谷歌每隔一两个月就会循环他们的*.appspot.com.证书。但是,我希望 appspot.com 每个月都使用相同的公钥,这样我的应用程序和服务器之间的通信就不会中断。

但是,在最新的证书中,没有任何警告,Google已经更改了他们的公钥。现在,就与服务器通信而言,我的应用程序是DOA。我尝试将 SSL 固定与 *.appspot.com 一起使用是错误的吗?证书?谷歌会通知开发者何时更改公钥?我是否应该将自己的证书与自定义域一起使用?

一个有趣的巧合是,我刚刚对未来一篇关于固定的博客文章进行了第一次编辑(除其他职责外,我还策划了云技术支持博客文章),所以我对此绝对毫无疑问

我尝试将 SSL 固定与 *.appspot.com 一起使用是错误的吗? 证书?

是的。

谷歌是否通知开发人员何时要更改他们的 公钥?

不,以上就是哪里。

我是否应该将自己的证书与自定义域一起使用?

是的,没错。 更一般地说,仅固定到控制的公钥是最佳做法。

来自未来博客文章的其他建议:你的应用用户中有一部分不会更新 - 那么你怎么能对你的图钉集进行任何旋转呢? 例如,如果您的 5% 的用户不更新,您是否可以切断它们? 该博客的建议是,如果应用程序知道它太旧,请让应用程序绕过自己的固定检查 - 例如,如果系统时间至少比编译时烘焙到应用程序中的构建时间晚六周;至少,这样,非更新程序的"砖化"是暂时的,而不是永久的......

我怎么知道谷歌什么时候会改变他们的公钥?

谷歌不会更改他们的公钥,除非出现问题。因此,您应该固定公钥。

安全社区发现,鉴于实践中的所有失败,关键连续性是一个重要的属性。因此,安全社区中的一些人正在放弃密钥轮换,转而支持密钥连续性。

Google 使用有效期较短的最终实体/服务器证书(30 天左右)来保持较小的 CRL(对于移动客户端尤其重要)。因此,不应固定证书。

<小时 />

但是,在最新的证书中,没有任何警告,Google已经更改了他们的公钥

根据我所知,这很奇怪。什么公钥更改了?是Google CA(Google Internet Authority G2),公共CA(GeoTrust Gobal CA)还是最终实体证书?

您可以阅读有关Google在Android 4.2和固定方面的立场的更多信息。一些谷歌安全工程师提供了他们的知识和意见。

<小时 />

现在,就与服务器通信而言,我的应用程序是DOA。我尝试将 SSL 固定与 *.appspot.com 一起使用是错误的吗?证书?

我不认为你使用固定是错的。我怀疑问题与通配符证书或即将推出的HTTP(HPKP)公钥固定扩展有关。

EV 级别的 CA/B 论坛(记录浏览器政策和程序)禁止通配符证书,并且 Google 是 CA/B 的成员(浏览器遵循 CA/B 论坛,而不是像许多人怀疑的那样遵循 IETF)。

谷歌是否通过HPKP标头提供了滚动更新?(实际上,网络级 SST/TLS 固定不应依赖于应用层 HPKP 标头)。

<小时 />

现在这里有一些背景故事...IETF将很快发布HTTP RFC的公钥固定扩展。所做的更改可能有助于与 RFC 和 HPKP 标头保持一致。因此,在这种情况下,浏览器转到IETF进行标准化,而不是记录政策和程序的CA/B。

不过,我觉得RFC存在很多问题。我觉得您不应该依赖它作为安全控制,因为:

  • 它适应由于覆盖而导致的拦截
  • 它缺乏对损坏的针集的报告

其中一些是由于使用了不兼容的安全模型,还有一些是由于哲学。所使用的安全模型存在由于 W3C 设计主体而无法协调的差距(特别是,请参阅选区优先级)。

您可以在IETF邮件列表中阅读有关我的异议的更多信息,请参阅Comments on draft-ietf-websec-key-pinning。