OpenSSL tidak mengambil CA di folder sertifikat

9

Kami mengalami masalah dengan curltidak 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_NAMEdi ssl.h.

Jika saya mencoba openssl s_client -connect the-problem-site.com:443sebagai 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.0dan ada di ca-certificates.crt. Namun, sejauh yang saya bisa lihat, tidak ada curl maupun openssl yang mencoba membaca sertifikat apa pun; jika saya stracemereka maka tidak ada upaya untuk membaca dari /usr/lib/ssl/certsatau /etc/ssl/certssama 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.cnffile 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, curltidak mengambil file sertifikat dan berfungsi dengan baik. openssl s_clientmasih tidak. Kenapa bisa begitu?

Rup
sumber
Kami mengalami masalah yang persis sama. Saya merasakan beberapa dodginess di openssl!
milosgajdos
@Rup Apakah Anda menemukan solusi untuk ini? Silakan tambahkan dan tandai jawaban jika demikian. Kami melihat perilaku yang sama.
Mike S
@ Mike Tidak sejauh yang saya tahu maaf, tapi saya tidak di tim itu. Saya akan bertanya besok.
Rup

Jawaban:

4

Ada beberapa perpustakaan kriptografi di sistem Anda:

  • OpenSSL (standar emas, dengan lisensi gaya BSD (sangat gratis) yang mencakup klausa yang agak bermasalah (mencegah kompatibilitas GPL, tetapi tidak ada yang "buruk") yang membatasi pengadopsiannya di dunia GNU)
  • GnuTLS (pengganti dari FSF; datang dalam dua rasa, berlisensi LGPLv2 (tetapi tidak dirawat) dan berlisensi LGPLv3 (dan dengan demikian tidak sesuai dengan program-program khusus GPLv2); secara historis tidak memiliki fitur seperti OpenSSL, sedikit buggy, tetapi lebih ketat juga, yang meningkatkan keamanan)
  • NSS (Perpustakaan Netscape / Mozilla, jarang digunakan di luar; lambat untuk mengadopsi standar baru)
  • yang kecil seperti PolarSSL, MatrixSSL, NaCl / Salt

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 curlalat 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 / Ubuntu ca-certificatessepertinya 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 oleh ca-certificatesskrip pengelola paket, tetapi dapat menyimpang); Anda tampaknya menggunakan versi yang lebih lama, jadi ini mungkin yang Anda tekan.

openssl s_clientsecara default (yaitu tanpa -CApathatau -CAfileopsi) tidak terlihat di mana saja untuk sertifikat.

Anda curldari instalasi yang ditingkatkan kemungkinan besar menggunakan pustaka crypto yang berbeda curldari instalasi baru.

Coba openssl s_client -CAfile /etc/ssl/certs/ca-certificates.crt -connect the-problem-site.com:443juga untuk openssl s_client -CApath /etc/ssl/certs -connect the-problem-site.com:443meniru 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:

openssl x509 -noout -hash -in /etc/ssl/certs/GeoTrust_Global_CA.pem
openssl x509 -noout -subject_hash_old -in /etc/ssl/certs/GeoTrust_Global_CA.pem
openssl x509 -noout -subject_hash -in /etc/ssl/certs/GeoTrust_Global_CA.pem

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.

mirabilos
sumber