Verifikasi rantai sertifikat gagal pada sertifikat daun

Saya membuat rantai sertifikat PEM (CA, perantara, dan daun) menggunakan pyopenssl, dan saya ingin mengonfirmasi bahwa saya mendefinisikan semuanya dengan benar.

Berikut langkah-langkah yang saya ambil:

  1. Saya membuat tiga sertifikat PEM, menandatangani sendiri CA dan menentukan batasan dasar crypto.X509Extension(b'basicConstraints', False, b'CA:TRUE') mengikuti pertanyaan ini
  2. Saya menyalin CA dan sertifikat perantara ke /usr/local/share/ca-certificates (sebagai file crt) dan menjalankan sudo update-ca-cert
  3. Saya telah menyiapkan server sederhana berdasarkan contoh OpenSSL ini
  4. Saya mencoba menjalankan server dengan sertifikat CA dan mengeksekusi openssl s_client -connect localhost:4433 -CApath /etc/ssl/certs - Berfungsi dengan baik, dapatkan Verify return code: 0 (ok)
  5. Melakukan hal yang sama tetapi kali ini server menggunakan sertifikat perantara - Bagus juga, Verify return code: 0 (ok)
  6. Melakukan hal yang sama tetapi kali ini server menggunakan sertifikat daun - Kali ini saya mendapat Verify return code: 24 (invalid CA certificate)

Selain itu, saya mencoba memverifikasi sertifikat dan mendapatkan yang berikut:

$ openssl verify 1-ca.pem
1-ca.pem: OK
$ openssl verify 2-intermediate.pem
2-intermediate.pem: OK
$ openssl verify 3-leaf.pem
C = NL, ST = Amsterdam, L = Zaandam, O = FakeDigiCert, OU = FakeFake, CN = www.fakedigicert.nl
error 24 at 1 depth lookup: invalid CA certificate
error 3-leaf.pem: verification failed

Mengapa sertifikat CA tiba-tiba tidak valid setelah sertifikat server berjarak lebih dari satu langkah dari CA?


person GabeL    schedule 30.07.2020    source sumber
comment
Anda tidak menjelaskan dengan jelas apa yang Anda masukkan ke dalam sertifikat yang mana, tetapi Anda mengatakan 'CA dan perantara' seolah-olah perantara itu bukan CA, dan memang demikian. Apa yang Anda miliki adalah CA root, satu CA perantara, dan entitas akhir alias daun. OpenSSL memerlukan/setiap CA perantara memiliki BasicConstraints.ca=true jika tidak, Anda akan mendapatkan kesalahan verifikasi 24; setidaknya sampai sekarang hal ini tidak memerlukan ini untuk root CA kecuali kode tersebut menetapkan tanda 'ketat', tetapi harus root tetap memilikinya.   -  person dave_thompson_085    schedule 31.07.2020
comment
@ dave_thompson_085 Memang itulah masalahnya. Saya berasumsi bahwa sertifikat perantara belum tentu merupakan CA. Setelah saya menambahkan batasan dasar, verifikasi berhasil. Terima kasih!   -  person GabeL    schedule 02.08.2020


Jawaban (1)


Tampaknya ini adalah jebakan umum yang dilakukan kebanyakan orang dalam menyiapkan server web https sepanjang waktu. Anda juga perlu memberikan semua sertifikat perantara ke server web (biasanya dengan menggabungkan file pem daun dan pem perantara ke dalam satu file pem). Jadi ketika browser web mengunjungi situs Anda, pengaturan SSL akan mengembalikan sertifikat leaf dan sertifikat perantara dari server web.

Anda dapat melihat ini di semua situs web yang menyediakan sertifikat perantara ketika Anda menggunakan opsi -showcerts dengan rel opensll s_client:

openssl s_client -connect www.example.com:443 -showcerts

Hal yang sama juga berlaku untuk perintah openssl verifikasi sebagai Sehat.

Dari dokumen:

-file tidak tepercaya

File sertifikat tambahan yang tidak tepercaya (CA penerbit perantara) yang digunakan untuk membangun rantai sertifikat dari sertifikat subjek ke jangkar kepercayaan. File tersebut harus berisi satu atau lebih sertifikat dalam format PEM. Opsi ini dapat ditentukan lebih dari satu kali untuk menyertakan sertifikat tidak tepercaya dari beberapa file.

Jadi dalam contoh di atas, Anda perlu melakukan:

openssl verify 3-leaf.pem -untrusted 2-intermediate.pem
person Shane Powell    schedule 30.07.2020
comment
Menghilangkan perantara memang merupakan kesalahan umum, namun TIDAK DAPAT menyebabkan kesalahan spesifik yang ditunjukkan pada Q ini. - person dave_thompson_085; 31.07.2020
comment
@ dave_thompson_085 Apakah itu berarti sertifikat daun disetel dengan 'CA:TRUE' padahal seharusnya tidak? - person Shane Powell; 31.07.2020
comment
@ShanePowell Tampaknya solusi dave_thompson_085 menyelesaikan masalah ini, namun saya menghargai klarifikasi atas apa yang Anda katakan. Jika saya menginstal sertifikat root pada host klien saya, dan kemudian memberikan file berantai yang berisi ketiga sertifikat, pemeriksaan s_client akan baik-baik saja? Karena ketika saya menghapus sertifikat perantara, saya mendapat kode pengembalian Verifikasi: 21 (tidak dapat memverifikasi sertifikat pertama) - person GabeL; 02.08.2020
comment
@GabeL: sesuai standar, server SSL/TLS harus mengirimkan seluruh rantai kecuali dapat menghilangkan root (nontrivial); dalam kasus Anda, ia harus mengirimkan setidaknya daun dan imed. Sebagian besar server mengirimkan apa yang Anda konfigurasikan (hanya), tetapi ada pula yang bervariasi. Jika server salah mengirimkan hanya daun, apa yang dilakukan klien tidak ditentukan oleh standar; openssl s_client khususnya, jika Anda memiliki root dan imed di truststore (-CAfile dan/atau -CApath atau defaultnya), gunakan imed dari truststore untuk membangun rantai, dan validasi akan berhasil (jika/setelah sertifikat benar). - person dave_thompson_085; 04.08.2020
comment
Shane: tidak. Saat saya mengomentari Q, penyebab verifikasi 24 adalah perantara yang kekurangan ca=true. OpenSSL menerima 'leaf' dengan ca=true -- termasuk namun tidak terbatas pada sertifikat yang ditandatangani sendiri di mana daun tersebut juga merupakan root dan harus dipercaya secara langsung. - person dave_thompson_085; 04.08.2020