Kesalahan Sertifikat SSL: verifikasi kesalahan: num = 20: tidak bisa mendapatkan sertifikat penerbit lokal

11

Saya sudah mencoba untuk mendapatkan koneksi SSL ke server LDAPS (Active Directory) agar berfungsi, tetapi tetap mengalami masalah. Saya mencoba menggunakan ini:

openssl s_client -connect the.server.edu:3269 

Dengan hasil sebagai berikut:

verify error:num=20:unable to get local issuer certificate 

Saya pikir, OK, baik server server produksi lama beberapa tahun. Mungkin CA tidak ada. Saya kemudian menarik sertifikat dari output ke file pem dan mencoba:

openssl s_client -CAfile mycert.pem -connect the.server.edu:3269

Dan itu juga tidak berhasil.

Apa yang saya lewatkan? Bukankah seharusnya SELALU bekerja?


sumber
Demi kejelasan, tampaknya LDAPS, ketika disajikan dari Windows, tidak menunjukkan sertifikat CA saat koneksi dibuat. Oleh karena itu, Anda harus mendapatkan sertifikat CA X.509, ekspor sebagai base64 dan tetapkan seperti yang dijelaskan dalam jawaban di bawah ini. Dalam kasus saya, menggunakan python-ldap Anda menetapkannya pada lingkup GLOBAL (bukan ldap.initialize () instance Anda) sebagai: ldap.set_option(ldap.OPT_X_TLS_CACERTFILE,'./ca_issuer_cert.pem') Setelah ini, saya dapat menggunakan STARTTLS (dalam port LDAP 389) seperti yang diharapkan.
mbrownnyc

Jawaban:

4

Jadi ini yang saya lihat sebagai nama sertifikat CA:

depth=1 /C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=Terms of use at //www.verisign.com/rpa (c)10/CN=VeriSign Class 3 International Server CA - G3
verify error:num=20:unable to get local issuer certificate
verify return:0

Itu adalah nama sertifikat yang saya impor setelah saya melakukan -showcerts pada percobaan kedua saya di atas. Saya mendaftarkan sertifikat di keystore dengan melakukan ini:

$JAVA_HOME/bin/keytool -list -v -keystore $JAVA_HOME/jre/lib/security/cacerts

Saya melihat sertifikat CA di sana.

Alias name: versign2006
Creation date: Jan 21, 2011
Entry type: trustedCertEntry

Owner: CN=VeriSign Class 3 International Server CA - G3, OU=Terms of use at www.verisign.com/rpa (c)10, OU=VeriSign Trust Network, O="VeriSign, Inc.", C=US
Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5, OU="(c) 2006 VeriSign, Inc. - For authorized use only", OU=VeriSign Trust Network, O="VeriSign, Inc.", C=US
Serial number: 641be820ce020813f32d4d2d95d67e67
Valid from: Sun Feb 07 19:00:00 EST 2010 until: Fri Feb 07 18:59:59 EST 2020
Certificate fingerprints:
  MD5:  BA:B0:65:B4:3B:9C:E8:40:30:21:7D:C5:C6:CD:3F:EB
  SHA1: B1:8D:9D:19:56:69:BA:0F:78:29:51:75:66:C2:5F:42:2A:27:71:04

Untuk memastikan bahwa openssl menggunakan keystore yang saya gunakan dengan server, saya menggunakan argumen -CAfile:

openssl s_client -connect the.server.edu:3269 -CAfile $JAVA_HOME/jre/lib/security/cacerts

Mengetahui bahwa java keystore untuk CA's memiliki kata sandi, saya mencoba menggunakan opsi-pass pass: kata sandi seperti ini:

openssl s_client -connect the.server.edu:3269 -CAfile $JAVA_HOME/jre/lib/security/cacerts -pass pass:changeit

tapi itu juga tidak berhasil.

Apa yang lucu tentang itu adalah bahwa file cacerts memiliki kata sandi di atasnya dan openssl tidak mengeluh bahwa ia tidak dapat membaca file cacerts. Bagi saya itu agak mencurigakan. Apakah itu atau apa pun membunyikan lonceng?

Brian
sumber
3

Kesalahan itu adalah cara opensl untuk mengatakan, "Saya tidak bisa mengikuti rantai sertifikat ke akar tepercaya". Saya hanya melakukan perintah yang sama ke server AD saya sendiri dan saya mendapatkan rantai sertifikat lengkap, tetapi sertifikat teratas memiliki kesalahan yang sama persis. Jika Anda memiliki kunci-pub CA yang menandatangani sertifikat, Anda dapat menentukannya dengan opsi -CAfileatau-CApath

sysadmin1138
sumber
Ok, terima kasih atas tanggapannya. Jadi saya mencobanya. Mendapat sertifikat CA dengan melakukan hal yang sama dengan opsi -showcerts aktif, meraih sertifikat lainnya. Itu seharusnya CA cert, kan? Sudah mencoba itu alih-alih sertifikat server dalam file pem dan mendapat pesan kesalahan yang sama. Ada pemikiran lain?
Dalam hal ini, kemungkinan besar validasi gagal karena alasan lain, seperti kedaluwarsa.
sysadmin1138
1

Saya sudah mencoba untuk mendapatkan koneksi SSL ke server LDAPS (Active Directory) agar berfungsi, tetapi tetap mengalami masalah. Saya mencoba menggunakan ini:

Jika Anda menggunakan OpenLDAP, Anda dapat mengatur:

TLS_REQCERT=never

di openldap.conffile Anda , yang memerintahkan OpenLDAP untuk tidak mencoba verifikasi sertifikat. Ada opsi serupa jika Anda melakukan otentikasi LDAP dengan Apache.

Jika Anda benar-benar ingin melakukan verifikasi sertifikat, berikut ini dapat membantu:

Apa yang saya lewatkan? Bukankah seharusnya SELALU bekerja?

Saya kira tidak. Meskipun yang berikut ini mungkin terdengar pasti, itu benar-benar hanya tamu terbaik saya:

Apa yang Anda coba hanya akan berfungsi untuk sertifikat yang ditandatangani sendiri. Karena sertifikat itu sebenarnya dikeluarkan oleh Windows CA, berusaha menggunakan sertifikat server sebagai argumen untuk -CAfiletidak akan memberi Anda apa-apa.

Mendapat sertifikat CA dengan melakukan hal yang sama dengan opsi -showcerts aktif, meraih sertifikat lainnya. Itu seharusnya CA cert, kan?

Tidak harus, tidak. Tidak ada jaminan bahwa server jauh menyajikan sertifikat CA dalam outputnya. Anda harus terlebih dahulu melihat penerbit sertifikat server:

openssl x509 -in server.crt -noout -text | grep Issuer

... lalu lihat apakah salah satu dari sertifikat lain yang Anda miliki cocok dengan penerbit itu.

larsks
sumber