Ohjelmointi

Suunnittele suojattujen verkkosovellusten käyttö sertifikaateilla, osa 2

Turvallisten sovellusten rakentamiseksi sinun on opittava alan työkalut. Auttaakseni sinut tutustumaan näihin käsitteisiin esitin sinut julkisen avaimen salaukseen osassa 1 ja selitin, miten se välttää salaisen avaimen salaukseen liittyviä avaimenvaihto-ongelmia. Tutkin myös luottamuksen ja julkisen avaimen salauksen skaalattavuuden suhdetta ja selitin, kuinka varmenteet ja julkisen avaimen infrastruktuuri (PKI) mahdollistavat luottamuksen laajemmassa mittakaavassa kuin julkisen avaimen salaus voi saavuttaa yksin. Lopuksi kuvasin varmenteet ja varmenteketjut ja selitin, miten ne liittyvät varmentajiin (varmentajiin).

Sertifikaateista on saatavana monia eri makuja, mukaan lukien SDSI (yksinkertainen hajautettu tietoturvainfrastruktuuri), PGP (melko hyvä yksityisyys) ja X.509. Tässä kuussa, jotta voin laajentaa tietoturvasanastoa, kuvaan varmentemuotoa, joka johtaa pakettia ja on keskeinen osa uusia PKI-standardeja: X.509-varmenne.

Voit lukea koko sarjan sertifikaateista:

  • Osa 1: Sertifikaatit lisäävät arvoa julkisen avaimen salaukseen
  • Osa 2: Opi käyttämään X.509-varmenteita
  • Osa 3: Käytä Java CRL- ja X509CRL-luokkia
  • Osa 4: Todenna asiakkaat ja palvelimet ja varmentaketjut

X.509-muoto yksityiskohtaisesti

Kansainvälinen televiestintäliitto (ITU) kehitti ja julkaisi X.509-varmentemuodon, jonka Internet Engineering Task Force (IETF) -työryhmä valitsi julkisen avaimen infrastruktuurin X.509 (PKIX) työryhmän. Jos lyhenteet osoittavat voimaa, X.509: llä on selvästi voimakkaita liittolaisia.

X.509-standardi määrittelee varmenteen muodon käyttämällä ASN.1 (Abstract Syntax Notation One) -nimikettä. ASN.1 on standardoitu kieli, joka kuvaa abstrakteja tietotyyppejä alustasta riippumattomalla tavalla.

PKIX-työryhmän julkaisema "Internet X.509 julkisen avaimen infrastruktuuri - varmenne ja CRL-profiili" -asiakirja (katso linkin lähteet) kuvaa X.509-varmenteen muodon ASN.1-merkinnällä. Se on kiehtova luku, jos olet kiinnostunut sellaisista asioista.

ASN.1: ssä määritetty tietotyyppi - kuten varmenne - ei ole hyödyllinen, ennen kuin se voi yksiselitteisesti määrittää, miten tietotyypin esiintymä esitetään bittisarjana. Antaakseen tietotyypille kyseisen toiminnallisuuden, ASN.1 käyttää Distinguished Encoding Rules (DER) -ominaisuuksia, jotka määrittelevät, kuinka mikä tahansa ASN.1-objekti koodataan yksilöllisesti.

Kopion X.509-varmenteen ASN.1-määritelmästä ja tiedon DER: stä voit kirjoittaa Java-sovelluksen, joka lukee ja kirjoittaa X.509-varmenteita ja toimii yhdessä vastaavien muilla ohjelmointikielillä kirjoitettujen sovellusten kanssa. Onneksi sinun ei todennäköisesti tarvitse koskaan joutua kärsimään niin suurista ongelmista, koska Java 2 Platform, Standard Edition (J2SE) sisältää sisäänrakennetun tuen X.509-varmenteille.

X.509 (melkein) mitään

Kaikki varmenteisiin liittyvät luokat ja rajapinnat sijaitsevat paketissa java.security.cert. Kuten muutkin Sunin tietoturvasovellusliittymien jäsenet, varmentepaketti suunniteltiin tehdasparadigman ympärille, jossa yksi tai useampi Java-luokka määrittelee yleisen käyttöliittymän paketin suunnitellulle toiminnallisuudelle. Luokat ovat abstrakteja, joten sovellukset eivät voi ilmentää niitä suoraan. Sen sijaan tehdasluokan ilmentymä luo ja palauttaa abstraktien luokkien erityisten alatyyppien esiintymät. Tehdasparadigma kiertää Javan vahvan kirjoittamisen, mutta vastineeksi antaa koodin toimia ilman uudelleenkääntämistä laajemmissa ympäristöissä.

java.security.cert.Sertifikaatti ja java.security.cert.CRL abstraktit luokat määrittävät käyttöliittymän. Ne edustavat varmenteita ja varmenteiden peruutusluetteloita (CRL). CertificateFactory luokka on heidän tehtaansa.

java.security.cert Paketti sisältää Todistus ja CRL abstraktit luokat: X509-sertifikaatti ja X509CRL luokat. Nämä kaksi luokkaa toteuttavat varmenteen ja CRL: n perustoiminnot ja laajentavat sen sitten X.509-ominaisuudella. Kun CertificateFactory ilmentymä palauttaa jommankumman luokan ilmentymän, ohjelma voi joko käyttää sitä sellaisenaan tai nimenomaisesti heittää sen X.509-muotoon.

vuonna java.security.cert paketti, käyttöliittymä X509Laajennus määrittelee käyttöliittymän X.509-varmenteen laajennuksiin. Laajennukset ovat valinnaisia ​​komponentteja, jotka tarjoavat varmenteen luojille mekanismin yhdistää lisätietoja varmenteeseen. Esimerkiksi varmenne voi käyttää KeyUsage laajennus osoittaa, että sitä voidaan käyttää koodin allekirjoittamiseen.

java.security.cert paketti sisältää myös SPI (Service Provider Interface) -luokan. A salauspalvelun tarjoaja joka haluaa tukea varmenteen tyyppiä, laajentaa SPI: tä. Java 2: n mukana tulee SPI X.509 -varmenteille.

Katsotaanpa tarkemmin luokan luokat ja käyttöliittymät java.security.cert paketti. Lyhyesti sanottuna keskustelen vain hyödyllisimmistä menetelmistä. Saadaksesi kattavamman kattavuuden, suosittelen sinua lukemaan Sunin ohjeet. (Katso Resurssit.)

java.security.cert.CertificateFactory

Tarina alkaa java.security.cert.CertificateFactory. CertificateFactory luokassa on staattisia menetelmiä, jotka luovat a CertificateFactory esimerkiksi tietyntyyppisille varmenteille, ja menetelmille, jotka luovat sekä varmenteet että CRL: t tulovirrassa toimitetuista tiedoista. Kuvaan lyhyesti tärkeimmät menetelmät ja selitän sitten, miten näitä menetelmiä käytetään X.509-varmenteita ja CRL: itä luodessa. Myöhemmin artikkelissa esitän koodin, joka osoittaa menetelmät toiminnassa.

  • public static CertificateFactory getInstance (String stringType) ja public staattinen CertificateFactory getInstance (String stringType, String stringProvider) ilmentää ja palauttaa varmennetehtaan instanssin stringType parametri. Esimerkiksi, jos arvo stringType on merkkijono "X.509", molemmat menetelmät palauttavat CertificateFactory luokka, joka sopii luokkien esiintymien luomiseen X509-sertifikaatti ja X509CRL. Toinen menetelmä hyväksyy tietyn kryptografisen palveluntarjoajan nimen argumenttina ja käyttää kyseistä palveluntarjoajaa oletusarvon sijasta.
  • julkinen lopullinen varmenne generatorCertificate (InputStream inputstream) instantisoi ja palauttaa varmenteen mukana toimitetuista tiedoista luettuina InputStream ilmentymä. Jos stream sisältää useita varmenteita ja stream tukee merkki () ja nollaus () toimintoja, menetelmä lukee yhden varmenteen ja jättää virran sijoitettuna ennen seuraavaa.
  • julkinen lopullinen kokoelma generatorCertificates (InputStream inputstream) instantisoi ja palauttaa varmentekokoelman käyttämällä toimitetusta luettavia tietoja InputStream ilmentymä. Jos annettu virta ei tue merkki () ja nollaus (), menetelmä kuluttaa koko virran.
  • julkinen lopullinen CRL generoi CRL (InputStream-syötevirta) instantisoi ja palauttaa CRL: n käyttämällä toimitetusta luetuista tiedoista InputStream ilmentymä. Jos stream sisältää useamman kuin yhden CRL: n ja tukee merkki () ja nollaus () toimintoja, menetelmä lukee yhden CRL: n ja jättää virran sijoitettuna ennen seuraavaa.
  • julkinen lopullinen kokoelma generatorCRLs (InputStream inputstream) instantisoi ja palauttaa CRL-kokoelman mukana toimitetuista tiedoista luettuina InputStream ilmentymä. Jos annettu virta ei tue merkki () ja nollaus (), julkinen lopullinen kokoelma generatorCRLs (InputStream inputstream) kuluttaa koko virran.

On tärkeää ymmärtää, miten nämä neljä menetelmää käyttäytyvät, kun generoidaan X.509-esiintymiä tietovirrasta. Katsotaanpa.

generaattosertifikaatti () ja generoidaCRL () metodit odottavat, että tulovirran sisältö sisältää DER-koodatut esitykset sertifikaatista tai CRL: stä.

Molemmat generaattosertifikaatit () ja createCRLs () metodit odottavat, että tulovirran sisältö sisältää joko DER-koodattujen esitysten sarjan tai PKCS # 7 (Public-Key Cryptography Standard # 7) -yhteensopivan varmenteen tai CRL-sarjan. (Katso linkit Resursseista.)

java.security.cert.Sertifikaatti

java.security.cert.Sertifikaatti määrittelee kaiken tyyppisille varmenteille yhteisen käyttöliittymän: X.509, PGP ja pienen kourallisen muita. Tämän luokan tärkeimmät menetelmät ovat:

  • julkinen abstrakti PublicKey getPublicKey () palauttaa julkisen avaimen, joka liittyy varmenteen esiintymään, johon tätä menetelmää kutsutaan.
  • julkinen abstrakti tavu [] getEncoded () palauttaa kyseisen sertifikaatin koodatun lomakkeen.
  • julkinen abstrakti mitätöinti (PublicKey publickey) ja julkinen abstrakti mitätön vahvistus (PublicKey publickey, String stringProvider) varmista, että toimitettua julkista avainta vastaava yksityinen avain allekirjoitti kyseisen varmenteen. Jos avaimet eivät täsmää, molemmat menetelmät heittävät a AllekirjoitusException.

java.security.cert.X509Sertifikaatti

Luokka java.security.cert.X509Sertifikaatti pidentää Sertifioi edellä kuvattu luokka ja lisää X.509-spesifisen toiminnallisuuden. Tämä luokka on tärkeä, koska olet yleensä vuorovaikutuksessa tämän tason varmenteiden kanssa, ei perusluokan kanssa.

  • julkinen abstrakti tavu [] getEncoded () palauttaa varmenteen koodatun muodon, kuten yllä. Menetelmä käyttää DER-koodausta varmenteelle.

Suurin osa java.security.cert.X509SertifikaattiLisätoiminnot koostuvat kyselymenetelmistä, jotka palauttavat tietoja varmenteesta. Esitin suurimman osan tiedoista osassa 1. Tässä ovat menetelmät:

  • julkinen abstrakti int getVersion () palauttaa varmenteen version.
  • julkinen abstrakti Vastuullinen getSubjectDN () palauttaa tiedot, jotka tunnistavat varmenteen aiheen.
  • julkinen abstrakti Vastuullinen getIssuerDN () palauttaa tiedot, jotka tunnistavat varmenteen myöntäjän, joka on tyypillisesti varmentaja, mutta voi olla aihe, jos varmenne on itse allekirjoitettu.
  • julkinen tiivistelmä Päivämäärä getNotBefore () ja julkinen tiivistelmä Päivämäärä getNotAfter () palautusarvot, jotka rajoittavat ajanjaksoa, jonka aikana liikkeeseenlaskija on valmis takaamaan kohteen julkisen avaimen.
  • julkinen abstrakti BigInteger getSerialNumber () palauttaa varmenteen sarjanumeron. Sertifikaatin myöntäjän nimen ja sarjanumeron yhdistelmä on sen yksilöllinen tunniste. Tämä tosiasia on ratkaiseva varmenteen peruuttamisen kannalta, josta keskustelen tarkemmin ensi kuussa.
  • julkinen abstrakti merkkijono getSigAlgName () ja julkinen abstrakti merkkijono getSigAlgOID () palauta varmenteen allekirjoittamiseen käytetyn algoritmin tiedot.

Seuraavat menetelmät palauttavat tietoja varmenteelle määritetyistä laajennuksista. Muista, että laajennukset ovat mekanismeja tietojen yhdistämiseksi sertifikaattiin; ne näkyvät vain version 3 varmenteissa.

  • julkinen tiivistelmä int getBasicConstraints () palauttaa varmenteen rajoitepolun pituuden BasicConstraints laajennus, jos määritelty. Rajoitusten polku määrittää enimmäismäärän CA-varmenteita, jotka voivat seurata tätä varmentetta varmentepolulla.
  • julkinen abstrakti looginen [] getKeyUsage () palauttaa varmenteen tarkoituksen koodattuna KeyUsage laajennus.
  • public set getCriticalExtensionOIDs () ja public set getNonCriticalExtensionOIDs () palauta kokoelma objektitunnisteita (OID) kriittisiksi ja ei-kriittisiksi merkittyille laajennuksille. OID on kokonaislukujen sarja, joka tunnistaa resurssin yleisesti.

En halua jättää sinua ilman koodia pelaamiseen, joten esitän koodin ja jätän CRL: t osaan 3 sen sijaan, että syventyisin CRL-luetteloihin, mikä on itsessään täydellinen aihe.

Koodi

Seuraava luokka osoittaa, miten hankitaan varmentetehdas, kuinka käytetään tätä tehtaaa varmenteen luomiseen tiedostossa olevasta DER-koodatusta esityksestä ja kuinka puretaan ja näytetään varmenteen tietoja. Huomaat kuinka vähän sinun on huolehdittava taustakoodauksesta.