Programovanie

Zostavte zabezpečené sieťové aplikácie s certifikátmi, časť 2

Ak chcete vytvárať bezpečné aplikácie, musíte sa naučiť remeselné nástroje. Aby som vám pomohol oboznámiť sa s týmito pojmami, predstavil som vám v časti 1 kryptografiu s verejným kľúčom a vysvetlil, ako sa vyhýba problémom s výmenou kľúčov, ktoré sprevádzajú kryptografiu s tajným kľúčom. Skúmal som tiež vzťah medzi dôverou a škálovateľnosťou kryptografie verejného kľúča a vysvetlil som, ako certifikáty a infraštruktúra verejného kľúča (PKI) umožňujú dôveru v širšom meradle, ako je možné pomocou kryptografie verejného kľúča. Na záver som popísal certifikáty a reťazce certifikátov a vysvetlil ich vzťah k CA (certifikačné autority).

K dispozícii je veľa rôznych príchutí certifikátov, vrátane SDSI (jednoduchá distribuovaná bezpečnostná infraštruktúra), PGP (celkom dobré súkromie) a X.509. Tento mesiac popíšem tento formát certifikátu, ktorý vedie tento balíček a ktorý je kľúčovým komponentom nových štandardov PKI: certifikát X.509, aby sa ešte viac rozšírila vaša bezpečnostná slovná zásoba.

Celú sériu si môžete prečítať na certifikátoch:

  • Časť 1: Certifikáty zvyšujú hodnotu kryptografie verejného kľúča
  • Časť 2: Naučte sa používať certifikáty X.509
  • Časť 3: Používajte triedy Java CRL a X509CRL
  • Časť 4: Autentifikácia klientov a serverov a overenie reťazcov certifikátov

Formát X.509 podrobne

Medzinárodná telekomunikačná únia (ITU) vyvinula a zverejnila formát certifikátu X.509, ktorý si vybrala pracovná skupina Public Key Infrastructure X.509 (PKIX) pracovnej skupiny Internet Engineering Task Force (IETF). Ak akronymy naznačujú silu, X.509 má zjavne mocných spojencov.

Norma X.509 pomocou zápisu s názvom ASN.1 (Abstract Syntax Notation One) definuje formát certifikátu. ASN.1 je štandardizovaný jazyk, ktorý popisuje abstraktné dátové typy spôsobom nezávislým na platforme.

Dokument „Infraštruktúra verejného kľúča Internet X.509 - certifikát a profil CRL“ (pozri Zdroje pre odkaz) publikovaný pracovnou skupinou PKIX popisuje formát certifikátu X.509 v zmysle notácie ASN.1. Ak vás niečo také zaujíma, je to fascinujúce čítanie.

Dátový typ - napríklad certifikát - definovaný v ASN.1 nie je užitočný, kým nemôže jednoznačne definovať, ako reprezentovať inštanciu dátového typu ako sériu bitov. Na zabezpečenie funkčnosti dátového typu používa ASN.1 Pravidlá rozlíšeného kódovania (DER), ktoré definujú, ako jedinečne kódovať akýkoľvek objekt ASN.1.

S kópiou definície ASN.1 certifikátu X.509 a znalosťou DER môžete napísať aplikáciu Java, ktorá bude čítať a písať certifikáty X.509 a spolupracovať s podobnými aplikáciami napísanými v iných programovacích jazykoch. Našťastie už pravdepodobne nebudete musieť toľko problémov robiť, pretože platforma Java 2 Standard Edition (J2SE) je vybavená vstavanou podporou certifikátov X.509.

X.509 za (takmer) nič

Všetky triedy a rozhrania súvisiace s certifikátmi sa nachádzajú v balíku java.security.cert. Rovnako ako ostatní členovia rodiny bezpečnostných rozhraní API spoločnosti Sun, aj balík certifikátov bol navrhnutý na základe továrenskej paradigmy, v ktorej jedna alebo viac tried Java definuje všeobecné rozhranie pre zamýšľanú funkčnosť balíka. Triedy sú abstraktné, takže aplikácie ich nemôžu vytvárať okamžite. Namiesto toho inštancia továrenskej triedy vytvára a vracia inštancie konkrétnych podtypov abstraktných tried. Továrenská paradigma obchádza silné písanie v Jave, ale na oplátku umožňuje, aby bol kód spustený bez opätovnej kompilácie v širšom rozsahu prostredí.

The java.security.cert.Certifikát a java.security.cert.CRL abstraktné triedy definujú rozhranie. Predstavujú certifikáty a zoznamy zrušených certifikátov (CRL). The CertificateFactory triedy je ich továreň.

The java.security.cert balíček obsahuje konkrétne implementácie Osvedčenie a CRL abstraktné triedy: Certifikát X509 a X509CRL triedy. Tieto dve triedy implementujú základné funkcie certifikátu a CRL a potom ich rozširujú o funkcie špecifické pre X.509. Keď CertificateFactory inštancia vráti inštanciu ktorejkoľvek triedy, program ju môže použiť tak, ako je, alebo ju explicitne preniesť do formulára X.509.

V java.security.cert balík, rozhranie X509Rozšírenie definuje rozhranie k príponám certifikátu X.509. Prípony sú voliteľné komponenty, ktoré tvorcom certifikátov poskytujú mechanizmus na priradenie ďalších informácií k certifikátu. Napríklad certifikát môže používať KeyUsage rozšírenie, ktoré označuje, že sa dá použiť na podpisovanie kódu.

The java.security.cert balík obsahuje aj triedu SPI (Service Provider Interface). A poskytovateľ kryptografických služieb ktorý chce podporovať typ certifikátu rozširuje SPI. Java 2 je dodávaný s SPI pre certifikáty X.509.

Pozrime sa podrobnejšie na triedy a rozhrania v java.security.cert balíček. Kvôli stručnosti budem diskutovať iba o najužitočnejších metódach. Pre komplexnejšie pokrytie vám odporúčam prečítať si dokumentáciu spoločnosti Sun. (Pozri zdroje.)

java.security.cert.CertificateFactory

Príbeh sa začína java.security.cert.CertificateFactory. The CertificateFactory trieda má statické metódy, ktoré vytvárajú a CertificateFactory inštancia pre konkrétny typ certifikátu a metódy, ktoré vytvárajú certifikáty aj CRL z údajov dodávaných vo vstupnom toku. Stručne popíšem najdôležitejšie metódy a potom vysvetlím, ako ich používať pri generovaní certifikátov a CRL X.509. Ďalej v článku predstavím kód, ktorý demonštruje metódy v praxi.

  • verejný statický CertificateFactory getInstance (String stringType) a verejný statický CertificateFactory getInstance (String stringType, String stringProvider) vytvoriť inštanciu a vrátiť inštanciu továrne na certifikáty pre typ certifikátu určený serverom stringType parameter. Napríklad ak je hodnota stringType je reťazec "X.509", obidve metódy vrátia inštanciu súboru CertificateFactory trieda vhodná na vytváranie inštancií tried Certifikát X509 a X509CRL. Druhá metóda akceptuje ako argument meno konkrétneho poskytovateľa kryptografických služieb a použije tohto poskytovateľa namiesto predvoleného.
  • verejné konečné osvedčenie generateCertificate (InputStream inputstream) vytvorí inštanciu a vráti certifikát pomocou údajov načítaných z dodaného InputStream inštancia. Ak stream obsahuje viac ako jeden certifikát a stream podporuje značka () a reset () operácií, metóda načíta jeden certifikát a ponechá prúd umiestnený pred ďalším.
  • verejná konečná zbierka generateCertificates (InputStream inputstream) vytvorí inštanciu a vráti kolekciu certifikátov pomocou údajov načítaných z dodaného InputStream inštancia. Ak daný stream nepodporuje značka () a reset (), metóda spotrebuje celý stream.
  • verejné konečné CRL generateCRL (InputStream inputstream) vytvorí inštanciu a vráti CRL pomocou údajov načítaných z dodaného InputStream inštancia. Ak stream obsahuje viac ako jeden CRL a podporuje značka () a reset () operácií, metóda načíta jedno CRL a ponechá stream umiestnený pred ďalším.
  • verejná konečná zbierka generateCRL (InputStream inputstream) vytvorí inštancie a vráti kolekciu CRL pomocou údajov načítaných z dodaného súboru InputStream inštancia. Ak daný stream nepodporuje značka () a reset (), verejná konečná zbierka generateCRL (InputStream inputstream) spotrebuje celý prúd.

Je dôležité pochopiť, ako sa tieto štyri metódy správajú pri generovaní inštancií X.509 z toku údajov. Pozrime sa.

The generateCertificate () a generateCRL () metódy očakávajú, že obsah vstupného toku bude obsahovať reprezentácie certifikátu alebo CRL zakódované v DER.

Obaja generateCertificates () a generateCRLs () metódy očakávajú, že obsah vstupného toku bude obsahovať buď sekvenciu reprezentácií kódovaných DER, alebo certifikát vyhovujúci PKCS # 7 (Public-Key Cryptography Standard # 7) alebo sadu CRL. (Odkazy nájdete v zdrojoch.)

java.security.cert.Certifikát

java.security.cert.Certifikát definuje rozhranie spoločné pre všetky typy certifikátov: X.509, PGP a niekoľko ďalších. Najdôležitejšie metódy tejto triedy sú:

  • public abstract PublicKey getPublicKey () vráti verejný kľúč súvisiaci s inštanciou certifikátu, na ktorý sa táto metóda volá.
  • verejný abstraktný bajt [] getEncoded () vráti zašifrovanú formu tohto certifikátu.
  • verejné abstraktné neplatné overenie (PublicKey publickey) a verejné abstraktné neplatné overenie (PublicKey publickey, String stringProvider) overte, či súkromný kľúč zodpovedajúci dodanému verejnému kľúču podpísal predmetný certifikát. Ak sa kľúče nezhodujú, obidve metódy hodia a Podpisová výnimka.

java.security.cert.X509Certifikát

Trieda java.security.cert.X509Certifikát rozširuje Osvedčenie triedy popísanej vyššie a pridáva funkcionalitu špecifickú pre X.509. Táto trieda je dôležitá, pretože zvyčajne pracujete s certifikátmi na tejto úrovni, nie ako so základnou triedou.

  • verejný abstraktný bajt [] getEncoded () vráti zakódovanú formu tohto certifikátu, ako je uvedené vyššie. Metóda používa pre certifikát kódovanie DER.

Väčšina z java.security.cert.X509CertifikátĎalšia funkčnosť spočíva v metódach dotazu, ktoré vracajú informácie o certifikáte. Väčšinu týchto informácií som predstavil v časti 1. Tu sú metódy:

  • public abstract int getVersion () vráti verziu certifikátu.
  • verejný abstrakt Principal getSubjectDN () vráti informáciu, ktorá identifikuje predmet certifikátu.
  • verejný abstrakt Principal getIssuerDN () vráti informácie, ktoré identifikujú vydavateľa certifikátu, ktorým je zvyčajne CA, ale môžu byť predmetom, ak je certifikát podpísaný sám sebou.
  • verejný abstrakt Dátum getNotBefore () a verejný abstrakt Dátum getNotAfter () návratové hodnoty, ktoré obmedzujú časové obdobie, v ktorom je emitent ochotný zaručiť verejný kľúč subjektu.
  • verejný abstrakt BigInteger getSerialNumber () vráti sériové číslo certifikátu. Kombinácia mena vydavateľa certifikátu a sériového čísla je jeho jedinečná identifikácia. Táto skutočnosť je rozhodujúca pre odvolanie certifikátu, o ktorom sa budem podrobnejšie zaoberať budúci mesiac.
  • verejný abstrakt Reťazec getSigAlgName () a verejný abstrakt Reťazec getSigAlgOID () vráti informácie o algoritme použitom na podpísanie certifikátu.

Nasledujúce metódy vrátia informácie o rozšíreniach definovaných pre certifikát. Pamätajte, že rozšírenia sú mechanizmy na priradenie informácií k certifikátu; objavujú sa iba na certifikátoch verzie 3.

  • public abstract int getBasicConstraints () vráti dĺžku cesty obmedzení certifikátu z Základné obmedzenia rozšírenie, ak je definované. Cesta obmedzení určuje maximálny počet certifikátov CA, ktoré môžu nasledovať po tomto certifikáte v certifikačnej ceste.
  • public abstract boolean [] getKeyUsage () vráti účel certifikátu, ako je zakódovaný v KeyUsage predĺženie.
  • verejná množina getCriticalExtensionOIDs () a verejná sada getNonCriticalExtensionOIDs () vráti kolekciu identifikátorov objektov (OID) pre prípony označené ako kritické a nekritické. OID je sekvencia celých čísel, ktorá univerzálne identifikuje zdroj.

Nechcem vás nechať bez kódu na hranie, takže namiesto toho, aby som sa ponoril do CRL, čo je samo o sebe úplná téma, predstavím kód a ponechám CRL pre 3. časť.

Kód

Nasledujúca trieda ukazuje, ako získať továreň na certifikáty, ako ju používať na generovanie certifikátu z reprezentácie kódovanej DER v súbore a ako extrahovať a zobraziť informácie o certifikáte. Všimnete si, ako málo sa musíte starať o základné kódovanie.

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