Če želite zgraditi varne aplikacije, se morate naučiti orodij trgovine. Da bi vas lažje seznanil s temi koncepti, sem vam v 1. delu predstavil kriptografijo z javnimi ključi in razložil, kako se izogne težavam pri izmenjavi ključev, ki spremljajo kriptografijo s tajnimi ključi. Raziskal sem tudi razmerje med zaupanjem in razširljivostjo kriptografije z javnimi ključi ter razložil, kako certifikati in infrastruktura z javnimi ključi (PKI) omogočajo zaupanje v širšem obsegu, kot ga lahko kriptografija z javnim ključem doseže sama. Na koncu sem opisal certifikate in verige potrdil ter razložil, kako se nanašajo na overitelje overiteljev.
Na voljo je veliko različnih okusov certifikatov, vključno s SDSI (preprosta porazdeljena varnostna infrastruktura), PGP (precej dobra zasebnost) in X.509. Ta mesec bom za nadaljnjo razširitev vašega varnostnega besedišča opisal obliko potrdila, ki vodi paket in je ključna sestavina nastajajočih standardov PKI: potrdilo X.509.
Celotno serijo si lahko preberete na potrdilih:
- 1. del: Potrdila dodajajo vrednost kriptografiji z javnimi ključi
- 2. del: Naučite se uporabljati potrdila X.509
- 3. del: Uporabite razrede Java CRL in X509CRL
- 4. del: Preverite pristnost odjemalcev in strežnikov ter preverite verige potrdil
Podrobno format X.509
Mednarodna zveza za telekomunikacije (ITU) je razvila in objavila format potrdila X.509, ki ga je izbrala delovna skupina za javno ključno infrastrukturo X.509 (PKIX) Delovne skupine za internetni inženiring (IETF). Če kratice kažejo na moč, ima X.509 očitno močne zaveznike.
Standard X.509 z zapisom ASN.1 (Abstract Syntax Notation One) definira obliko potrdila. ASN.1 je standardiziran jezik, ki opisuje abstraktne vrste podatkov na način, neodvisen od platforme.
Dokument "Internet X.509 Infrastruktura javnih ključev - potrdilo in profil CRL" (glejte Vire za povezavo), ki ga je objavila delovna skupina PKIX, opisuje obliko potrdila X.509 v obliki zapisa ASN.1. Fascinantno branje je, če vas takšne stvari zanimajo.
Podatkovni tip - na primer potrdilo - opredeljen v ASN.1 ni uporaben, dokler ne more nedvoumno določiti, kako predstaviti primerek podatkovnega tipa kot niz bitov. Da bi podatkovnemu tipu zagotovil to funkcionalnost, ASN.1 uporablja posebna pravila kodiranja (DER), ki določajo, kako enolično kodirati kateri koli objekt ASN.1.
S kopijo definicije ASN.1 potrdila X.509 in poznavanjem DER lahko napišete aplikacijo Java, ki bo brala in zapisovala potrdila X.509 ter sodelovala s podobnimi aplikacijami, napisanimi v drugih programskih jezikih. Na srečo se vam verjetno ne bo treba nikoli spoprijeti s tolikšnimi težavami, ker ima platforma Java 2, standardna izdaja (J2SE) vgrajeno podporo za potrdila X.509.
X.509 za (skoraj) nič
Vsi razredi in vmesniki, povezani s potrdilom, so v paketu java.security.cert
. Tako kot drugi člani družine Sun-ovih varnostnih API-jev je bil tudi paket potrdil zasnovan okoli tovarniške paradigme, v kateri eden ali več razredov Java definira splošni vmesnik za predvideno funkcionalnost paketa. Predavanja so abstraktna, zato jih aplikacije ne morejo neposredno ustvariti. Namesto tega primerek tovarniškega razreda ustvari in vrne primerke določenih podtipov abstraktnih razredov. Tovarniška paradigma se izogiba močnemu tipkanju Jave, vendar v zameno dovoljuje, da se koda zažene brez ponovnega prevajanja v širšem območju okolij.
The java.security.cert.Certificate
in java.security.cert.CRL
abstraktni razredi definirajo vmesnik. Predstavljajo potrdila oziroma sezname preklicanih potrdil (CRL). The CertifikatTovarna
razred je njihova tovarna.
The java.security.cert
paket vsebuje konkretne izvedbe Potrdilo
in CRL
abstraktni razredi: Potrdilo X509
in X509CRL
razredih. Ta dva razreda izvajata osnovno funkcionalnost certifikata in CRL, nato pa jo razširita s funkcijo, specifično za X.509. Ko a CertifikatTovarna
primerek vrne primerek enega ali drugega razreda, program ga lahko uporabi takšnega, kakršen je, ali pa ga izrecno odda v obrazec X.509.
V java.security.cert
paket, vmesnik X509 Razširitev
definira vmesnik za razširitve certifikata X.509. Razširitve so neobvezne komponente, ki ustvarjalcem potrdil zagotavljajo mehanizem za povezovanje dodatnih informacij s potrdilom. Na primer, potrdilo lahko uporablja Uporaba tipk
razširitev, ki označuje, da se lahko uporablja za podpisovanje kode.
The java.security.cert
paket vključuje tudi razred vmesnika ponudnika storitev (SPI). A ponudnik kriptografskih storitev ki želi podpirati vrsto potrdila, razširja SPI. Java 2 ima SPI za potrdila X.509.
Oglejmo si podrobneje razrede in vmesnike v java.security.cert
paket. Zaradi kratkosti bom razpravljal le o najbolj uporabnih metodah. Za celovitejšo pokritost vam priporočam, da preberete dokumentacijo podjetja Sun. (Glej vire.)
java.security.cert.CertificateFactory
Zgodba se začne z java.security.cert.CertificateFactory
. The CertifikatTovarna
razred ima statične metode, ki ustvarijo CertifikatTovarna
primerek za določeno vrsto potrdila in metode, ki ustvarijo potrdila in CRL iz podatkov, podanih v vhodnem toku. Na kratko bom opisal najpomembnejše metode in nato razložil, kako jih uporabljati pri generiranju potrdil X.509 in referenčnih številk Skupnosti. Kasneje v članku bom predstavil kodo, ki prikazuje metode v delovanju.
javni statični CertificateFactory getInstance (niz stringType)
injavni statični CertificateFactory getInstance (niz stringType, niz stringProvider)
ustvari in vrne primerek tovarne potrdil za vrsto potrdila, ki jo določastringType
parameter. Na primer, če je vrednoststringType
je niz "X.509," bosta obe metodi vrnili primerek datotekeCertifikatTovarna
razred, primeren za ustvarjanje primerkov razredovPotrdilo X509
inX509CRL
. Druga metoda kot argument sprejme ime določenega ponudnika kriptografskih storitev in ga uporabi namesto privzetega.javno končno potrdilo createCertificate (InputStream inputstream)
ustvari in vrne potrdilo z uporabo podatkov, prebranih iz priloženegaInputStream
primer. Če tok vsebuje več kot eno potrdilo in tok podpiraoznači ()
inponastaviti()
bo metoda prebrala eno potrdilo in pustila tok pred naslednjim.javna končna zbirka generiraj potrdila (vhodni tok InputStream)
ustvari in vrne zbirko potrdil z uporabo podatkov, prebranih iz priloženegaInputStream
primer. Če dani tok ne podpiraoznači ()
inponastaviti()
, metoda bo porabila celoten tok.javni končni CRL createCRL (InputStream inputstream)
ustvari in vrne CRL z uporabo podatkov, prebranih iz priloženegaInputStream
primer. Če tok vsebuje več kot en CRL in podpiraoznači ()
inponastaviti()
bo metoda prebrala en CRL in pustila tok pred naslednjim.javna končna zbirka createCRL (InputStream inputstream)
ustvari in vrne zbirko CRL z uporabo podatkov, prebranih iz priloženegaInputStream
primer. Če dani tok ne podpiraoznači ()
inponastaviti()
,javna končna zbirka CreateCRL (InputStream inputstream)
bo porabil celoten tok.
Pomembno je razumeti, kako se te štiri metode obnašajo, ko generirajo primerke X.509 iz toka podatkov. Oglejmo si.
The generirajCertificate ()
in generiraj CRL ()
metode pričakujejo, da bo vsebina vhodnega toka vsebovala predstavitve potrdila oziroma CRL, kodirane z DER.
Oba generiraj potrdila ()
in generiraj CRL ()
metode pričakujejo, da bo vsebina vhodnega toka vsebovala zaporedje predstavitev, kodiranih z DER, ali potrdilo, skladno s PKCS # 7 (standard javnega ključa za kriptografijo # 7), ali CRL. (Za povezave glejte Vire.)
java.security.cert.Certificate
java.security.cert.Certificate
definira vmesnik, ki je skupen vsem vrstam potrdil: X.509, PGP in majhni peščici drugih. Najpomembnejše metode tega razreda so:
javni povzetek PublicKey getPublicKey ()
vrne javni ključ, povezan s primerkom potrdila, v katerem je ta metoda poklicana.javni abstraktni bajt [] getEncoded ()
vrne kodirano obliko tega potrdila.javna izvleček void verify (PublicKey publickey)
injavni povzetek preverjanja void (PublicKey publickey, String stringProvider)
preverite, ali je zasebni ključ, ki ustreza dostavljenemu javnemu ključu, podpisal zadevno potrdilo. Če se tipki ne ujemata, oba načina vržeta aSignatureException
.
java.security.cert.X509Certificate
Razred java.security.cert.X509Certificate
razširja Potrdilo
razred, opisan zgoraj, in dodaja funkcionalnost, specifično za X.509. Ta razred je pomemben, ker s certifikati običajno komunicirate na tej ravni in ne kot osnovni razred.
javni abstraktni bajt [] getEncoded ()
vrne kodirano obliko tega potrdila, kot zgoraj. Za potrditev metoda uporablja kodiranje DER.
Večina java.security.cert.X509Certificate
Dodatna funkcionalnost je sestavljena iz metod poizvedb, ki vrnejo informacije o potrdilu. Večino teh informacij sem predstavil v 1. delu. Tu so metode:
javni povzetek int getVersion ()
vrne različico potrdila.javni povzetek Principal getSubjectDN ()
vrne informacije, ki identificirajo predmet certifikata.javni povzetek Principal getIssuerDN ()
vrne informacije, ki identificirajo izdajatelja potrdila, ki je običajno overitelj potrdil, vendar je lahko predmet, če je potrdilo samopodpisano.javni povzetek Datum getNotBefore ()
injavni povzetek Datum getNotAfter ()
vrniti vrednosti, ki omejujejo časovno obdobje, v katerem je izdajatelj pripravljen jamčiti za javni ključ subjekta.javni povzetek BigInteger getSerialNumber ()
vrne serijsko številko potrdila. Kombinacija imena in serijske številke izdajatelja certifikata je njegova enolična identifikacija. To dejstvo je ključnega pomena za preklic potrdila, o katerem bom podrobneje razpravljal naslednji mesec.javni povzetek String getSigAlgName ()
injavni povzetek String getSigAlgOID ()
vrne informacije o algoritmu, ki se uporablja za podpisovanje potrdila.
Naslednje metode vrnejo informacije o razširitvah, opredeljenih za potrdilo. Ne pozabite, da so razširitve mehanizmi za povezovanje informacij s potrdilom; pojavljajo se samo na potrdilih različice 3.
javni povzetek int getBasicConstraints ()
vrne dolžino poti omejitev potrdila iz datotekeBasicConstraints
podaljšanje, če je določeno. Pot omejitev določa največje število potrdil CA, ki lahko sledijo temu potrdilu na poti potrditve.javna abstraktna logična vrednost [] getKeyUsage ()
vrne namen potrdila, kot je kodiran vUporaba tipk
podaljšanje.javni Set getCriticalExtensionOIDs ()
injavni Set getNonCriticalExtensionOID ()
vrne zbirko identifikatorjev objekta (OID) za razširitve, označene kot kritične oziroma nekritične. OID je zaporedje celih števil, ki univerzalno identificira vir.
Ne želim vas pustiti brez kode, s katero se lahko igrate, zato bom namesto, da bi se poglabljal v CRL, kar je popolna tema, predstavil kodo in pustil CRL za 3. del.
Koda
Naslednji razred prikazuje, kako pridobiti tovarno potrdil, kako to tovarno generirati iz DER-kodirane predstavitve v datoteki in kako izvleči in prikazati informacije o potrdilu. Opazili boste, kako malo morate skrbeti za osnovno kodiranje.