’Įߘ ‚ƒ Ž›Į ’Įą—ƒŒ įĖĶƒĶ‚— ’‚ą›‚œĶƒ Ė‚‡ŸĮ ąß‰œ
(Żß‹ ś‹–)

Į߂‡ X509CRL ß CRL ’‚ž‹š— ĖĶƒĶ‚—

Todd Sundsted :ą…Œßœ
JavaWorld.com
Ķ•Īß͟„ Ī‚œžŒ :݇ͅ›


ąšŠ
‚éPrivate Key ąé— ˜…‹ Ƌ‚œ› ’…Ķߍ ĶĖ Public-Key įĶĮ̘ Ī›Ķ ß ‚’Įߘ
Public Key įĶĮĢ˜Ī›Ķ ¬Ėߌ Ķ‚—ŒĮ Private Key ą—Ÿ›‚˜œ .˜œ‚›ƒ ’–‚ƒ ’ßŠ
’é™éĮ · (Certificate Revocation List) CRL .ĖĖ’› Å‹Ė ĪĮ ĮĶ ĖßŠĶ‚ƒ…Į
Ėéß› ĪĮ џ„ ‚’Įߘ ą— Å‹Į ’›Ÿ‹œ‚—› ß (Public Key Infrastructure) PKI
.ĖœĶŸĢ„’› ą›…‚Š ĶĶ–›

įĖĶéƒĶ‚é— ’‚éąé›‚œĶƒ ĶĖ ŽĄ ĖĶƒĶ‚— ąß‰œ ß X.509 ’‹Ķ̓ ąƒ ŽŸŒŸ„ ʉƒ› ĶĖ
.ˌ ĖĮߊ ’•͐› CRL ś‹– ޟĮ ĶĖ .Ż…ŠĮĖĶ„ Į߂‡





įĶĮĶé–Ķéƒ ß ‚›Œ ޟš ŽĄ ’Ÿ‚‹‚œŒ ’Į̓ ’›‹Ÿœ‚—› Public Key ß Private Key
‚é… ĖßéŒ’é› Ćéƒé‹ ¬‚é›éŒ şߝ ’‹Ķ̓ ‚ƒ Public Key .˜…‹ ɟ‰ łԂƒ…ĶĮ
.˜‚›ƒ ’–‚ƒ ’ßŠ Private Key

’é•éŠé› Private Key ąé— ŋĮ ͆ߛ ’…Ķߍ ĶĖ Public Key įĶĮĢ˜Ī›Ķ ąœ‚•‹‚…›
¬ĖĶéŸé˜ ĶĮĶé– įĶé˜ŸĖ ŅŠŒ Ķ‚Ÿ…ŠĮ ĶĖ ‚›Œ Private Key ’„— ͘Į .˜‚›ƒ ’–‚ƒ
.˟œ— т† ĮĶ Ėߊ şߝ ’—ŸœßĶ…—™Į ĶßŌ ąƒ ĖŸœĮ߅’›œ

Š‚é‹Į ŽĄ Ķéƒ ‚éCA ß ‚éPublic Key ¬‚青Įߘ ą— ’Ÿ‚œƒĶŸĪ ¬ÜŸšĖ ޟ› ąƒ
Åé‹éœŸĮ ͘œ‚Ÿƒ ’Įߘ ĶßĖ .ˌ‚ƒ ’Įߘ ߓ™ ß ĶßĖ ܛ‚Œ ˟‚ƒ Ėߌ’› ą…Š‚‹
Public Key ß ’éĮßé˜ ąƒ ŌßƒĶ› ąĶŒ…œ› ’Įߘ ĶĖ ąĖŒ įĶĮ̘ Ż‚œ şĖ߇ߛ ą—
.ŋĮ ąĖĮĖ Å‹Ė ĪĮ ĮĶ Ėߊ ş™ƒ‚– CA ’œŸ ’Įߘ ߓ™ .ˌ‚ƒ’› Ķ՜ ĖĶߛ

.˟ĮĪ•Į’› ’Įߘ ąƒ ĮĶ Ü‚ŸĶ‹ ąĶ‚›Œ ˜œ‚› ’…‚šŌĮ ’Įߘ ߓ™ Ż‚˜œ ĶĖ ¬CA





CRL
ß (’éĮßé˜ ß铙 ŹŸĶ‚… ˜œ‚›) ąŌßƒĶ› ’‚ąĖĮĖ ß Ü‚ŸĶ‹ ąĶ‚›Œ ĪĮ ’…‹Ÿ™ CRL
ĮĶ ‚éžéœĄ CA ą—Ÿ›‚˜œ .˜ߌ’› ŋĮߊĶĖ CA Ō‹ß… ß ĶĖ‚ ą— Å‹Į Public Key
ĖĶ韘’› ĶĮĶ– ’‹Ķ…‹Ė ĶĖ ’Įąœß˜ ąƒ ą—œŸĮ ‚Ÿ ’›ß› ŽĪŠ› ĶĖ CRL ¬Ėߛœ ĶĖ‚
’é‹ĶĶéƒ ŃĶŸĢ„ ĪĮ џ„ ĮĶ ‚’Įߘ ߓ™ şŽß ˜œĮ߅ƒ įĖĶƒĶ‚— ’‚ą›‚œĶƒ ą—
.˜Ÿ‚›œ

.ĖéŸĖĶé˜ ĶéŒé…霛 (Internet Engineering Task Force) IETF Ō‹ß… RFC 2459
Ė霜‚› Ϝ X.509 CRL ś͕ .˟‚›œ’› ؟͐… ĮĶ ‚X.509 CRL ś͕ RFC 2459
.ĖĖĶ阒› ҊŒ› (Abstract Syntax Notation One) ASN.1 Ė‚›œ ‚ƒ ’Įߘ
ŲéŸĶéé… ĮĶ ŻĶ•Åš„ ܖ…‹› į͜Ÿ‚ƒ ś͕ (Disinguished Encoding Rules) DER
.˜—’›

Óßé ĶĖ ß ŻĪĮĖĶé„’é›éœ ASN.1 Ė‚é›éœ ß DER įĶĮĢé˜ Ė— ʉƒ› ąƒ ŽŸĮ ĪĮ џƒ
.ŻĖ’› ɟŽß… ĮĶ Ž‚‹ Å—ĶŒ CRL API





CRL API
ŻéĮĶé• ĮĶ ŽĄ ąéƒ‚éŒé› Ϝ ß X.509 Ņ…Š› П•Ķ…œŸĮ CRL ’Į̓ Į߂‡ CRL API
.˜—’› ܛ ’Įߘ ’Į̓ ą— ąœß˜ Ž‚› ¬ĖĶߥ’›

Ššé— .Ėéœé—’é› ŲéŸĶéé… ĮĶ ’鞃‚Œ› П•Ķ…œŸĮ java.security.cert.CRL К—
(java.security.cert.CRL К— ąéœß˜ĶŸĪ) java.security.cert.X509CRL
.˜—’› ؟͐… X.509 Ņ…Š› П•Ķ…œŸĮ

įĖßĶß Ķ ąƒ ’ƒ‚Ÿ…‹Ė Ž‚—›Į java.security.cert.X509CRLEntry К— ş‚žœ ĶĖ
.ĖĶߥ’› ŻĮĶ• ĮĶ X.509 CRL



:ݟŸ‚›œ ’‹Ķ̓ ĮĶ Šš— Ķ ß…Ķ… ąƒ ĖŸĖ ąĪ‚‡Į


java.security.cert.CRL
ŽéŸĶé…雞› Ž› .˟‚›œ’› ؟͐… ĮĶ ‚CRL ÖĮߜĮ ą› ŚĶ…Œ› П•Ķ…œŸĮ Łß• К—
:Ėߛœ ŻĮߊ ɟ͌… ĮĶ Šš— ޟĮ Ė…›

‚ŸĄ ą— Ėœ— ’› ҊŒ› public boolean isRevoked(Certificate Certificate)
ÅĶßé ßé“é™ Åé‹éŸé™ ’é‹Ķ̓ ‚ƒ Ķ‚—œŸĮ) .͟Š ‚Ÿ ŋĮ ąĖŒ ߓ™ ҂Р’Įߘ ڟ
.(Ė͟˜’›


java.security.cert.X.509CRL
ąé•‚éŽĮ ĮĶ X.509 ąĻéŸß ĖĶé—é™é› ß ĖĖ’› ą‹ß… ĮĶ Łß• CRL К— ¬Šš— ޟĮ
:˜—’›

ĮĖ Ė…› instance Ō‹ß… ą— ĮĶ CRL ąĖŒ Ė— ŻĶ• public byte [] getEncoded()
.˜ĮĖ͘’› Ī‚ƒ ąĖŒ

Ī‚éééƒ CA Śé›é— ‚éƒ ĮĶ CRL ĪßĶ ąéƒ ŹéŸĶ‚é… public Date getNextUpdate()
ĶĖ‚é "ĮĖééƒ ‚é›Į ¬Ė錂ƒ ŹŸĶ‚… ŽĄ ĪĮ Ķ…ĖßΠ˜Į߅’› įːƒ CRL .˜ĮĖ͘’›
.Ėߌ’›œ

Ī‚éƒ ąĖß雜 ͌…œ› ĮĶ CRL ¬CA ą— ĮĶ ’ŠŸĶ‚… public Date getThisUpddate()
.˜ĮĖ͘’›

Åééé‹éŸé™ ’‚éįĖßĶß ŃĶ‚é›éŒ ’ĮĶéƒ ’韂éĖé…é› ’ß‚é‰ ĪéŸéœ X509CRL Кé—
’韂éĖé…é› ’߂‰ Ϝ X509CRL К— ąĶ‚ƒĶĖ Ž› .ŋĮ certificate revocation
Ššé— ąĶ‚éƒĶĖ Ž› .ŋĮ certificate revocation ŋŸ™ ’‚ įĖßĶß ŃĶ‚›Œ ’Į̓
:ĖĶ— ŻĮߊ щ ą›ĮĖĮ ĶĖ ĪŸœ X509CRLEntry

ąé— ĮĶ ’韂éįĖßĶß ĪĮ ’Įąéßé›é‡é› public Set getRevokedCertificates()
.˜ĮĖ͘’› Ī‚ƒ ¬Ėœ…‹ ‚’Įߘ ͘œ‚Ÿ‚›œ

public X509CRLEntry getRevokedCertificate(BigInteger serialnumber)
ĮĶ Åé‹Į ŅßééŠ› ܂ŸĶ‹ ąĶ‚›Œ ąĮĶ› ąƒ ’‚‡ĶĮ ’Įߘ ͘œ‚Ÿ‚›œ ą— ą—ŸŸĖßĶß
.˜ĮĖ͘’› Ī‚ƒ

.˜Ė’› ąģĮĶĮ CRL ąĶ‚ƒ ĶĖ ’…‚šŌĮ ą— Ėœ…‹ query ’‚Ė…› ¬‚Ė…› ąŸ–ƒ

.˜ĮĖ͘’› Ī‚ƒ ĮĶ CRL ąŠ‹œ ąĶ‚›Œ public int getVersion()

ąé— ĖéœĮĖĶé˜’é› Ī‚ƒ ĮĶ ’…‚šŌĮ public abstract Principal getIssuerDN()
.ˌ‚ƒ’› ¬Å‹Į ąĖĶ— ‚Ž›Į ĮĶ ŽĮ ą— ’…Ÿß ‚Ÿ CRL ąĖœœ— ĶĖ‚ ͘œ‚Ÿ‚›œ

¬public String getSigAlgOID() ¬public String getSigAlgName()
Ķ‚é— ąéƒ Żé…éŸĶߘ™Į ąĶ‚ƒĶĖ ĮĶ ’…‚šŌĮ public byte [] getSigAlgParams()
.˜œĮĖ͘’› Ī‚ƒ CRL ĶĖ ą…•Ķ

Ī‚éééƒ CRL ’ĮĶéƒ ĮĶ ‚éŽé›Į Ż‚éŠ Å‚éšéŌĮ public byte [] getSignature()
.˜ĮĖ͘’›

Ī‚éƒ CRL ŽéŸĮ ’ĮĶéƒ ĮĶ TBS ؟ĖĶ Å‚šŌĮ public byte [] getTBSCertList()
Ėé…é› ŽéŸĮ ĶĖ .ĖĶé— ĖéŸéĮß銜 ąĖ‚•…‹Į Ė…› ޟĮ ĪĮ ƙ’Į ą…ƒ™Į .˜ĮĖ͘’›
.˟Ÿ‚›œ ’Ÿ‚‹‚œŒ (API ĪĮ ĒĶ‚Š) ĮĶ CRL ‚Ž›Į ܖ…‹› ĶßŌ ąƒ ĖŸœĮ߅’›

ąéƒ ŌßéƒĶé› instance Ķ‚éƒé…éĮ ĪĮ͉Į ’Į̓ ’Ÿ‚Ė…› X509CRL К— ş‚žœ ĶĖ
:ĖĶĮĖ X509CRL

¬Åé‹Į ҊŒ› ћ‚œ ĪĮ ą— ąœß˜œ‚› public void verify(PublicKey publickey)
ąéƒ ŌßéƒĶé› Private Key ‚éƒ CRL ąéƒ ŌßéƒĶé› instance ‚é… Ėéœé—’› ’‹Ķ̓
.Ėߌ ޟŸ… Ķ՜ ĖĶߛ Public Key

Ė霜‚› public void verify(PublicKey publickey, String stringProvider)
ĖĖ’› Ż‚‡œĮ (ÓĶ• џ„ ÅĶߍƒ ąœ) ’‚Š ąĖœĖ ПßĶ‹ Ś›— ‚ƒ ĮĶ Łß• łŸ™›


java.security.cert.X509CRLEntry
ß getRevokedCertificates() :ĖĶĮĖ Ėééééééé…ééééééé› ßĖ Ššéééééé— ŽéééŸĮ
ĮĶ revocation Åé‹éŸé™ įĖßĶß Ėœˆ ‚Ÿ ڟ ßĖ Ķ ą— getRevokedCertificate()
.Ė霜ĮĖ͘’› Ī‚ƒ java.security.cert.X509CRLEntry К— ’‚instance ŽĮߜƒ
:˜ߌ’› ܛ‚Œ ĮĶ ‚įĖßĶß ŽŸĮ ąĶ‚ƒ ĶĖ ’…‚šŌĮ ͟Π’‚Ė…›

.˜ĮĖ͘ ’› Ī‚ƒ ĮĶ įĖßĶß ąĖŒ įĶĮ̘ Ī›Ķ Ü—Œ public byte[] getEncoded()

.˜ĮĖ͘’› Ī‚ƒ ĮĶ ’Įߘ ܂ŸĶ‹ ąĶ‚›Œ public BigInteger getSerialnumber()

.˜ĮĖ͘’› Ī‚ƒ ĮĶ ’Įߘ ߓ™ ŹŸĶ‚… public Date getRevocationDate()

ĖĶĮĖ ąĶ酋˜ CRL įĖßĶß ‚ŸĄ ą— Ėœ—’› ҊŒ› public boolean hasExtensions()
ŽéŸĮ ąéƒ ’é‹Ķé…é‹Ė Ž‚—›Į X.509 ’Įߘ ąĶ…‹˜ ˜œ‚› API ąœ‚•‹‚…› .͟Š ‚Ÿ
įĶĮĢé˜ Īé›Ķ Ü闌 ˟‚ƒ ‚ąĶ…‹˜ ąƒ ’ƒ‚Ÿ…‹Ė ’Į̓ .˜—’›œ ŻĮĶ• ĮĶ ‚ąĶ…‹˜
.˟Ÿ‚›œ ąŸĪ‡… ĮĶ getEncoded() Ė…› ĪĮ ܍‚‰ įĖßĶß ąĖŒ





Ė—
ĖéŸé™ß… ’Į̓ factory ĖĶƒĶ‚— ąß‰œ certificate factory ąŸž… ąß‰œ ͟ΠК—
.˟‚›œ’› ɟ͌… ĮĶ CRL łšŌĮ џ‚›œ ß ĒĮ͊…‹Į ąß‰œ ß X509 CRL


import java.io.FileInputStream;
import java.util.Set;
import java.util.Iterator;
import java.security.cert.CertificateFactory;
import java.security.cert.X509CRL;
import java.security.cert.X509CRLEntry;

public
class Main
{
  public
  static
  void
  main(String [] arstring)
  {
    try
    {
      // Get the correct certificate factory.
      CertificateFactory certificatefactory =
        CertificateFactory.getInstance("X.509");
      // Each file specified on the command line must contain a single
      // DER-encoded X.509 CRL.
      for (int i = 0; i < arstring.length; i++)
      {
        // Open the file.
        FileInputStream fileinputstream = new FileInputStream(arstring[i]);
        // Generate a certificate from the data in the file.
        X509CRL x509crl =
          (X509CRL)certificatefactory.generateCRL(fileinputstream);
        // Print out information about the crl.
        System.out.println("---CRL---");
        System.out.println("type = " +
          x509crl.getType());
        System.out.println("version = " +
          x509crl.getVersion());
        System.out.println("issuer = " +
          x509crl.getIssuerDN().getName());
        System.out.println("signing algorithm = " +
          x509crl.getSigAlgName());
        System.out.println("signing OID = " +
          x509crl.getSigAlgOID());
        System.out.println("this update = " +
          x509crl.getThisUpdate());
        System.out.println("next update = " +
          x509crl.getNextUpdate());
        System.out.println();
        // Next, let's print out information about the entries.
        System.out.println("---Entries---");
        Set setEntries = x509crl.getRevokedCertificates();
        if (setEntries != null && setEntries.isEmpty() == false)
        {
          for (Iterator iterator = setEntries.iterator();
               iterator.hasNext(); )
          {
            X509CRLEntry x509crlentry = (X509CRLEntry)iterator.next();
            System.out.println("serial number = " +
              x509crlentry.getSerialNumber());
            System.out.println("revocation date = " +
              x509crlentry.getRevocationDate());
            System.out.println("extensions = " +
              x509crlentry.hasExtensions());
            System.out.println();
          }
        }
        // We're done.
        System.out.println("---");
        // Close the file.
        fileinputstream.close();
      }
    }
    catch (Exception exception)
    {
      exception.printStackTrace();
    }
  }
}



.ĖéŸéŸ‚é›éœ Ü韂„›‚— ܟ‚• К— ąƒ ĮĶ Łß• ŋŸ™ ĶĖ Šš— ؟͐… ˟œĮ߅ƒ ˟‚ƒ
ŅéŠéŒé› Ž‚é›Ķé• ŌŠ ĶĖ ĮĶ CRL ܟ‚• ˜ˆ‚Ÿ ڟ ’›‚‹Į ˟‚ƒ К— ’Į͇Į Ż‚˜œ
.˟Ÿ‚›œ




‚ŃœŸĪ˜
Ć鋂éœé› įĖĶéƒĶ‚— ’‚ą›‚œĶƒ ĪĮ įĶ‚Ÿ‹ƒ ’Į̓ ß ’ßĶĶŽ ‚CRL ą—œŸĮ Ėß‡ß ‚ƒ
.˜ĶĮĖ ąĖ› ߏ ßĖ ‚›Į ¬Ėœ…‹

’…Ķ‚ƒ ąƒ .ĖĶĮĖ Push ÉĶŌ CRL ‘ŸĪ߅ .˜ĶĮĖ ’œ‚‹Ķ ĪßĶ ąƒ ĶŸŠ‚… ą—œŸĮ ÜßĮ
¬’é™é— ‘ŸĪ߅ Ō‚–œ ĶĖ ’œ‚›Ī ÜßĮˇ ĪĮ ’ސƒ ąƒ ą‡ß… ‚ƒ ĮĶ ĖŸĖ‡ ’‚CRL ¬CA
ĪßĶ ąéƒ ĮĶ ‚éžœĄ ŻÕœ› ĶßŌ ąƒ ĖŸ‚ƒ ‚CRL ĪĮ ąĖ‚•…‹Į ’Į̓ CA .ĖĖ’› ĶĮĶ–
’‚青霂é‹Ķ ĪßĶéƒ ąéƒ įĖĶéƒĶ‚— ’‚ą›‚œĶƒ ĪĮ ’ސƒ ŋĮ Ž—›› .˟‚›œ ’œ‚‹Ķ
Ķ‚é— ąéƒ ’‚青éĮߘ ’Į̓ ŏ‚‹ Ķ ¬CRL ڟ ˟‚Œ .˜Œ‚ƒ ą…ŒĮĖ Ī‚Ÿœ įĶ…ŒŸƒ
.Ėߌ ͌…œ› ř„Į Ė— ĶĖ ą…•Ķ

܂é†é› ’ĮĶéƒ .˜ߌ’› ͌…œ› ’…ƒ‚† Ž‚›Ī ĶĖ ‚’Įߘ .ŋĮ CRL ÜßŌ Ü—Œ› ŻßĖ
˟œĮ߅’› ¬Ėߌ ąĖĮĖ ÅŒ˜Ķƒ ‚Ž–œĮ ŹŸĶ‚… ĪĮ џ„ ˟‚ƒ ’Įߘ ڟ ͘Į .ĪßĶ ±ø°
Ė霂雃 CRL ĶĖ ĖŸ‚ƒ įĖßĶß .˟Ė Ż‚‡œĮ CRL ąƒ ’Įߘ ŽĖßĪ•Į ‚ƒ ĮĶ Ķ‚—œŸĮ
.Ė郂Ÿ Ō‹ƒ ˜Į߅’› CRL ˜…‹ Ė‚ŸĪ ‚revocation ͘Į .Ėߌ ’Ž–œ› ’Įߘ ‚…
’ƒ‹‚œ› ŃßĶ ŽŸĮ ą— Ėƒ‚Ÿ’› џĮĪ•Į PKI ąƒ ą‡ß… ‚ƒ CRL ÜßŌ Ō‹ß…› ¬ąœ‚•‹‚…›
.ŋŸœ įĶŸĢ„ ąĪĮ˜Į ş™ƒ‚– ’Į̓



ą‡Ÿ…œ
˜…‹ ˟•› ‚›Œ ޟš ŽĄ ŽĖœ‚‹‚œŒ ’Į̓ ą— ‚’Įߘ ĪĮ ąœß˜ˆ ˟…•‚ŸĶĖ ŚœŸĮ
Żßž•› ą— š‚‰ .˟Ÿ‚›œ ąĖ‚•…‹Į ˜ßĶ’› Ķ‚— ąƒ Private Key ’Į̓ ą— ‚CRL ß
ŻĶ‚žˆ ś‹– ĶĖ .˟͟˜ƒ ąĶžƒ ‚žœĄ ĪĮ ˟œĮ߅’› ¬ĖŸĖŒ ą‡ß…› ĮĶ ’Įߘ ß CRL
.ݟĪĮĖĶ„’› ‚’Įߘ ’™› įĖĶƒĶ‚— ’‚ą›‚œĶƒ ’‹Ķ̓ ąƒ


Copyright 2001, IT World / JavaWorld.com / PC WORLD Iran/International Data Group Inc. All rights reserved.


’‡œ‹Ķ՜
ޟĮ ĖĶߛ ĶĖ ĮĶ Ėߊ Ķ՜
:˟Ÿß˜ƒ ‚› ąƒ Ć™Ō›

ŃĪĶĮ ‚ƒ ’™ŸŠ -
ŃĪĶĮ ‚ƒ -
ŃĪĶĮ’ƒ -

’œ šßŌ ’™ŸŠ -
Ƌ‚œ› -
ą‚…ß— -

’Š… ’™ŸŠ -
Ćߙԛ -
ŋŸœ ’Š… ’•‚— ąĪĮ˜Į ąƒ -


:Ż‚œ

:ڟœßĶ…—™Į ŋ„

: Å—ĶŒ Ż‚œ

܃– ’‚Å›‹–
(ÜßĮ ś‹–) - ’Įߘ ‚ƒ Ž›Į ’Įą—ƒŒ įĖĶƒĶ‚— ’‚ą›‚œĶƒ Ė‚‡ŸĮ ąß‰œ
(ŻßĖ Å›‹–) - ’Įߘ ‚ƒ Ž›Į ’Įą—ƒŒ įĖĶƒĶ‚— ’‚ą›‚œĶƒ Ė‚‡ŸĮ ąß‰œ
(Żß‹ ś‹–) - ’Įߘ ‚ƒ Ž›Į ’Įą—ƒŒ įĖĶƒĶ‚— ’‚ą›‚œĶƒ Ė‚‡ŸĮ ąß‰œ