Secure Sockets Layer (SSL)—nå teknisk sett kalles Transport Layer Security(TLS)—er acommon byggestein for kryptert kommunikasjon mellom klienter og servere. Det er mulig thatan søknad kan bruke SSL feil slik at skadelige enheter kanskje i stand til å fange opp en app data over nettverket., For å hjelpe deg med å sikre at dette ikke happento appen din, kan denne artikkelen belyser de vanligste fallgruvene ved bruk av sikre nettverk protokoller og adresser noen større bekymringer om bruk av Offentlig-Nøkkel Infrastruktur (PKI).
Du bør også lese AndroidSecurity Oversikt samt PermissionsOverview.
Konsepter
I en typisk SSL bruk scenario, en server er konfigurert med et sertifikat som inneholder apublic-tasten, samt en matchende private nøkkelen., Som en del av handshake mellom et SSL clientand server, server beviser det har den private nøkkelen ved å registrere sitt sertifikat med offentlig-nøkkel kryptografi.
Men, noen kan generere sine egne sertifikat og privat nøkkel, så en enkel handshakedoesn ikke bevise noe som helst om server annet enn at serveren kjenner den private nøkkelen thatmatches den offentlige nøkkelen i sertifikatet. En måte å løse dette problemet er å ha clienthave et sett av en eller flere sertifikater som det stoler. Hvis sertifikatet ikke finnes i sett, theserver er ikke til å stole på.,
Det er flere ulemper til dette enkle tilnærming. Servere ikke skal være i stand toupgrade til sterkere tastene over tid («nøkkelrotasjon»), som erstatter den offentlige nøkkelen i thecertificate med en ny. Dessverre, nå kunden app har til å være oppdatert på grunn av beskriv egentlig en server configuration change. Dette er spesielt problematisk hvis serveris ikke under app developer ‘ s kontroll, for eksempel hvis det er en tredjeparts web-tjeneste. Thisapproach har også problemer hvis appen har å snakke til vilkårlig servere, som for eksempel en nettleser oremail app.,
for å løse disse ulempene, servere er vanligvis konfigurert med certificatesfrom kjente utstedere som kalles Sertifikat Myndigheter (CAs).Vertsplattform vanligvis inneholder en liste over kjente CAs at det stoler.Som i Android 4.2 (Jelly Bean), Android i dag inneholder over 100 CAs som er updatedin hver utgivelse. Ligner på en server, en CA har et sertifikat og en privat nøkkel. Når issuinga sertifikat for en server, CA signsthe server sertifikat ved hjelp av sin private nøkkel. Theclient kan bekrefte at serveren har et sertifikat som er utstedt av en CA kjent for å plattformen.,
Imidlertid, mens løse noen problemer, ved hjelp av CAs introduserer en annen. Fordi CA issuescertificates for mange servere, du fortsatt trenger noen måte å sørge for at du snakker til theserver du vil. For å adressere dette sertifikatet utstedt av CA identifiserer servereither med et bestemt navn, for eksempel gmail.com eller en wildcarded sett ofhosts for eksempel *.google.com.
følgende eksempel vil gjøre disse begrepene litt mer konkret., I tekstutdraget belowfrom en kommandolinje, openssl
verktøy s_client
– kommandoen ser på Wikipedia på serveren sertifikat informasjon. Itspecifies port 443 fordi det er det som er standard for HTTPS. Kommandoen sendsthe utgang av openssl s_client
til openssl x509
, hvilke formater informasjon sertifikater i henhold til X. 509 standard. Spesielt kommandoen ber om emnet, som inneholder navnet på serveren for informasjon,og utstederen, som identifiserer CA.,
Du kan se at sertifikatet ble utstedt for servere matchende *.wikipedia.org bythe RapidSSL CA.
En HTTPS-eksempel
hvis du har en web-server med acertificate utstedt av en godt kjent CA, du kan lage en sikker avtale med kode assimple dette:
Ja, det virkelig kan være så enkelt. Hvis du ønsker å skreddersy en HTTP-forespørsel, du kan kaste toan HttpURLConnection
., Android dokumentasjon forHttpURLConnection
har flere eksempler om hvordan man skal håndtere requestand respons overskrifter, legge ut innhold, administrere informasjonskapsler, ved å bruke proxy-servere, caching svar,og så videre. Men i form av detaljer for å verifisere sertifikater og vertsnavn, den Androidframework tar vare på den for deg gjennom disse Api-ene.Dette er hvor du vil være hvis det er mulig. Når det er sagt, nedenfor er noen andre hensyn.,
Vanlige problemene med å kontrollere server sertifikater
Tenk i stedet for å motta innhold fra getInputStream()
, det kaster et unntak:
Dette kan skje av flere grunner, blant annet:
- SERTIFISERINGSINSTANSEN som utstedte server sertifikatet var ukjent
- server sertifikatet ikke var signert av en CA, men var selv signert
- server konfigurasjon, mangler en mellomliggende CA –
De følgende avsnittene diskutere hvordan man skal løse disse problemene, samtidig yourconnection til server secure.,
Ukjent sertifiseringsinstans
I dette tilfellet SSLHandshakeException
occursbecause du har en CA som ikke er klarert av systemet. Det kan være becauseyou har et sertifikat fra en ny CA-som ennå ikke er klarert av Android eller appen din isrunning som har en eldre versjon uten i CA. Mer ofte en CA er ukjent fordi det ikke er apublic CA, men en privat ett utstedt av en organisasjon, for eksempel en regjering, selskap eller utdanning institusjonen for eget bruk.
Heldigvis, du kan lære HttpsURLConnection
du kan stole på et bestemt sett av CAs., Den procedurecan være litt tvetydig, så nedenfor er et eksempel som tar en bestemt CA froman InputStream
, bruker det til å lage en KeyStore
,som deretter brukes til å opprette og initialisere enTrustManager
. En TrustManager
hva systemuses å validere sertifikater fra serverand—ved å lage en fra en KeyStore
med en eller flere CAs—thosewill være den eneste CAs klarert av at TrustManager
.,
Gitt nye TrustManager
,eksempel initierer en ny SSLContext
som providesan SSLSocketFactory
du kan bruke til å overstyre standardSSLSocketFactory
fraHttpsURLConnection
. På denne måten theconnection vil bruke CAs-for validering av sertifikat.
Her er eksempel infull ved hjelp av en organisatorisk CA fra University of Washington:
Med en tilpasset TrustManager
som vet om CAs-systemet er i stand til å validatethat serversertifikat kommer fra en klarert utgiver.,
Advarsel:Mange nettsteder beskrive et dårlig alternativ løsning som er å installere enTrustManager
det gjør ingenting. Hvis du gjør dette kan du like godt notbe å kryptere kommunikasjonen, fordi alle kan angripe brukere på en offentlig Wi-Fi hotspotby ved hjelp av DNS-triks for å sende brukerne’traffic gjennom en proxy av sine egne som later til å være din server. Angriperen kan thenrecord passord og andre personlige data., Dette fungerer fordi den angriper kan generere acertificate og—uten en TrustManager
som actuallyvalidates at sertifikatet kommer fra en trustedsource—appen din for å kunne snakke med noen. Så ikke gjør dette, ikke engang midlertidig. Du canalways gjøre app tillit utsteder av serverens sertifikat, så bare gjør det.
selvsignert serversertifikat
Det andre tilfellet av SSLHandshakeException
isdue til en selv-signert sertifikat, noe som betyr at serveren er oppfører seg som sin egen, CA.,Dette ligner en ukjent sertifiseringsautoritet, slik at du kan bruke thesame metoden fra forrige avsnitt.
Du kan lage din egen TrustManager
,denne gangen stole på serveren sertifikat direkte. Dette har alle thedownsides diskutert tidligere binde appen direkte til et sertifikat, men det kan være donesecurely. Du bør imidlertid være forsiktig med å sørge for at din selv-signert sertifikat har areasonably sterk nøkkel. Som for 2012, en 2048-bit RSA-signatur med en eksponent for 65537 expiringyearly er akseptabelt., Når rotere nøkler, bør du se etter anbefalinger fra anauthority (for eksempel NIST) om hva som er akseptabelt.
Mangler middels sertifiseringsinstans
Den tredje tilfelle av SSLHandshakeException
oppstår på grunn av en manglende mellomliggende CA. De fleste publicCAs ikke logger server sertifikater direkte. De bruker i stedet sin viktigste CA-sertifikat,referert til som rot-CA for å logge midlertidige Sertifiseringsinstanser. De gjør dette slik at rot-CA kan være storedoffline for å redusere risikoen for kompromiss., Imidlertid, operativsystemer som Android typicallytrust bare rot-CAs direkte, som etterlater en kort gap av tillit mellom servercertificate—signert av mellomliggende CA—og sertifikatet verifier,som kjenner rot-CA. For å solvethis, serveren sender ikke bare klient-det er sertifikatet i løpet av SSL handshake, buta-kjeden av sertifikater fra serveren CA gjennom alle mellomprodukter som er nødvendig for å nå atrusted rot-CA.
for Å se hva dette ser ut i praksis, her er e-posten.google.,com certificatechain som vises av openssl
s_client
kommando:
Dette viser at serveren sender et sertifikat for e-post.google.comissued av Thawte SGC CA, som er et mellomliggende CA, og en annen certificatefor Thawte SGC CA utstedt av en Verisign CA, som er den primære CA som’strusted av Android.
Imidlertid, det er ikke uvanlig å konfigurere en server for å ikke inkluderer necessaryintermediate CA., For eksempel, her er en server som kan forårsake en feil i Android nettlesere andexceptions i Android apps:
Det er interessant å merke seg her er at å gå inn på denne serveren i de fleste stasjonære browsersdoes ikke føre til en feil som en helt ukjent CA eller selvsignert serversertifikat wouldcause. Dette er fordi de fleste datamaskiner cache klarerte, midlertidige Sertifiseringsinstanser over tid. Oncea nettleseren har besøkt, og lærte om en mellomliggende CA-fra ett område, det vil’tneed å ha middels CA inkludert i sertifikatkjede neste gang.,
Noen nettsteder gjør dette med vilje for sekundære web-servere, som brukes til å tjene ressurser. Forexample, de kan ha sine viktigste HTML-side som serveres av en server med en full certificatechain, men har servere for ressurser som bilder, CSS, JavaScript eller ikke inkluderer theCA, trolig for å spare båndbredde. Dessverre, noen ganger er disse serverne kan være providinga web service du prøver å ringe til fra din Android app, som ikke er så tilgivende.
Det er to tilnærminger for å løse dette problemet:
- Konfigurer server til å omfatte de mellomliggende CA-i server-kjeden., De fleste CAs gi dokumentasjon på hvordan å gjøre dette for alle vanlige web-servere. Dette er den eneste metoden hvis du trenger i stedet for å fungere med standard Android nettlesere minst gjennom Android 4.2.
- Eller, behandle de mellomliggende CA-som alle andre ukjente CA, og lage en
TrustManager
for å stole på det direkte, som gjort i de to foregående avsnittene.
Vanlige problemer med bekreftelse vertsnavn
Som nevnt i begynnelsen av denne artikkelen,det er to viktige deler for å verifisere en SSL-tilkobling., Den firstis å kontrollere sertifikatet er fra en klarert kilde, som var fokus for previoussection. Fokus for denne delen er den andre delen: å sørge for at serveren du aretalking å presenterer riktig sertifikat. Når det ikke gjør det, vil du vanligvis se en errorlike dette:
En grunn til at dette kan skje, er på grunn av en server configuration error. Serveren isconfigured med et sertifikat som ikke har et fag eller emne alternative navn fieldsthat samsvarer med serveren du prøver å nå. Det er mulig å ha en sertifikatet være usedwith mange forskjellige servere., For eksempel, se på google.com sertifikat medopenssl
s_client -connect google.com:443 | openssl x509 -text
du kan se at en subjectthat støtter *.google.com men også gjenstand alternative navn for *.youtube.com,*.android.com og andre. Feilen oppstår kun når navnet på serveren for youare å koble til, ikke er oppført av sertifikat som akseptabel.
Dessverre er dette kan skje for en annen grunn så godt: virtuell hosting. Når du deler aserver for mer enn ett vertsnavn med HTTP, web-server kan fortelle fra HTTP/1.1 requestwhich mål vertsnavn klienten er ute etter., Dessverre er dette komplisert withHTTPS, fordi serveren har å vite hvilket sertifikat for å gå tilbake før det ser HTTPrequest. For å løse dette problemet, nyere versjoner av SSL, spesielt TLSv.1.0 og nyere,support Server Navn Indikasjon(SNI), som gir SSL-klient for å angi intendedhostname til serveren så riktig sertifikat kan bli returnert.
Heldigvis, HttpsURLConnection
supportsSNI siden Android 2.3. En workaroundif du trenger for å støtte Android-2.,2 (og eldre) er å sette opp en alternativevirtual vert på en unik port, slik at det er entydig som serversertifikat for å gå tilbake.
mer drastisk alternativ er å erstatte HostnameVerifier
med en som bruker ikke thehostname av den virtuelle verten, men som returneres av serveren som standard.
Advarsel: Skifte HostnameVerifier
kan være svært farlig hvis den andre virtuelle verten isnot under din kontroll, fordi anon-pathattacker kunne lede trafikk til anotherserver uten din viten.,
Hvis du er fortsatt sikker på at du vil overstyre bekreftelse vertsnavn, her er en examplethat erstatter verifier for en enkelt URLConnection
med en som fortsatt kontrollerer at vertsnavnet er minst på forventet av app:
Men husk, hvis du finner deg selv å erstatte bekreftelse vertsnavn, especiallydue å virtuell hosting, det er fortsatt veldig farlig hvis den andre virtuelle verten isnot under din kontroll, og du bør finne en alternativ hosting arrangementthat unngår dette problemet.,
Advarsler om bruk av SSLSocket direkte
Så langt, eksemplene har fokusert på HTTPS bruk av HttpsURLConnection
.Noen ganger apps trenger å bruke SSL separat fra HTTP. For eksempel, en e-post-appen kan bruke SSL variantsof SMTP, POP3 eller IMAP. I disse tilfellene app ønsker å bruke SSLSocket
direkte, mye på samme måte som HttpsURLConnection
gjør internt.
teknikkene som er beskrevet sofar å håndtere sertifikat verifisering problemer også gjelder for SSLSocket
.,Faktisk, når du bruker en tilpasset TrustManager
hva er sendt tilHttpsURLConnection
er en SSLSocketFactory
.Så hvis du trenger å bruke en tilpasset TrustManager
medSSLSocket
, followthe samme trinnene og bruk som SSLSocketFactory
for å lage dinSSLSocket
.
Advarsel:SSLSocket
ikke utføre bekreftelse vertsnavn. Det isup til appen din til å gjøre sin egen bekreftelse vertsnavn, fortrinnsvis ved å ringe getDefaultHostnameVerifier()
med forventet vertsnavn., Furtherbeware som HostnameVerifier.verify()
ikke kaste et unntak på feil, men i stedet returnerer en boolsk resultat at du mustexplicitly sjekk.
Her er et eksempel som viser hvordan du kan gjøre dette. Det viser at når du kobler togmail.com port 443 uten SNI støtte, vil du motta et sertifikat formail.google.com. Dette er forventet i dette tilfellet, så kontroller at thatthe sertifikat er faktisk for mail.google.com:
Denylisting
SSL er helt avhengig CAs til å utstede sertifikater for å bare riktig bekreftet ownersof servere og domener., I sjeldne tilfeller, CAs enten er lurt eller, i tilfelle av Comodo eller DigiNotar, brutt,noe som resulterer i sertifikatene for et vertsnavn for å være utstedt tosomeone andre enn eieren av serveren eller domene.
for å redusere denne risikoen, Android har den evne til å legge visse sertifikater eller evenwhole CAs til en denylist. Mens denne listen historisk var bygget inn i operativsystemet, startingin Android 4.2 denne listen kan være eksternt oppdatert til å håndtere fremtidige kompromisser.,
Denne
En app kan ytterligere beskytte seg selv fra sterkt sertifikater utstedt av atechnique kjent som feste. Dette er i utgangspunktet bruker eksempelet som er gitt i det ukjente, CA caseabove å begrense en app pålitelige CAs til et lite sett kjent for å bli brukt av app servere. Thisprevents kompromiss av en av de andre 100+ CAs i systemet fra noe som resulterer i et brudd ofthe apps sikker kanal.
Klient-sertifikater
Denne artikkelen har fokusert på den som bruker SSL for å sikre kommunikasjon med servere., SSL alsosupports begrepet klient-sertifikater som lar serveren for å bekrefte identiteten til aclient. Mens du er utenfor omfanget av denne artikkelen, den teknikker som er involvert er lik specifyinga tilpasset TrustManager
.
Nogotofail: Et nettverk trafikk sikkerhet testing verktøy
Nogotofail er et verktøy som gir deg en enkel måte å bekrefte at appene dine er trygge mot kjente TLS/SSL sårbarheter og konfigurasjonsfeil. Det er et automatisert, kraftig og skalerbar verktøy for testing network security problemer på en hvilken som helst enhet som trafikk kan gjøres for å gå gjennom det.,
Nogotofail er nyttig for tre av de viktigste bruksområdene:
- å Finne bugs og sikkerhetshull.
- Verifisere reparasjoner og ser for regresjoner.
- Forstå hvilke programmer og enheter er å generere hva trafikk.
Nogotofail fungerer for Android, iOS, Linux, Windows, Chrome OS, OSX, faktisk en hvilken som helst enhet du bruker til å koble til Internett. Det er en lett-å-bruke klienten for å konfigurere innstillingene og få varslinger på Android og Linux, samt angrep motoren i seg selv som kan distribueres som en ruter, VPN-server, eller proxy-server.