Kami mengalami masalah dengan curl
tidak terhubung ke server HTTPS:
$ curl https://the-problem-site.com (not the real URL!)
curl: (35) error:14077458:SSL routines:SSL23_GET_SERVER_HELLO:reason(1112)
1112 ada SSL_R_TLSV1_UNRECOGNIZED_NAME
di ssl.h
.
Jika saya mencoba openssl s_client -connect the-problem-site.com:443
sebagai gantinya maka saya melihat
CONNECTED(00000003)
depth=1 /C=US/O=GeoTrust, Inc./CN=GeoTrust SSL CA
verify error:num=20:unable to get local issuer certificate
verify return:0
Certificate chain
0 s:/serialNumber=xx/C=xx/ST=xx/L=xxxx/O=xx/OU=xx/CN=the-problem-site.com
i:/C=US/O=GeoTrust, Inc./CN=GeoTrust SSL CA
1 s:/C=US/O=GeoTrust, Inc./CN=GeoTrust SSL CA
i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
yaitu sepertinya masalahnya adalah bahwa ia tidak percaya /C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
. Namun cert itu diinstal: itu /etc/ssl/certs/GeoTrust_Global_CA.pem
, dan jika sebaliknya saya jalankan
openssl s_client -connect the-problem-site.com:443 -CAfile /etc/ssl/certs/GeoTrust_Global_CA.pem
maka semuanya bekerja. Sertifikat ini juga hadir sebagai file bernama hash b0f3e76e.0
dan ada di ca-certificates.crt
. Namun, sejauh yang saya bisa lihat, tidak ada curl maupun openssl yang mencoba membaca sertifikat apa pun; jika saya strace
mereka maka tidak ada upaya untuk membaca dari /usr/lib/ssl/certs
atau /etc/ssl/certs
sama sekali, bahkan dengan kesalahan. Itu membaca openssl.cnf sekalipun. Kami sudah lari update-ca-certificates
.
Ini adalah Ubuntu 10.04 dengan openssl 0.9.8k. Kami dapat mereproduksi masalah pada dua instalasi terpisah (meskipun mungkin salah satu dari yang lain dari jalan kembali). Jika saya mencoba tes yang sama pada CentOS VM dengan openssl 0.9.8e maka itu berfungsi dengan baik, dan saya bisa melihatnya membaca file sertifikat di strace
. Tidak ada akses file yang setara pada titik yang sama di Ubuntu straces. Jika saya menyalin openssl.cnf
file dari CentOS VM ke mesin Ubuntu itu tidak ada bedanya. Tidak ada yang jelas di lingkungan atau file .rc yang mungkin menyebabkan ini.
Ada ide yang saya lakukan salah? Haruskah ini bekerja, yaitu harus openssl dan curl mengambil CAs diinstal secara otomatis dari baris perintah? Bagaimana ini dikonfigurasi? Terima kasih!
Poin data lain: pada instalasi yang bersih dari 13 server, curl
tidak mengambil file sertifikat dan berfungsi dengan baik. openssl s_client
masih tidak. Kenapa bisa begitu?
Jawaban:
Ada beberapa perpustakaan kriptografi di sistem Anda:
Semuanya tentu saja memiliki persamaan dan perbedaan. Perangkat lunak yang menggunakannya (untuk keperluan kriptografi, atau menggunakan SSL / TLS) terkadang mendukung penggunaan lebih dari satu pustaka ini (misalnya Lynx, peramban web, biasanya terhubung dengan OpenSSL tetapi mendukung GnuTLS juga (hanya tidak sebagus) di untuk menenangkan orang GNU).
CURL juga merupakan salah satu proyek yang mendukung penggunaan salah satu dari tiga perpustakaan crypto utama. Ini sebagian besar karena cURL adalah, primer, perpustakaan yang dimaksudkan untuk digunakan oleh program lain ketika mereka ingin mengunduh (atau bahkan mengunggah) hal-hal menggunakan koneksi http, ftp, dll. The
curl
alat baris perintah bisa datang dari salah satu dari varian ini.Sekarang, saya cukup yakin bahwa masalah yang Anda lihat dengan sistem yang tidak diinstal adalah sebagai berikut:
OpenSSL dan GnuTLS keduanya mendukung penggunaan
/etc/ssl/certs/<hash>.<number>
direktori - style CA. Namun, OpenSSL versi 0.x dan GnuTLS menggunakan algoritma yang berbeda untuk menghitung hash yang disebutkan di atas daripada yang digunakan OpenSSL versi 1.x. (Keduanya dapat bekerja sama dalam suatu sistem; jika sertifikat yang berbeda memiliki hash yang sama, Anda hanya menggunakan nomor yang berbeda untuk mereka. Tetapi untuk beberapa alasan, paket Debian / Ubuntuca-certificates
sepertinya tidak melakukan hal ini.) Selain itu, beberapa versi GnuTLS tidak mendukung menggunakan direktori, tetapi hanya menggunakan file/etc/ssl/certs/ca-certificates.crt
(yang juga biasanya dikelola olehca-certificates
skrip pengelola paket, tetapi dapat menyimpang); Anda tampaknya menggunakan versi yang lebih lama, jadi ini mungkin yang Anda tekan.openssl s_client
secara default (yaitu tanpa-CApath
atau-CAfile
opsi) tidak terlihat di mana saja untuk sertifikat.Anda
curl
dari instalasi yang ditingkatkan kemungkinan besar menggunakan pustaka crypto yang berbedacurl
dari instalasi baru.Coba
openssl s_client -CAfile /etc/ssl/certs/ca-certificates.crt -connect the-problem-site.com:443
juga untukopenssl s_client -CApath /etc/ssl/certs -connect the-problem-site.com:443
meniru perilaku versi GnuTLS yang lebih lama.Periksa ulang apakah ada OpenSSL 1.x di mana saja di sistem Anda (Ubuntu dikenal untuk menyelinap pembaruan besar bahkan ke versi LTS), dan jika ya, periksa hash file:
Biasanya, perintah kedua dan ketiga harus gagal (OpenSSL 0.x), atau perintah pertama dan ketiga harus menampilkan hash yang sama tetapi yang kedua harus menampilkan hash yang berbeda (OpenSSL 1.x). GnuTLS akan menggunakan output dari perintah kedua (jika OpenSSL 1.x diinstal); jika OpenSSL 0.x diinstal itu hash yang sama. Anda dapat membuat symlink secara manual.
Saya dapat memperbarui posting ini setelah Anda memberikan umpan balik untuk debugging.
sumber