Java >> Java tutorial >  >> Tag >> HTTP

SSL-nybegynder:Har HTTPS-klienten også brug for et certifikat?

Afhænger af, hvad du laver, og hvad du vil verificere. Hvis du har adgang til data og vil være sikker på, at serveren, der kender den tilsvarende private nøgle, er den, der sender dig data (f.eks. du får adgang til en webside), behøver du ikke dit eget certifikat.

Hvis serveren ønsker at kunne verificere, at klienten er en foruddefineret, som kender en privat nøgle svarende til en offentlig nøgle, der er anerkendt som en gyldig kilde, skal din klient have et certifikat. Dette plejer at blive brugt, når et par servere kommunikerer - de signerer hver dataene med deres egen private nøgle og kan verificere, at dataene kommer fra en kendt kilde ved at tjekke mod offentlige nøgler. Det kan også bruges med nogle API'er, hvor kun specifikke klienter er beregnet til at få adgang.

Ved et gæt behøver du derfor ikke dit eget certifikat til din klient - det er generelt ret godt dokumenteret af serveren, hvis du gør det.


Generelt kræver de fleste webservere, der kører HTTPS, ikke, at klienten har et certifikat. Hvis serveren kræver, at klienten godkender, sker dette ofte gennem legitimationsoplysninger (f.eks. brugernavn og adgangskode).

Det omvendte er dog generelt ikke sandt - det vil sige, at de fleste klienter kræver, at webservere har et gyldigt certifikat underskrevet af en anerkendt CA. Det er klientens ansvar at kontrollere, at certifikatet er gyldigt - ellers har klienten ingen mulighed for at være sikker på, at de faktisk er forbundet til den server, den havde til hensigt at oprette forbindelse til, og at den ikke bliver MITM'd.


Nej. Jeg har prøvet det, og klienten har bestemt ikke brug for et certifikat eller en foruddefineret nøgle.

I stedet for, efter at have modtaget en offentlig nøgle (som er en del af certifikatet) fra serveren, opfinder klienten en hemmelighed 'on the fly' og krypterer den med den offentlige nøgle fra serverens certifikat. Klienten sender den krypterede hemmelighed til serveren som en del af håndtrykket. Kun serveren kan dekryptere meddelelsen, der indeholder hemmeligheden fra klienten, så længe kun serveren har den private nøgle, der svarer til den offentlige nøgle, den sendte i certifikatet. Både klient og server bruger derefter den sikkert overførte hemmelighed til at fortsætte samtalen.

Klientnøgler er kun nødvendige, når serveren skal bekræfte klientens identitet; i så fald kan klienten og serveren kommunikere ved at sende meddelelser krypteret med hinandens offentlige nøgler i stedet.

Du kan se dette i aktion ved at køre din kode med følgende jvm-indstilling:

Djavax.net.debug=ssl,håndtryk

Klienten og serveren kan blive enige om en række forskellige krypteringssystemer, hvormed de kan udveksle og derefter bruge den opdigtede hemmelighed; på min testbed var den standard til elliptisk kurve-kryptering, som beskrevet på

https://commandlinefanatic.com/cgi-bin/showarticle.cgi?article=art060


Java tag