Buat aplikasi jaringan yang aman dengan sertifikat, Bagian 2

Untuk membangun aplikasi yang aman, Anda harus mempelajari alat perdagangan. Untuk membantu Anda memahami konsep-konsep ini, saya memperkenalkan Anda pada kriptografi kunci publik di Bagian 1 dan menjelaskan bagaimana cara menghindari masalah pertukaran kunci yang menyertai kriptografi kunci-rahasia. Saya juga menjelajahi hubungan antara kepercayaan dan skalabilitas kriptografi kunci publik, dan menjelaskan bagaimana sertifikat dan infrastruktur kunci publik (PKI) memungkinkan kepercayaan pada skala yang lebih luas daripada yang dapat dicapai sendiri oleh kriptografi kunci publik. Akhirnya, saya menjelaskan sertifikat dan rantai sertifikat, dan menjelaskan bagaimana kaitannya dengan CA (otoritas sertifikat).

Berbagai jenis sertifikat tersedia, termasuk SDSI (infrastruktur keamanan terdistribusi sederhana), PGP (privasi cukup baik), dan X.509. Bulan ini, untuk lebih memperluas kosakata keamanan Anda, saya akan menjelaskan format sertifikat yang memimpin paket dan merupakan komponen kunci dari standar PKI yang muncul: sertifikat X.509.

Anda dapat membaca keseluruhan seri tentang sertifikat:

  • Bagian 1: Sertifikat menambah nilai pada kriptografi kunci publik
  • Bagian 2: Belajar menggunakan sertifikat X.509
  • Bagian 3: Gunakan kelas Java CRL dan X509CRL
  • Bagian 4: Mengautentikasi klien dan server, dan memverifikasi rantai sertifikat

Format X.509 secara detail

International Telecommunication Union (ITU) mengembangkan dan menerbitkan format sertifikat X.509, yang dipilih oleh kelompok kerja Public Key Infrastructure X.509 (PKIX) dari Internet Engineering Task Force (IETF). Jika akronim menunjukkan kekuatan, X.509 jelas memiliki sekutu yang kuat.

Menggunakan notasi yang disebut ASN.1 (Abstract Syntax Notation One), standar X.509 mendefinisikan format sertifikat. ASN.1 adalah bahasa standar yang mendeskripsikan tipe data abstrak dengan cara yang tidak bergantung platform.

Dokumen "Infrastruktur Kunci Publik Internet X.509 - Sertifikat dan Profil CRL" (lihat Sumberdaya untuk tautan) yang diterbitkan oleh kelompok kerja PKIX menjelaskan format sertifikat X.509 dalam hal notasi ASN.1. Ini adalah bacaan yang menarik jika Anda tertarik dengan hal semacam itu.

Tipe data - seperti sertifikat - yang didefinisikan dalam ASN.1 tidak berguna hingga dapat mendefinisikan secara jelas bagaimana merepresentasikan sebuah instance tipe data sebagai rangkaian bit. Untuk memberikan tipe data fungsionalitas itu, ASN.1 menggunakan Distinguished Encoding Rules (DER), yang menentukan cara menyandikan objek ASN.1 secara unik.

Dengan salinan definisi ASN.1 sertifikat X.509 dan pengetahuan tentang DER, Anda dapat menulis aplikasi Java yang akan membaca dan menulis sertifikat X.509 dan beroperasi dengan aplikasi serupa yang ditulis dalam bahasa pemrograman lain. Untungnya, Anda mungkin tidak perlu bersusah payah karena Platform Java 2, Edisi Standar (J2SE) hadir dengan dukungan bawaan untuk sertifikat X.509.

X.509 untuk (hampir) tidak ada

Semua kelas dan antarmuka terkait sertifikat berada di dalam paket java.security.cert. Seperti anggota lain dari keluarga API keamanan Sun, paket sertifikat dirancang dengan paradigma pabrik, di mana satu atau lebih kelas Java mendefinisikan antarmuka umum ke fungsionalitas paket yang dimaksudkan. Kelas-kelasnya abstrak, jadi aplikasi tidak bisa membuat instance langsung. Sebaliknya, instance kelas pabrik membuat dan mengembalikan instance dari subtipe tertentu kelas abstrak. Paradigma pabrik mengelak dari pengetikan yang kuat pada Java, tetapi sebagai gantinya, mengizinkan kode untuk berjalan tanpa kompilasi ulang di lingkungan yang lebih luas.

Kelas java.security.cert.Certificatedan java.security.cert.CRLabstrak menentukan antarmuka. Mereka masing-masing mewakili sertifikat dan daftar pencabutan sertifikat (CRL). The CertificateFactorykelas pabrik mereka.

The java.security.certpaket berisi implementasi konkret dari Certificatedan CRLabstrak kelas: X509Certificatedan X509CRLkelas. Kedua kelas ini mengimplementasikan sertifikat dasar dan fungsionalitas CRL, lalu memperluasnya dengan fungsionalitas khusus X.509. Ketika sebuah CertificateFactoryinstance mengembalikan sebuah instance dari salah satu kelas, sebuah program dapat menggunakannya sebagaimana adanya atau secara eksplisit mentransmisikannya ke formulir X.509.

Dalam java.security.certpaketnya, antarmuka X509Extensionmendefinisikan antarmuka ke ekstensi sertifikat X.509. Ekstensi adalah komponen opsional yang menyediakan mekanisme bagi pembuat sertifikat untuk mengaitkan informasi tambahan dengan sertifikat. Misalnya, sertifikat dapat menggunakan KeyUsageekstensi untuk menunjukkan bahwa itu dapat digunakan untuk penandatanganan kode.

The java.security.certpaket juga termasuk Service Provider Interface (SPI) kelas. Sebuah penyedia layanan kriptografi yang ingin mendukung jenis sertifikat meluas SPI tersebut. Java 2 dilengkapi dengan SPI untuk sertifikat X.509.

Mari kita lihat lebih detail kelas dan antarmuka dalam java.security.certpaket. Demi singkatnya, saya hanya akan membahas metode yang paling berguna. Untuk liputan yang lebih komprehensif, saya mendorong Anda untuk membaca dokumentasi Sun. (Lihat Sumber.)

java.security.cert.CertificateFactory

Ceritanya dimulai dengan java.security.cert.CertificateFactory. The CertificateFactorykelas memiliki metode statis yang menciptakan CertificateFactorycontoh untuk jenis tertentu dari sertifikat, dan metode yang membuat kedua sertifikat dan CRL dari data yang diberikan dalam input stream. Saya akan menjelaskan secara singkat metode yang paling penting, kemudian menjelaskan cara menggunakan metode ini saat membuat sertifikat X.509 dan CRL. Nanti di artikel ini, saya akan menyajikan kode yang mendemonstrasikan metode dalam tindakan.

  • public static CertificateFactory getInstance(String stringType)dan membuat public static CertificateFactory getInstance(String stringType, String stringProvider)instance dan mengembalikan instance dari pabrik sertifikat untuk jenis sertifikat yang ditentukan oleh stringTypeparameter. Misalnya, jika nilainya stringTypeadalah string "X.509", kedua metode akan mengembalikan instance CertificateFactorykelas yang sesuai untuk membuat instance kelas X509Certificatedan X509CRL. Metode kedua menerima nama penyedia layanan kriptografi tertentu sebagai argumen dan menggunakan penyedia tersebut sebagai ganti default.
  • public final Certificate generateCertificate(InputStream inputstream)membuat instance dan mengembalikan sertifikat menggunakan data yang dibaca dari InputStreaminstance yang disediakan . Jika aliran berisi lebih dari satu sertifikat dan aliran mendukung operasi mark()dan reset(), metode akan membaca satu sertifikat dan membiarkan aliran diposisikan sebelum berikutnya.
  • public final Collection generateCertificates(InputStream inputstream)membuat instance dan mengembalikan koleksi sertifikat menggunakan data yang dibaca dari InputStreaminstance yang disediakan . Jika aliran yang diberikan tidak mendukung mark()dan reset(), metode ini akan menggunakan seluruh aliran.
  • public final CRL generateCRL(InputStream inputstream)membuat instance dan mengembalikan CRL menggunakan data yang dibaca dari InputStreaminstance yang disediakan . Jika aliran berisi lebih dari satu CRL dan mendukung operasi mark()dan reset(), metode akan membaca satu CRL dan membiarkan aliran diposisikan sebelum CRL berikutnya.
  • public final Collection generateCRLs(InputStream inputstream)membuat instance dan mengembalikan kumpulan CRL menggunakan data yang dibaca dari InputStreaminstance yang disediakan . Jika aliran yang diberikan tidak mendukung mark()dan reset(), public final Collection generateCRLs(InputStream inputstream)akan menghabiskan seluruh aliran.

Penting untuk memahami bagaimana keempat metode tersebut berperilaku saat membuat instans X.509 dari aliran data. Mari lihat.

Metode generateCertificate()dan generateCRL()mengharapkan konten aliran masukan masing-masing berisi representasi yang dikodekan DER dari sertifikat atau CRL.

Baik metode generateCertificates()dan generateCRLs()mengharapkan konten aliran input berisi urutan representasi yang dikodekan DER atau sertifikat yang sesuai dengan PKCS # 7 (Standar Kriptografi Kunci Publik # 7) atau kumpulan CRL. (Lihat Sumberdaya untuk link.)

java.security.cert.Certificate

java.security.cert.Certificatemendefinisikan antarmuka yang umum untuk semua jenis sertifikat: X.509, PGP, dan beberapa lainnya. Metode terpenting kelas ini adalah:

  • public abstract PublicKey getPublicKey() mengembalikan kunci publik yang terkait dengan contoh sertifikat tempat metode ini dipanggil.
  • public abstract byte [] getEncoded() mengembalikan formulir yang disandikan sertifikat itu.
  • public abstract void verify(PublicKey publickey)dan public abstract void verify(PublicKey publickey, String stringProvider)verifikasi bahwa kunci pribadi yang sesuai dengan kunci publik yang disediakan menandatangani sertifikat yang dipermasalahkan. Jika kunci tidak cocok, kedua metode melempar SignatureException.

java.security.cert.X509Certificate

Kelas tersebut java.security.cert.X509Certificatememperluas Certficatekelas yang dijelaskan di atas dan menambahkan fungsionalitas khusus X.509. Kelas ini penting karena Anda biasanya berinteraksi dengan sertifikat di tingkat ini, bukan sebagai kelas dasar.

  • public abstract byte [] getEncoded()mengembalikan bentuk yang disandikan dari sertifikat itu, seperti di atas. Metode ini menggunakan pengkodean DER untuk sertifikat.

Sebagian besar java.security.cert.X509Certificatefungsionalitas tambahan terdiri dari metode kueri yang mengembalikan informasi tentang sertifikat. Saya menyajikan sebagian besar informasi itu di Bagian 1. Berikut adalah metodenya:

  • public abstract int getVersion() mengembalikan versi sertifikat.
  • public abstract Principal getSubjectDN() mengembalikan informasi yang mengidentifikasi subjek sertifikat.
  • public abstract Principal getIssuerDN() mengembalikan informasi yang mengidentifikasi penerbit sertifikat, yang biasanya CA, tetapi dapat menjadi subjek jika sertifikat ditandatangani sendiri.
  • public abstract Date getNotBefore()dan public abstract Date getNotAfter()mengembalikan nilai yang membatasi jangka waktu saat penerbit bersedia menjamin kunci publik subjek.
  • public abstract BigInteger getSerialNumber()mengembalikan nomor seri sertifikat. Kombinasi nama penerbit sertifikat dan nomor seri adalah identifikasi uniknya. Fakta itu krusial untuk pencabutan sertifikat, yang akan saya bahas lebih detail bulan depan.
  • public abstract String getSigAlgName()dan public abstract String getSigAlgOID()mengembalikan informasi tentang algoritme yang digunakan untuk menandatangani sertifikat.

Metode berikut mengembalikan informasi tentang ekstensi yang ditentukan untuk sertifikat. Ingat, ekstensi adalah mekanisme untuk menghubungkan informasi dengan sertifikat; mereka hanya muncul di sertifikat versi 3.

  • public abstract int getBasicConstraints()mengembalikan panjang jalur batasan sertifikat dari BasicConstraintsekstensi, jika ditentukan. Jalur batasan menentukan jumlah maksimum sertifikat CA yang dapat mengikuti sertifikat ini di jalur sertifikasi.
  • public abstract boolean [] getKeyUsage()mengembalikan tujuan sertifikat seperti yang dikodekan dalam KeyUsageekstensi.
  • public Set getCriticalExtensionOIDs()dan public Set getNonCriticalExtensionOIDs()mengembalikan kumpulan pengenal objek (OID) untuk ekstensi yang masing-masing ditandai kritis dan tidak kritis. OID adalah urutan bilangan bulat yang secara universal mengidentifikasi sumber daya.

Saya tidak ingin meninggalkan Anda tanpa kode untuk dimainkan, jadi daripada mempelajari CRL, yang merupakan topik lengkap sendiri, saya akan menyajikan kodenya dan meninggalkan CRL untuk Bagian 3.

Kode

Kelas berikut memperagakan cara mendapatkan pabrik sertifikat, cara menggunakan pabrik itu untuk membuat sertifikat dari representasi yang dikodekan DER dalam sebuah file, dan cara mengekstrak dan menampilkan informasi tentang sertifikat. Anda akan melihat betapa sedikit yang perlu Anda khawatirkan tentang pengkodean yang mendasarinya.