android.apis.google.com Domanda DNS a EC2

Abbiamo un problema veramente strano con DNS sulle nostre istanze EC2. Un'applicazione in esecuzione su alcune delle nostre istanze è un servizio basato su Java che fornisce un back-end per un'applicazione Android. Come parte della sua funzionalità, invia notifiche push ai telefoni tramite un'API di Google. Per fare questo, deve submit una richiesta SSL a android.apis.google.com . Purtroppo, quando si esegue questa operazione sulle nostre istanze EC2, otteniamo un errore di certificato perché il nome host non corrisponde al nome del certificato:

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

Abbiamo monitorato il problema fino a una differenza nei risultati DNS. Quando interroghiamo DNS per android.apis.google.com dal nostro ufficio (where tutto funziona), riceveremo quanto segue:

 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 

Quando eseguiamo la stessa query da un server EC2, riceveremo un diverso insieme di risultati 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 

Qualche idea di perché i risultati DNS sarebbero così drammaticamente diversi da EC2? E, cosa ancora più importnte, come possiamo risolvere questo problema?

Abbiamo provato a utilizzare un validatore personalizzato di hostname. Secondo i nostri sviluppatori, che ha permesso la connessione a procedere, ma il problema è che è connesso al server sbagliato, quindi la richiesta non riesce ancora.

  • Problema di Geolocalizzazione DNS di Google
  • Google SPDY - Qualcuno lo ha usato in Apache?
  • Posizione dei server Google
  • Timeout di connessione di SMTP di Google
  • Quando Google DNS (o Open DNS) è una buona misura
  • NGINX come redirect gli accessi tramite IP per accedere al nome host?
  • .htaccess redirect visitor se ha un cookie è da accounts.google.com
  • La versione Android 2.2 crittografa localmente i messaggi di Activesync?
  • 3 Solutions collect form web for “android.apis.google.com Domanda DNS a EC2”

    Google ha un sacco di IP e ti servirà gli IP che sono geograficamente più vicini a where pensano di trovarti.

    Quando dig contro il proprio DNS pubblico di Google a 8.8.8.8 , ottengo la stessa list che ottieni da 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 

    Il problema che incontri sembra essere questo: https://stackoverflow.com/questions/6296547/c2dm-ioexception-when-sending-message

    La soluzione più comunemente fornita per risolvere il messaggio di errore che stai ricevendo è definire una validation di nome host personalizzata. Il problema principale che si sta affrontando è che il nome di dominio restituito dall'URL di Android di Google è .google.com. Purtroppo, questo causa alcuni problemi in quanto Android SDK è a android.apis.google.com. Il JVM non convaliderà questa combinazione per impostazione predefinita ( .sdk.google.com sarebbe accettabile).

    Ecco un esempio di come creare il proprio validatore hostname:

     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); 

    Strano. Tutto ha cominciato a lavorare nuovamente – come la magia.

    Può essere un problema proveniente dalla piattaforma DNS Amazon EC2 (problema di aggiornamento) o da un problema di risultati nella cache proveniente da entrambi, dalla tua piattaforma virtuale o dalla piattaforma Amazon.

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.