Programiranje

Sestavite varne omrežne aplikacije s certifikati, 2. del

Č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) in javni statični CertificateFactory getInstance (niz stringType, niz stringProvider) ustvari in vrne primerek tovarne potrdil za vrsto potrdila, ki jo določa stringType parameter. Na primer, če je vrednost stringType je niz "X.509," bosta obe metodi vrnili primerek datoteke CertifikatTovarna razred, primeren za ustvarjanje primerkov razredov Potrdilo X509 in X509CRL. 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ženega InputStream primer. Če tok vsebuje več kot eno potrdilo in tok podpira označi () in ponastaviti() 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ženega InputStream primer. Če dani tok ne podpira označi () in ponastaviti(), metoda bo porabila celoten tok.
  • javni končni CRL createCRL (InputStream inputstream) ustvari in vrne CRL z uporabo podatkov, prebranih iz priloženega InputStream primer. Če tok vsebuje več kot en CRL in podpira označi () in ponastaviti() 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ženega InputStream primer. Če dani tok ne podpira označi () in ponastaviti(), 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) in javni 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 a SignatureException.

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.X509CertificateDodatna 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 () in javni 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 () in javni 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 datoteke BasicConstraints 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 v Uporaba tipk podaljšanje.
  • javni Set getCriticalExtensionOIDs () in javni 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.

$config[zx-auto] not found$config[zx-overlay] not found