Bagaimana saya bisa membuat apache meminta sertifikat SSL klien tanpa perlu memverifikasinya terhadap CA yang dikenal?

9

Saya menggunakan apache2 (2.2.3) untuk melayani situs tempat saya ingin klien mengautentikasi dengan sertifikat. Karena saya hanya perlu memverifikasi bahwa pengguna yang menyajikan sertifikat tertentu adalah pengguna yang sama yang telah menunjukkan sertifikat itu di masa lalu, CA yang menandatangani sertifikat itu tidak relevan. Namun, tampaknya menggunakan itu SSLVerifyClient requirememerlukan SSLCACertificateFile ...(atau SSLCACertificatePath ...), dan kemudian apache hanya akan menerima sertifikat yang ditandatangani oleh CA di file / path itu. Apakah ada cara untuk mendapatkan apache untuk menerima sertifikat klien, terlepas dari CA penerbit / bernyanyi? (Yaitu memverifikasi bahwa klien memiliki kunci pribadi yang sesuai dengan kunci publik yang disajikan, tetapi tidak repot-repot memverifikasi CA penandatanganan / penandatanganan)

Ishak
sumber
Bagaimana Anda berencana melacak sertifikat mana yang telah diautentikasi?
Shane Madden
@ShaneMadden: Sesuatu seperti sertifikat pemetaan tabel ke ID pengguna internal. Mekanisme kriptografi kunci publik akan menggantikan pertukaran kata sandi.
Isaac
2
Benar - yang saya maksudkan adalah bahwa Apache tidak melakukan sertifikat pemetaan tabel ke ID pengguna internal. Jika Anda akan meminta pengguna mengautentikasi dengan sertifikat klien, mengapa tidak memberikan sertifikat pengguna yang Anda tandatangani? Seperti yang telah Anda sebutkan, ada penyedia OpenID yang melakukan hal itu. Apache mod_ssldirancang untuk mengautentikasi pengguna berdasarkan hubungan penandatanganan sertifikat; jika Anda memilih untuk mengabaikannya karena suatu alasan maka Anda perlu menerapkan otentikasi sertifikat dalam kode Anda sendiri yang juga menangani pemetaan sertifikat-ke-pengguna Anda.
Shane Madden
@ShaneMadden: Saya berharap untuk menghindari mengeluarkan sertifikat dan jika saya hanya menerima sertifikat yang saya keluarkan, maka sertifikat berbasis smartcard keluar. Tidak peduli apa yang saya lakukan, beberapa bagian dari sistem akan terjadi pada tingkat aplikasi, tetapi karena ada semua mod_sslmesin di sana, saya berharap itu dapat menangani beberapa pekerjaan untuk saya.
Isaac
1
@ShaneMadden Salah satu kelebihannya optional_no_caadalah bisa lebih baik untuk UI, karena Anda dapat menampilkan pesan kesalahan HTTP jika ada yang salah dengan sertifikat (Anda tidak bisa sebaliknya, karena klien yang buruk akan menghentikan koneksi sebelum lapisan HTTP ). Ini juga berguna jika Anda ingin mencoba cara-cara alternatif memverifikasi sertifikat (misalnya WebID ). Anda benar bahwa Anda ingin sesuatu melakukan verifikasi, dan itu hanya akan benar-benar berfungsi ketika permintaan ditangani oleh kode (misalnya dalam PHP / CGI / Java), tidak terlalu banyak dengan file.
Bruno

Jawaban:

10

Seperti yang Anda temukan, Anda dapat menonaktifkan verifikasi sertifikat di level handshake SSL / TLS dalam Apache Httpd dengan menggunakan SSLVerifyCLient optional_no_ca.

Masalah kedua yang akan Anda hadapi dengan apa yang Anda coba lakukan adalah membuat klien mengirim sertifikat. Karena sertifikat Anda tidak dimaksudkan untuk berada dalam PKI, sertifikat itu dapat ditandatangani sendiri dan memiliki berbagai penerbit.

Saat meminta sertifikat klien, server mengirim CertificateRequestpesan TLS ke klien selama handhsake. Pesan ini berisi certificate_authoritiesdaftar:

Daftar nama dibedakan dari otoritas sertifikat yang dapat diterima. Nama-nama dibedakan ini dapat menentukan nama dibedakan yang diinginkan untuk CA akar atau untuk CA bawahan; dengan demikian, pesan ini dapat digunakan untuk menggambarkan akar yang diketahui dan ruang otorisasi yang diinginkan. Jika daftar Certificate_authorities kosong maka klien DAPAT mengirim sertifikat dari ClientCertificateType yang sesuai, kecuali ada pengaturan eksternal yang bertentangan.

Browser menggunakan ini untuk memilih sertifikat klien mana yang akan dikirim (jika ada).

(Perhatikan bahwa bagian tentang daftar kosong hanya dalam spesifikasi dari TLS 1.1 dan seterusnya. SSL 3.0 dan TLS 1.0 tidak membahas hal ini, dan dalam praktiknya, ini juga akan berfungsi.)

Anda mendapatkan dua opsi untuk ini.

  • Jika sertifikat klien yang Anda harapkan akan ditandatangani sendiri, mereka semua akan memiliki penerbit yang berbeda. Karena Anda tidak akan tahu apa yang diharapkan, server harus mengirim daftar kosong. Untuk melakukan ini, gunakan SSLCADNRequestFilearahan dan arahkan ke file yang hanya berisi baris kosong (jika saya ingat betul, itu tidak bekerja dengan file yang benar-benar kosong).

  • Opsi kedua (kurang bersih). Adalah menyetujui DN Penerbit yang umum untuk semua sertifikat klien yang Anda harapkan, terlepas apakah sertifikat tersebut memang dikeluarkan oleh sertifikat CA tersebut (atau apakah CA itu ada atau tidak). Dengan melakukannya, Anda akan sangat melanggar model PKI (lebih banyak).

    Jika Anda menyetujui DN yang disukai Penerbit CN=Dummy CA(misalnya). Siapa pun dapat membuat sertifikat yang ditandatangani sendiri menggunakan CN=Dummy CADN Subjek (dan Penerbit DN), mungkin dengan kunci yang berbeda. Meskipun SSLCADNRequestFilearahan berharap untuk dikonfigurasikan dengan sertifikat untuk membangun daftar, ini tidak digunakan untuk memverifikasi sertifikat klien sama sekali, itu hanya cara yang rumit (tapi alami dalam konteks arahan lain) untuk mengkonfigurasi certificate_authoritiesdaftar. Jika Anda, sebagai layanan, memasukkan sertifikat yang ditandatangani sendiri dengan nama-nama SSLCADNRequestFileini, ini akan membuat CertificateRequestpesan TLS digunakan CN=Dummy CAdalam certificate_authoritiesdaftar (ini hanya nama, bukan sertifikat pada tahap ini). Klien kemudian dapat mengambil sertifikatnya sendiri dengan Penerbit DNCN=Dummy CA, apakah tanda tangannya dapat diverifikasi oleh sertifikat itu (kunci yang sama) atau tidak, karena tidak ada verifikasi tanda tangan yang terlibat dalam langkah-langkah ini.

Makhluk ini berkata, ingatlah bahwa dengan SSLVerifyCLient optional_no_ca, tidak ada verifikasi sertifikat nyata yang dibuat (saya kira Anda dapat memeriksa SSL_CLIENT_VERIFYvariabel jika verifikasi manual Anda hanyalah solusi cadangan untuk PKI yang telah Anda konfigurasikan pula). Yang Anda akan tahu pada tahap itu adalah bahwa klien memiliki kunci pribadi untuk sertifikat kunci publik yang telah disajikan (dijamin oleh CertificateVerifypesan TLS ): Anda harus melakukan beberapa bentuk verifikasi jika Anda ingin ada otentikasi beberapa menyortir. (Anda tidak dapat mempercayai salah satu konten sertifikat, yang merupakan salah satu dari pengikatan antara kunci publik dan nama / atribut yang dikandungnya.)

Ini tidak akan berfungsi dengan baik untuk file, tetapi Anda bisa melakukan ini untuk aplikasi (mis. PHP / CGI / ... bahkan Java jika Anda meneruskan sertifikat ke server Java yang diproksi). Salah satu cara dasar adalah dengan memiliki daftar kunci publik yang sudah diketahui, atau Anda bisa melihat ide-ide di FOAF + SSL / WebID .

Bruno
sumber
2

Menggunakan SSLVerifyCLient optional_no_ca(bukannya require) menyebabkan apache tidak memeriksa CA yang mengeluarkan (dan karenanya tidak memerlukan file atau jalur sertifikat CA). Itu memang mengizinkan klien / pengguna untuk tidak mengirimkan sertifikat, jadi memeriksa bahwa sertifikat yang digunakan sama sekali harus dilakukan secara terpisah.

(Rupanya, saya hanya gagal membaca mod_ssldokumentasi secara menyeluruh .)

Ishak
sumber