EC2上的android.apis.google.com DNS问题

在我们的EC2实例上,我们有一个很奇怪的DNS问题。 我们在一些实例上运行的应用程序是基于Java的服务,为Android应用程序提供后端。 作为其function的一部分,它通过Google API向手机发送推送通知。 为此,必须向android.apis.google.com发出SSL请求。 不幸的是,在我们的EC2实例上运行时,我们得到一个证书错误,因为主机名与证书名称不匹配:

hostname in certificate didn't match: <android.apis.google.com> != <.gstatic.com> OR <gstatic.com> OR <.gstatic.com> 

我们已经将问题跟踪到DNS结果的差异。 当我们从我们的办公室(其中一切正常)查询DNS的android.apis.google.com ,我们得到以下内容:

 android.apis.google.com. 300 IN CNAME clients.l.google.com. clients.l.google.com. 160 IN A 74.125.226.230 clients.l.google.com. 160 IN A 74.125.226.231 clients.l.google.com. 160 IN A 74.125.226.232 clients.l.google.com. 160 IN A 74.125.226.233 clients.l.google.com. 160 IN A 74.125.226.238 clients.l.google.com. 160 IN A 74.125.226.224 clients.l.google.com. 160 IN A 74.125.226.225 clients.l.google.com. 160 IN A 74.125.226.226 clients.l.google.com. 160 IN A 74.125.226.227 clients.l.google.com. 160 IN A 74.125.226.228 clients.l.google.com. 160 IN A 74.125.226.229 

当我们从EC2服务器执行相同的查询时,我们得到一组不同的DNS结果:

 android.apis.google.com. 300 IN CNAME clients.l.google.com. clients.l.google.com. 300 IN A 72.14.204.138 clients.l.google.com. 300 IN A 72.14.204.100 clients.l.google.com. 300 IN A 72.14.204.101 clients.l.google.com. 300 IN A 72.14.204.102 clients.l.google.com. 300 IN A 72.14.204.113 

任何想法,为什么在EC2的DNS结果会如此显着不同? 而且更重要的是,我们如何解决这个问题呢?

我们尝试使用自定义主机名validation器。 根据我们的开发人员,这允许连接继续,但问题是,它连接到错误的服务器,所以请求仍然失败。

Google拥有大量的IP地址,他们会为您提供与您所在地理位置最接近的IP地址。

当我在8.8.8.8对Google自己的公共DNS进行dig时,得到了与EC2相同的列表:

 [] csternal@~: dig @8.8.8.8 android.apis.google.com ; <<>> DiG 9.6-ESV-R4-P3 <<>> @8.8.8.8 android.apis.google.com ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 38592 ;; flags: qr rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;android.apis.google.com. IN A ;; ANSWER SECTION: android.apis.google.com. 300 IN CNAME clients.l.google.com. clients.l.google.com. 300 IN A 72.14.204.102 clients.l.google.com. 300 IN A 72.14.204.113 clients.l.google.com. 300 IN A 72.14.204.100 clients.l.google.com. 300 IN A 72.14.204.101 clients.l.google.com. 300 IN A 72.14.204.138 ;; Query time: 83 msec ;; SERVER: 8.8.8.8#53(8.8.8.8) ;; WHEN: Thu Mar 15 11:38:13 2012 ;; MSG SIZE rcvd: 145 

你遇到的问题似乎是这样的: https : //stackoverflow.com/questions/6296547/c2dm-ioexception-when-sending-message

解决您收到的错误消息最常用的解决scheme是定义一个自定义主机名validation。 您所面临的主要问题是Google Androidurl返回的域名是.google.com。 不幸的是,这会导致一些问题,因为Android SDK位于android.apis.google.com。 JVM默认不会validation这个组合( .sdk.google.com是可以接受的)。

以下是如何创build自己的主机名validation程序的示例:

 URL url = new URL("https://android.apis.google.com/c2dm/send"); HostnameVerifier hVerifier = new HostnameVerifier() { public boolean verify(String hostname, SSLSession session) { return true; } }; HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); conn.setHostnameVerifier(hVerifier); 

奇怪。 一切又开始了 – 就像魔法一样。

这可能是来自Amazon EC2 DNS平台(刷新问题)的问题,也可能是来自您的“虚拟平台”或Amazon平台的caching结果问题。