Bina aplikasi rangkaian selamat dengan sijil, Bahagian 2

Untuk membina aplikasi yang selamat, anda mesti mempelajari alat perdagangan. Untuk membiasakan anda dengan konsep-konsep ini, saya memperkenalkan anda kepada kriptografi kunci awam di Bahagian 1 dan menerangkan bagaimana ia mengelakkan masalah pertukaran kunci yang menyertai kriptografi rahsia-kunci. Saya juga meneroka hubungan antara kepercayaan dan skalabilitas kriptografi kunci awam, dan menjelaskan bagaimana sijil dan infrastruktur kunci awam (PKI) membolehkan kepercayaan pada skala yang lebih luas daripada kriptografi kunci awam dengan sendirinya. Akhirnya, saya menerangkan sijil dan rantai sijil, dan menjelaskan bagaimana ia berkaitan dengan CA (pihak berkuasa sijil).

Terdapat pelbagai jenis sijil yang berbeza, termasuk SDSI (infrastruktur keselamatan diedarkan sederhana), PGP (privasi yang cukup baik), dan X.509. Bulan ini, untuk memperluas perbendaharaan kata keselamatan anda, saya akan menerangkan format sijil yang mengetuai pek dan merupakan komponen utama piawaian PKI yang baru muncul: sijil X.509.

Anda boleh membaca keseluruhan siri sijil:

  • Bahagian 1: Sijil menambah nilai kepada kriptografi kunci awam
  • Bahagian 2: Belajar menggunakan sijil X.509
  • Bahagian 3: Gunakan kelas Java CRL dan X509CRL
  • Bahagian 4: Mengesahkan klien dan pelayan, dan mengesahkan rantai sijil

Format X.509 secara terperinci

Kesatuan Telekomunikasi Antarabangsa (ITU) mengembangkan dan menerbitkan format sijil X.509, yang dipilih oleh kumpulan kerja Public Key Infrastructure X.509 (PKIX) dari Pasukan Petugas Kejuruteraan Internet (IETF). Sekiranya akronim menunjukkan kekuatan, X.509 jelas mempunyai sekutu yang kuat.

Dengan menggunakan notasi yang disebut ASN.1 (Abstrak Sintaks Notasi Satu), standard X.509 menentukan format sijil. ASN.1 adalah bahasa piawai yang menerangkan jenis data abstrak dengan cara bebas platform.

Dokumen "Internet X.509 Public Key Infrastructure - Certificate and CRL Profile" (lihat Sumber untuk pautan) yang diterbitkan oleh kumpulan kerja PKIX menerangkan format sijil X.509 dari segi notasi ASN.1. Bacaan menarik jika anda berminat dengan perkara semacam itu.

Jenis data - seperti sijil - yang didefinisikan dalam ASN.1 tidak berguna sehingga dapat dengan jelas menentukan cara mewakili contoh jenis data sebagai rangkaian bit. Untuk memberikan jenis data kefungsian itu, ASN.1 menggunakan Peraturan Pengekodan Terkenal (DER), yang menentukan cara mengekodkan objek ASN.1 secara unik.

Dengan salinan definisi ASN.1 sijil X.509 dan pengetahuan mengenai DER, anda boleh menulis aplikasi Java yang akan membaca dan menulis sijil X.509 dan bekerjasama dengan aplikasi serupa yang ditulis dalam bahasa pengaturcaraan lain. Nasib baik, anda mungkin tidak perlu menghadapi banyak masalah kerana Platform Java 2, Edisi Standard (J2SE) dilengkapi dengan sokongan terbina dalam untuk sijil X.509.

X.509 untuk (hampir) apa-apa

Semua kelas dan antara muka yang berkaitan dengan sijil terdapat dalam pakej java.security.cert. Seperti anggota API keselamatan keluarga Sun yang lain, pakej sijil dirancang di sekitar paradigma kilang, di mana satu atau lebih kelas Java menentukan antara muka generik untuk fungsi yang dimaksudkan oleh pakej. Kelasnya abstrak, jadi aplikasi tidak dapat menunjukkannya secara langsung. Sebaliknya, contoh kelas kilang membuat dan mengembalikan contoh subtipe kelas abstrak. Paradigma kilang mengelak daripada menaip kuat Java, tetapi sebagai balasannya, membenarkan kod tersebut berjalan tanpa penyusunan semula dalam lingkungan yang lebih luas.

Kelas java.security.cert.Certificatedan java.security.cert.CRLabstrak menentukan antara muka. Mereka masing-masing mewakili senarai pembatalan sijil (CRL). The CertificateFactorykelas adalah kilang mereka.

The java.security.certpakej mengandungi pelaksanaan konkrit Certificatedan CRLabstrak kelas: X509Certificatedan X509CRLkelas. Kedua-dua kelas ini melaksanakan sijil asas dan fungsi CRL, kemudian memperluasnya dengan fungsi khusus X.509. Apabila CertificateFactoryinstance mengembalikan instance dari kedua kelas, program dapat menggunakannya sebagaimana adanya atau secara eksplisit melemparkannya ke bentuk X.509.

Dalam java.security.certpakej, antara muka X509Extensionmenentukan antara muka untuk sambungan sijil X.509. Sambungan adalah komponen pilihan yang menyediakan mekanisme untuk pembuat sijil untuk mengaitkan maklumat tambahan dengan sijil. Sebagai contoh, sijil boleh menggunakan KeyUsagepeluasan untuk menunjukkan bahawa ia boleh digunakan untuk menandatangani kod.

The java.security.certpakej juga termasuk kelas Service Provider Interface (SPI). A pembekal perkhidmatan kriptografi yang ingin menyokong jenis sijil memanjangkan SPI. Java 2 dilengkapi dengan SPI untuk sijil X.509.

Mari lihat kelas dan antara muka yang lebih terperinci dalam java.security.certpakej. Untuk kepentingan singkat, saya hanya akan membincangkan kaedah yang paling berguna. Untuk liputan yang lebih komprehensif, saya menggalakkan anda membaca dokumentasi Sun. (Lihat Sumber.)

java.security.cert.CertificateFactory

Kisahnya bermula dengan java.security.cert.CertificateFactory. The CertificateFactorykelas mempunyai kaedah statik yang membuat CertificateFactorycontoh untuk jenis tertentu sijil, dan kaedah yang membuat kedua-dua sijil dan SPS daripada data yang dibekalkan dalam aliran input. Saya akan menerangkan secara ringkas kaedah terpenting, kemudian menerangkan cara menggunakan kaedah ini semasa menghasilkan sijil dan CRL X.509. Kemudian dalam artikel, saya akan membentangkan kod yang menunjukkan kaedah dalam tindakan.

  • public static CertificateFactory getInstance(String stringType)dan membuat public static CertificateFactory getInstance(String stringType, String stringProvider)dan mengembalikan contoh kilang sijil untuk jenis sijil yang ditentukan oleh stringTypeparameter. Sebagai contoh, jika nilai stringTypeadalah rentetan "X.509", kedua-dua kaedah akan mengembalikan contoh CertificateFactorykelas yang sesuai untuk membuat contoh kelas X509Certificatedan X509CRL. Kaedah kedua menerima nama penyedia perkhidmatan kriptografi tertentu sebagai argumen dan menggunakan penyedia itu dan bukannya lalai.
  • public final Certificate generateCertificate(InputStream inputstream)menunjukkan dan mengembalikan sijil menggunakan data yang dibaca dari InputStreamcontoh yang disediakan . Sekiranya aliran mengandungi lebih daripada satu sijil dan aliran menyokong mark()dan reset()operasi, kaedah akan membaca satu sijil dan membiarkan aliran diletakkan sebelum yang berikutnya.
  • public final Collection generateCertificates(InputStream inputstream)menunjukkan dan mengembalikan koleksi sijil menggunakan data yang dibaca dari InputStreamcontoh yang disediakan . Sekiranya aliran yang diberikan tidak menyokong mark()dan reset(), kaedah ini akan memakan keseluruhan aliran.
  • public final CRL generateCRL(InputStream inputstream)memberi contoh dan mengembalikan CRL menggunakan data yang dibaca dari InputStreamcontoh yang disediakan . Sekiranya aliran mengandungi lebih daripada satu CRL dan menyokong mark()dan reset()operasi, kaedah akan membaca satu CRL dan membiarkan aliran diletakkan sebelum yang berikutnya.
  • public final Collection generateCRLs(InputStream inputstream)memberi contoh dan mengembalikan koleksi CRL menggunakan data yang dibaca dari InputStreamcontoh yang disediakan . Sekiranya aliran yang diberikan tidak menyokong mark()dan reset(), public final Collection generateCRLs(InputStream inputstream)akan memakan keseluruhan aliran.

Penting untuk memahami bagaimana keempat-empat kaedah tersebut bertindak semasa menghasilkan X.509 kejadian dari aliran data. Mari kita lihat.

Yang generateCertificate()dan generateCRL()kaedah mengharapkan kandungan aliran input yang mengandungi perwakilan berkod DER suatu perakuan atau CRL, masing-masing.

Kedua-dua kaedah generateCertificates()dan generateCRLs()kaedah mengharapkan kandungan aliran input mengandungi urutan representasi yang dikodkan DER atau sijil yang sesuai atau PKCS # 7 (Piawai Kriptografi Piawai Umum # 7) atau set CRL. (Lihat Sumber untuk pautan.)

java.security.cert.Sijil

java.security.cert.Certificatementakrifkan antara muka yang biasa untuk semua jenis sijil: X.509, PGP, dan sebilangan kecil yang lain. Kaedah terpenting kelas ini adalah:

  • public abstract PublicKey getPublicKey() mengembalikan kunci awam yang berkaitan dengan contoh sijil di mana kaedah ini dipanggil.
  • public abstract byte [] getEncoded() mengembalikan borang yang dikod sijil itu.
  • public abstract void verify(PublicKey publickey)dan public abstract void verify(PublicKey publickey, String stringProvider)mengesahkan bahawa kunci peribadi yang sepadan dengan kunci awam yang dibekalkan menandatangani sijil yang berkenaan. Sekiranya kunci tidak sepadan, kedua kaedah membuang a SignatureException.

java.security.cert.X509Sijil

Kelas java.security.cert.X509Certificatememperluas Certficatekelas yang dinyatakan di atas dan menambah fungsi khusus X.509. Kelas ini penting kerana anda biasanya berinteraksi dengan sijil pada tahap ini, bukan sebagai kelas asas.

  • public abstract byte [] getEncoded()mengembalikan bentuk sijil yang dikodkan, seperti di atas. Kaedah menggunakan pengekodan DER untuk sijil.

Sebilangan besar java.security.cert.X509Certificatefungsi tambahan terdiri daripada kaedah pertanyaan yang mengembalikan maklumat mengenai sijil. Saya menyampaikan sebahagian besar maklumat tersebut di Bahagian 1. Berikut kaedahnya:

  • public abstract int getVersion() mengembalikan versi sijil.
  • public abstract Principal getSubjectDN() mengembalikan maklumat yang mengenal pasti subjek sijil.
  • public abstract Principal getIssuerDN() mengembalikan maklumat yang mengenal pasti penerbit sijil, yang biasanya CA, tetapi boleh menjadi subjek jika sijil ditandatangani sendiri.
  • public abstract Date getNotBefore()dan public abstract Date getNotAfter()mengembalikan nilai yang menyekat jangka masa di mana penerbit bersedia untuk menjamin kunci awam subjek.
  • public abstract BigInteger getSerialNumber()mengembalikan nombor siri sijil. Gabungan nama penerbit sijil dan nombor siri adalah pengenalan uniknya. Fakta itu penting untuk pembatalan sijil, yang akan saya bincangkan dengan lebih terperinci bulan depan.
  • public abstract String getSigAlgName()dan public abstract String getSigAlgOID()mengembalikan maklumat mengenai algoritma yang digunakan untuk menandatangani sijil.

Kaedah berikut mengembalikan maklumat mengenai peluasan yang ditentukan untuk sijil. Ingat, sambungan adalah mekanisme untuk mengaitkan maklumat dengan sijil; mereka hanya muncul pada sijil versi 3.

  • public abstract int getBasicConstraints()mengembalikan panjang jalur kekangan sijil dari BasicConstraintspeluasan, jika ditentukan. Laluan kekangan menentukan bilangan maksimum sijil CA yang mungkin mengikuti sijil ini dalam jalur pensijilan.
  • public abstract boolean [] getKeyUsage()mengembalikan tujuan sijil seperti yang dikodkan dalam KeyUsagepelanjutan.
  • public Set getCriticalExtensionOIDs()dan public Set getNonCriticalExtensionOIDs()mengembalikan koleksi pengecam objek (OID) untuk sambungan yang bertanda kritikal dan tidak kritikal. OID adalah urutan bilangan bulat yang mengenal pasti sumber secara universal.

Saya tidak mahu meninggalkan anda tanpa kod untuk dimainkan, jadi daripada membahas CRL, yang merupakan topik yang lengkap, saya akan membentangkan kod dan meninggalkan CRL untuk Bahagian 3.

Kodnya

Kelas berikut menunjukkan cara mendapatkan kilang sijil, cara menggunakan kilang itu untuk menghasilkan sijil dari perwakilan yang dikodkan DER dalam fail, dan cara mengekstrak dan memaparkan maklumat mengenai sijil. Anda akan menyedari betapa anda tidak perlu risau tentang pengekodan yang mendasari.