Programování

Vytvářejte zabezpečené síťové aplikace s certifikáty, část 2

Chcete-li vytvářet zabezpečené aplikace, musíte se naučit obchodní nástroje. Abych vám pomohl seznámit se s těmito koncepty, představil jsem vám v první části kryptografii veřejného klíče a vysvětlil, jak se vyhne problémům s výměnou klíčů, které doprovázejí kryptografii tajného klíče. Zkoumal jsem také vztah mezi důvěrou a škálovatelností kryptografie veřejného klíče a vysvětlil jsem, jak certifikáty a infrastruktura veřejného klíče (PKI) umožňují důvěru v širším měřítku, než jaké může sama kryptografie veřejného klíče dosáhnout. Nakonec jsem popsal certifikáty a řetězce certifikátů a vysvětlil, jak souvisí s CA (certifikační autority).

K dispozici je mnoho různých příchutí certifikátů, včetně SDSI (jednoduchá distribuovaná bezpečnostní infrastruktura), PGP (docela dobré soukromí) a X.509. Tento měsíc popíšu pro další rozšíření vaší slovní zásoby zabezpečení formát certifikátu, který vede balíček a je klíčovou součástí vznikajících standardů PKI: certifikát X.509.

Celou sérii si můžete přečíst na certifikátech:

  • Část 1: Certifikáty zvyšují hodnotu kryptografie veřejného klíče
  • Část 2: Naučte se používat certifikáty X.509
  • Část 3: Použijte třídy Java CRL a X509CRL
  • Část 4: Ověřte klienty a servery a ověřte řetězce certifikátů

Formát X.509 podrobně

Mezinárodní telekomunikační unie (ITU) vyvinula a zveřejnila formát certifikátu X.509, který byl vybrán pracovní skupinou Public Key Infrastructure X.509 (PKIX) pracovní skupiny Internet Engineering Task Force (IETF). Pokud zkratky označují sílu, X.509 má zjevně silné spojence.

Norma X.509 definuje formát certifikátu pomocí notace s názvem ASN.1 (Abstract Syntax Notation One). ASN.1 je standardizovaný jazyk, který popisuje abstraktní datové typy způsobem nezávislým na platformě.

Dokument „Internetová infrastruktura veřejného klíče X.509 - certifikát a profil CRL“ (viz Zdroje pro odkaz) publikovaný pracovní skupinou PKIX popisuje formát certifikátu X.509 ve smyslu zápisu ASN.1. Je to fascinující čtení, pokud vás takové věci zajímají.

Datový typ - například certifikát - definovaný v ASN.1 není užitečný, dokud nemůže jednoznačně definovat, jak reprezentovat instanci datového typu jako řadu bitů. Aby ASN.1 dal datovému typu tuto funkčnost, používá pravidla DER (Distinguished Encoding Rules), která definují, jak jednoznačně kódovat jakýkoli objekt ASN.1.

S kopií definice ASN.1 certifikátu X.509 a znalostí DER můžete napsat aplikaci Java, která bude číst a psát certifikáty X.509 a spolupracovat s podobnými aplikacemi napsanými v jiných programovacích jazycích. Naštěstí pravděpodobně nikdy nebudete muset dělat tolik problémů, protože Java 2 Platform, Standard Edition (J2SE) přichází s integrovanou podporou certifikátů X.509.

X.509 za (téměř) nic

Všechny třídy a rozhraní související s certifikátem jsou umístěny v balíčku java.security.cert. Stejně jako ostatní členové rodiny bezpečnostních rozhraní API společnosti Sun byl balíček certifikátů navržen podle paradigmatu továrny, ve kterém jedna nebo více tříd Java definuje obecné rozhraní pro zamýšlenou funkčnost balíčku. Třídy jsou abstraktní, takže aplikace je nemohou vytvářet přímo. Místo toho instance tovární třídy vytváří a vrací instance konkrétních podtypů abstraktních tříd. Paradigma továrny obchází silné psaní Javy, ale na oplátku umožňuje spuštění kódu bez rekompilace v širším rozsahu prostředí.

The certifikát java.security.cert a java.security.cert.CRL abstraktní třídy definují rozhraní. Představují certifikáty a seznamy odvolání certifikátů (CRL). The CertificateFactory třída je jejich továrna.

The java.security.cert balíček obsahuje konkrétní implementace Osvědčení a CRL abstraktní třídy: Osvědčení X509 a X509CRL třídy. Tyto dvě třídy implementují základní funkce certifikátu a CRL a poté je rozšíří o funkce specifické pro X.509. Když CertificateFactory instance vrací instanci kterékoli třídy, program ji může použít tak, jak je, nebo ji explicitně vrhnout do formuláře X.509.

V java.security.cert balíček, rozhraní X509Extension definuje rozhraní pro rozšíření certifikátu X.509. Rozšíření jsou volitelné součásti, které tvůrcům certifikátů poskytují mechanismus k přidružení dalších informací k certifikátu. Například certifikát může používat KeyUsage přípona označuje, že ji lze použít pro podepisování kódu.

The java.security.cert balíček obsahuje také třídu SPI (Service Provider Interface). A poskytovatel kryptografických služeb který si přeje podporovat typ certifikátu rozšiřuje SPI. Java 2 přichází s SPI pro certifikáty X.509.

Pojďme se podrobněji podívat na třídy a rozhraní v java.security.cert balík. Kvůli stručnosti budu diskutovat pouze o nejužitečnějších metodách. Chcete-li získat komplexnější pokrytí, doporučujeme vám přečíst si dokumentaci společnosti Sun. (Viz Zdroje.)

java.security.cert.CertificateFactory

Příběh začíná java.security.cert.CertificateFactory. The CertificateFactory třída má statické metody, které vytvářejí a CertificateFactory instance pro konkrétní typ certifikátu a metody, které vytvářejí jak certifikáty, tak CRL z dat dodávaných ve vstupním proudu. Stručně popíšu nejdůležitější metody a poté vysvětlím, jak tyto metody používat při generování certifikátů a CRL X.509. Později v článku představím kód, který demonstruje metody v akci.

  • public static CertificateFactory getInstance (String stringType) a public static CertificateFactory getInstance (String stringType, String stringProvider) vytvořit instanci a vrátit instanci továrny na certifikáty pro typ certifikátu určený parametrem stringType parametr. Například pokud je hodnota stringType je řetězec "X.509", obě metody vrátí instanci CertificateFactory třída vhodná pro vytváření instancí tříd Osvědčení X509 a X509CRL. Druhá metoda přijímá název konkrétního poskytovatele kryptografických služeb jako argument a používá tohoto poskytovatele místo výchozího.
  • veřejný konečný certifikát generateCertificate (InputStream inputstream) vytvoří instanci a vrátí certifikát pomocí dat načtených z dodaného InputStream instance. Pokud stream obsahuje více než jeden certifikát a stream podporuje označit() a resetovat () operace, metoda přečte jeden certifikát a ponechá stream umístěný před dalším.
  • veřejná finální sbírka generateCertificates (InputStream inputstream) vytvoří instanci a vrátí kolekci certifikátů pomocí dat načtených z dodaného InputStream instance. Pokud daný stream nepodporuje označit() a resetovat (), metoda spotřebuje celý stream.
  • veřejné konečné CRL generateCRL (InputStream inputstream) vytvoří instanci a vrátí CRL pomocí dat načtených z dodaného InputStream instance. Pokud stream obsahuje více než jeden seznam CRL a podporuje označit() a resetovat () operace, metoda načte jeden CRL a ponechá stream umístěný před dalším.
  • veřejná finální sbírka generateCRLs (InputStream inputstream) vytvoří instanci a vrátí kolekci CRL pomocí dat načtených z dodaného InputStream instance. Pokud daný stream nepodporuje označit() a resetovat (), veřejná finální sbírka generateCRLs (InputStream inputstream) spotřebuje celý stream.

Je důležité pochopit, jak se tyto čtyři metody chovají při generování instancí X.509 ze streamu dat. Podívejme se.

The generateCertificate () a generateCRL () metody očekávají, že obsah vstupního proudu bude obsahovat reprezentace certifikátu nebo CRL zakódované DER.

Oba generateCertificates () a generateCRLs () metody očekávají, že obsah vstupního proudu bude obsahovat buď sekvenci reprezentací kódovaných DER, nebo certifikát vyhovující PKCS # 7 (Public-Key Cryptography Standard # 7) nebo sadu CRL. (Odkazy najdete v Zdrojích.)

certifikát java.security.cert

certifikát java.security.cert definuje rozhraní společné pro všechny typy certifikátů: X.509, PGP a několik dalších. Nejdůležitější metody této třídy jsou:

  • public abstract PublicKey getPublicKey () vrací veřejný klíč související s instancí certifikátu, na kterém je tato metoda volána.
  • veřejný abstraktní bajt [] getEncoded () vrátí zakódovaný formulář tohoto certifikátu.
  • veřejné abstraktní neplatné ověření (PublicKey publickey) a veřejné abstraktní neplatné ověření (PublicKey publickey, String stringProvider) ověřte, zda soukromý klíč odpovídající zadanému veřejnému klíči podepsal dotyčný certifikát. Pokud se klíče neshodují, hodí obě metody a SignatureException.

certifikát java.security.cert.X509

Třída certifikát java.security.cert.X509 rozšiřuje Potvrzení třída popsaná výše a přidává funkce specifické pro X.509. Tato třída je důležitá, protože obvykle komunikujete s certifikáty na této úrovni, nikoli jako základní třída.

  • veřejný abstraktní bajt [] getEncoded () vrátí zakódovanou formu tohoto certifikátu, jak je uvedeno výše. Metoda používá pro certifikát kódování DER.

Většina z certifikát java.security.cert.X509Další funkce spočívají v dotazovacích metodách, které vracejí informace o certifikátu. Většinu těchto informací jsem představil v části 1. Zde jsou metody:

  • public abstract int getVersion () vrátí verzi certifikátu.
  • public abstract Principal getSubjectDN () vrací informace, které identifikují předmět certifikátu.
  • public abstract Principal getIssuerDN () vrací informace, které identifikují vydavatele certifikátu, kterým je obvykle CA, ale může být předmětem, pokud je certifikát podepsaný svým držitelem.
  • veřejný abstrakt Datum getNotBefore () a veřejný abstrakt Datum getNotAfter () návratové hodnoty, které omezují časové období, ve kterém je emitent ochoten ručit za veřejný klíč subjektu.
  • veřejný abstrakt BigInteger getSerialNumber () vrátí sériové číslo certifikátu. Kombinace jména vydavatele certifikátu a sériového čísla je jeho jedinečná identifikace. Tato skutečnost je zásadní pro zrušení certifikátu, kterému se budu podrobněji věnovat příští měsíc.
  • public abstract Řetězec getSigAlgName () a public abstract Řetězec getSigAlgOID () vrací informace o algoritmu použitém k podepsání certifikátu.

Následující metody vracejí informace o příponách definovaných pro certifikát. Nezapomeňte, že rozšíření jsou mechanismy pro přidružení informací k certifikátu; objevují se pouze na certifikátech verze 3.

  • public abstract int getBasicConstraints () vrátí délku cesty omezení certifikátu z BasicConstraints přípona, pokud je definována. Cesta omezení určuje maximální počet certifikátů CA, které mohou následovat po tomto certifikátu v certifikační cestě.
  • public abstract boolean [] getKeyUsage () vrátí účel certifikátu zakódovaný v souboru KeyUsage rozšíření.
  • veřejná sada getCriticalExtensionOIDs () a veřejná sada getNonCriticalExtensionOIDs () vrátit kolekci identifikátorů objektů (OID) pro rozšíření označená jako kritická a nekritická. OID je posloupnost celých čísel, která univerzálně identifikuje zdroj.

Nechci vás nechat bez kódu na hraní, takže místo toho, abych se ponořil do CRL, což je samo o sobě úplné téma, představím kód a nechám CRL pro část 3.

Kód

Následující třída ukazuje, jak získat továrnu na certifikáty, jak tuto továrnu použít ke generování certifikátu z reprezentace kódované DER v souboru a jak extrahovat a zobrazit informace o certifikátu. Všimnete si, jak málo se musíte starat o základní kódování.

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