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 require
memerlukan 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)
9
mod_ssl
dirancang 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.mod_ssl
mesin di sana, saya berharap itu dapat menangani beberapa pekerjaan untuk saya.optional_no_ca
adalah 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.Jawaban:
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
CertificateRequest
pesan TLS ke klien selama handhsake. Pesan ini berisicertificate_authorities
daftar: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
SSLCADNRequestFile
arahan 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 menggunakanCN=Dummy CA
DN Subjek (dan Penerbit DN), mungkin dengan kunci yang berbeda. MeskipunSSLCADNRequestFile
arahan 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 mengkonfigurasicertificate_authorities
daftar. Jika Anda, sebagai layanan, memasukkan sertifikat yang ditandatangani sendiri dengan nama-namaSSLCADNRequestFile
ini, ini akan membuatCertificateRequest
pesan TLS digunakanCN=Dummy CA
dalamcertificate_authorities
daftar (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 memeriksaSSL_CLIENT_VERIFY
variabel 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 olehCertificateVerify
pesan 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 .
sumber
Menggunakan
SSLVerifyCLient optional_no_ca
(bukannyarequire
) 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_ssl
dokumentasi secara menyeluruh .)sumber