Programavimas

Sukurkite saugias tinkle sujungtas programas su sertifikatais, 2 dalis

Norėdami sukurti saugias programas, turite išmokti prekybos įrankių. Kad galėčiau lengviau susipažinti su šiomis sąvokomis, 1 dalyje supažindinau jus su viešojo rakto kriptografija ir paaiškinau, kaip joje išvengiama raktų keitimo problemų, kurios lydi slapto rakto kriptografiją. Taip pat ištyriau pasitikėjimo ryšį su viešojo rakto kriptografijos masteliu ir paaiškinau, kaip sertifikatai ir viešojo rakto infrastruktūra (PKI) įgalina pasitikėjimą platesniu mastu, nei viešojo rakto kriptografija gali pasiekti pati. Galiausiai aprašiau sertifikatus ir sertifikatų grandines ir paaiškinau, kaip jie susiję su CA (sertifikavimo institucijomis).

Yra daugybė skirtingų sertifikatų skonių, įskaitant SDSI (paprastą paskirstytos saugos infrastruktūrą), PGP (gana gerą privatumą) ir X.509. Šį mėnesį, norėdamas toliau išplėsti savo saugos žodyną, aprašysiu sertifikato formatą, kuris yra pagrindinis paketas ir yra pagrindinis besiformuojančių PKI standartų komponentas: sertifikatas X.509.

Galite perskaityti visą seriją pažymėjimuose:

  • 1 dalis. Sertifikatai prideda viešojo rakto kriptografijos vertę
  • 2 dalis. Išmokite naudoti sertifikatus X.509
  • 3 dalis. Naudokite „Java CRL“ ir „X509CRL“ klases
  • 4 dalis. Autentifikuokite klientus ir serverius bei patikrinkite sertifikatų grandines

X.509 formatas išsamiai

Tarptautinė telekomunikacijų sąjunga (ITU) sukūrė ir paskelbė X.509 sertifikato formatą, kurį pasirinko Interneto inžinerijos darbo grupės (IETF) viešojo rakto infrastruktūros X.509 (PKIX) darbo grupė. Jei akronimai rodo tvirtumą, X.509 akivaizdžiai turi galingus sąjungininkus.

Naudojant žymėjimą, vadinamą ASN.1 („Abstract Syntax Notation One“), X.509 standartas apibrėžia sertifikato formatą. ASN.1 yra standartizuota kalba, apibūdinanti abstrakčius duomenų tipus nepriklausomai nuo platformos.

PKIX darbo grupės paskelbtame dokumente „Interneto X.509 viešojo rakto infrastruktūra - pažymėjimas ir CRL profilis“ (žr. Nuorodos išteklius) aprašomas X.509 sertifikato formatas ASN.1 žymėjimo būdu. Tai įdomu, jei jus domina tokie dalykai.

ASN.1 apibrėžtas duomenų tipas, pvz., Sertifikatas, nėra naudingas, kol jis negali vienareikšmiškai apibrėžti, kaip duomenų tipo egzempliorių vaizduoti kaip bitų seriją. Norėdami suteikti duomenų tipui tą funkcionalumą, ASN.1 naudoja išskirto kodavimo taisykles (DER), kurios apibrėžia, kaip unikaliai koduoti bet kurį ASN.1 objektą.

Turėdami X.509 sertifikato ASN.1 apibrėžimo kopiją ir žinodami DER, galite parašyti „Java“ programą, kuri skaitys ir rašys X.509 sertifikatus ir sąveikaus su panašiomis programomis, parašytomis kitomis programavimo kalbomis. Laimei, tikriausiai niekada nereikės vargti, nes „Java 2 Platform, Standard Edition“ (J2SE) yra integruotas palaikymas X.509 sertifikatams.

X.509 (beveik) nieko

Visos su pažymėjimu susijusios klasės ir sąsajos yra pakete java.security.cert. Kaip ir kiti „Sun“ saugos API šeimos nariai, sertifikatų paketas buvo sukurtas pagal gamyklos paradigmą, kurioje viena ar daugiau „Java“ klasių apibrėžia bendrą sąsają su numatytu paketo funkcionalumu. Klasės yra abstrakčios, todėl programos negali jų tiesiogiai eksponuoti. Vietoj to, gamyklos klasės egzempliorius sukuria ir grąžina konkrečių abstrakčių klasių potipių egzempliorius. Gamyklos paradigma apeina tvirtą „Java“ rašymą, tačiau mainais leidžia kodui paleisti nekompiliuojant platesnėje aplinkoje.

java.security.cert.Sertifikatas ir java.security.cert.CRL abstrakčios klasės apibrėžia sąsają. Jie reiškia atitinkamai sertifikatus ir sertifikatų atšaukimo sąrašus (CRL). CertificateFactory klasė yra jų gamykla.

java.security.cert pakete yra konkretūs Pažyma ir CRL abstrakčios klasės: X509 sertifikatas ir X509CRL klasės. Šios dvi klasės įdiegia pagrindinius sertifikato ir CRL funkcionalumą, tada jį išplės su X.509 specifine funkcija. Kada CertificateFactory egzempliorius grąžina bet kurios klasės egzempliorių, programa gali jį naudoti tokį, koks yra, arba aiškiai perduoti jį į formą X.509.

Viduje konors java.security.cert paketas, sąsaja X509 pratęsimas apibrėžia sąsają su X.509 sertifikato plėtiniais. Plėtiniai yra neprivalomi komponentai, suteikiantys sertifikatų kūrėjams mechanizmą susieti papildomą informaciją su sertifikatu. Pavyzdžiui, sertifikate gali būti naudojamas KeyUsage plėtinys, nurodantis, kad jį galima naudoti pasirašant kodą.

java.security.cert paketas taip pat apima paslaugų teikėjo sąsajos (SPI) klasę. A kriptografinių paslaugų teikėjas norintis palaikyti sertifikato tipą, pratęsia SPI. „Java 2“ yra su SPI, skirtu X.509 sertifikatams.

Pažvelkime išsamiau į klases ir sąsajas java.security.cert pakuotė. Trumpumo dėlei aptarsiu tik naudingiausius metodus. Jei norite išsamesnės informacijos, raginu perskaityti „Sun“ dokumentus. (Žr. Šaltinius.)

java.security.cert.CertificateFactory

Istorija prasideda java.security.cert.CertificateFactory. CertificateFactory klasėje yra statiniai metodai, kurie sukuria a CertificateFactory konkretaus tipo pažymėjimo pavyzdžiai ir metodai, kurie sukuria sertifikatus ir CRL iš įvesties sraute pateiktų duomenų. Trumpai aprašysiu svarbiausius metodus, tada paaiškinsiu, kaip naudoti šiuos metodus kuriant X.509 sertifikatus ir CRL. Vėliau straipsnyje pateiksiu kodą, parodantį veikiančius metodus.

  • public static CertificateFactory getInstance (String stringType) ir public static CertificateFactory getInstance (String stringType, String stringProvider) nustatyti ir grąžinti sertifikatų gamyklos egzempliorių sertifikato tipui, kurį nurodo stringType parametras. Pavyzdžiui, jei vertė stringType yra eilutė "X.509", abu metodai grąžins CertificateFactory klasė, tinkama kuriant klasių egzempliorius X509 sertifikatas ir X509CRL. Antrasis metodas priima konkretaus kriptografinių paslaugų teikėjo vardą kaip argumentą ir naudoja tą teikėją vietoj numatytojo.
  • viešasis galutinis sertifikatas „enerCertificate “(„ InputStream “įvestis) sumontuoja ir grąžina sertifikatą naudodamas iš pateiktų duomenų nuskaitytus duomenis „InputStream“ instancija. Jei sraute yra daugiau nei vienas sertifikatas ir srautas palaiko ženklas() ir nustatyti iš naujo () operacijos, metodas perskaitys vieną sertifikatą ir paliks srautą išdėstytą prieš kitą.
  • viešoji galutinė kolekcija „generCertificates“ („InputStream“ įvesties srautas) sumontuoja ir grąžina sertifikatų rinkinį, naudodamas iš pateiktų duomenų nuskaitytus duomenis „InputStream“ instancija. Jei pateiktas srautas nepalaiko ženklas() ir nustatyti iš naujo (), metodas sunaudos visą srautą.
  • viešoji galutinė CRL generuoti CRL („InputStream“ įvesties srautas) sumontuoja ir grąžina CRL naudodamas iš pateiktų duomenų nuskaitytus duomenis „InputStream“ instancija. Jei sraute yra daugiau nei viena CRL ir jis palaiko ženklas() ir nustatyti iš naujo () operacijoms, metodas nuskaitys vieną CRL ir paliks srautą išdėstytą prieš kitą.
  • viešoji galutinė kolekcija generuoja CRL („InputStream“ įvesties srautas) sumontuoja ir grąžina CRL rinkinį, naudodamas iš pateiktų duomenų nuskaitytus duomenis „InputStream“ instancija. Jei pateiktas srautas nepalaiko ženklas() ir nustatyti iš naujo (), viešoji galutinė kolekcija generuoja CRL („InputStream“ įvesties srautas) sunaudos visą srautą.

Svarbu suprasti, kaip elgiasi šie keturi metodai, generuojant X.509 egzempliorius iš duomenų srauto. Pažiūrėkime.

generuotiCertificate () ir generuoti CRL () metodai tikisi, kad įvesties srauto turinyje bus DER koduojami sertifikato arba CRL atvaizdai.

Tiek generuoti sertifikatus () ir generuoti CRL () metodai tikisi, kad įvesties srauto turinyje bus DER koduotų vaizdų seka arba PKCS # 7 (viešojo rakto kriptografijos standartas Nr. 7) suderinamas sertifikatas arba CRL rinkinys. (Žr. Saitus šaltiniuose.)

java.security.cert.Sertifikatas

java.security.cert.Sertifikatas apibrėžia visų tipų sertifikatų sąsają: X.509, PGP ir nedidelę saują kitų. Svarbiausi šios klasės metodai yra šie:

  • public abstract PublicKey getPublicKey () grąžina viešąjį raktą, susijusį su sertifikato egzemplioriumi, kuriuo vadinamas šis metodas.
  • viešas abstraktus baitas [] getEncoded () grąžina to sertifikato koduotą formą.
  • viešas abstraktus niekinis patikrinimas (PublicKey publickey) ir viešas abstraktus negaliojantis patvirtinimas („PublicKey publickey“, „String stringProvider“) patikrinkite, ar privatus raktas, atitinkantis pateiktą viešąjį raktą, pasirašė atitinkamą sertifikatą. Jei raktai nesutampa, abu metodai meta a ParašasIšimtis.

java.security.cert.X509Certificate

Klasė java.security.cert.X509Certificate pratęsia Sertifikuoti klasę, aprašytą aukščiau, ir prideda X.509 specifinę funkciją. Ši klasė yra svarbi, nes jūs dažniausiai bendraujate su šio lygio pažymėjimais, o ne kaip su pagrindine klase.

  • viešas abstraktus baitas [] getEncoded () grąžina koduotą to pažymėjimo formą, kaip nurodyta aukščiau. Šis metodas naudoja DER kodavimą sertifikate.

Dauguma java.security.cert.X509CertificatePapildomą funkciją sudaro užklausos metodai, kurie pateikia informaciją apie sertifikatą. Daugumą šios informacijos pateikiau 1 dalyje. Čia pateikiami metodai:

  • public abstract int getVersion () grąžina sertifikato versiją.
  • viešas abstraktus Pagrindinis „getSubjectDN“ () pateikia informaciją, identifikuojančią pažymėjimo objektą.
  • viešas abstraktus Pagrindinis „getIssuerDN“ () pateikia informaciją, identifikuojančią sertifikato išdavėją, kuris paprastai yra CA, bet gali būti tema, jei sertifikatas yra pasirašytas savarankiškai.
  • vieša santrauka Data getNotBefore () ir vieša santrauka Data getNotAfter () grąžos vertės, ribojančios laikotarpį, per kurį emitentas nori garantuoti subjekto viešąjį raktą.
  • viešas abstraktus „BigInteger“ getSerialNumber () grąžina sertifikato serijos numerį. Sertifikato išdavėjo pavadinimo ir serijos numerio derinys yra jo unikalus identifikavimas. Šis faktas yra labai svarbus anuliuojant sertifikatą, kurį aš išsamiau aptarsiu kitą mėnesį.
  • vieša abstrakta eilutė getSigAlgName () ir vieša abstrakta eilutė getSigAlgOID () grąžinti informaciją apie algoritmą, naudojamą pasirašant sertifikatą.

Šie metodai pateikia informaciją apie sertifikate apibrėžtus plėtinius. Atminkite, kad plėtiniai yra informacijos susiejimo su sertifikatu mechanizmai; jie pateikiami tik 3 versijos sertifikatuose.

  • public abstract int getBasicConstraints () grąžina sertifikato apribojimų kelio ilgį iš „BasicConstraints“ pratęsimas, jei jis apibrėžtas. Apribojimų kelias nurodo maksimalų CA sertifikatų, galinčių sekti šį sertifikatą sertifikavimo kelyje, skaičių.
  • viešas abstraktus loginis [] getKeyUsage () grąžina sertifikato paskirtį, užkoduotą KeyUsage pratęsimas.
  • public set getCriticalExtensionOIDs () ir public set getNonCriticalExtensionOIDs () grąžinti plėtinių, pažymėtų kritiškai ir nekritiškai, objektų identifikatorių (OID) rinkinį. OID yra sveikųjų skaičių seka, kuri visuotinai identifikuoja išteklius.

Nenoriu tavęs palikti be kodo, su kuriuo galėtum žaisti, todėl, užuot gilinęsis į CRL, kurie yra visa tema, aš pateiksiu kodą ir paliksiu CRL 3 daliai.

Kodas

Ši klasė parodo, kaip gauti sertifikatų gamyklą, kaip naudoti tą gamyklą, kad sugeneruotumėte sertifikatą iš DER koduoto failo failo ir kaip išskleisti ir rodyti informaciją apie sertifikatą. Jūs pastebėsite, kiek mažai turite jaudintis dėl pagrindinio kodavimo.