Chúng tôi gặp sự cố khi curlkhông kết nối với máy chủ HTTPS:
$ curl https://the-problem-site.com (not the real URL!)
curl: (35) error:14077458:SSL routines:SSL23_GET_SERVER_HELLO:reason(1112)
1112 là SSL_R_TLSV1_UNRECOGNIZED_NAMEtrong ssl.h.
Nếu tôi thử openssl s_client -connect the-problem-site.com:443thay thế thì tôi thấy
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
tức là có vẻ như vấn đề là nó không tin tưởng /C=US/O=GeoTrust Inc./CN=GeoTrust Global CA. Tuy nhiên, chứng chỉ đó đã được cài đặt: nó /etc/ssl/certs/GeoTrust_Global_CA.pemvà nếu thay vào đó tôi chạy
openssl s_client -connect the-pro Hiệu-site.com:443 -CAfile /etc/ssl/certs/GeoTrust_Global_CA.pem
sau đó mọi thứ hoạt động. Chứng chỉ cũng có mặt như một tệp có tên băm b0f3e76e.0và nó nằm trong ca-certificates.crt. Tuy nhiên, theo như tôi có thể thấy, cả curl và openssl đều không cố đọc bất kỳ chứng chỉ nào; nếu tôi là stracehọ thì không có nỗ lực đọc /usr/lib/ssl/certshoặc hoàn /etc/ssl/certstoàn, thậm chí không có lỗi. Nó không đọc openssl.cnf mặc dù. Chúng tôi đã chạy update-ca-certificates.
Đây là Ubuntu 10.04 với openssl 0.9.8k. Chúng tôi có thể tái tạo vấn đề trên hai bản cài đặt riêng biệt (mặc dù có thể là bản sao của bản kia từ bản quay lại). Nếu tôi thử kiểm tra tương tự trên máy ảo CentOS với openssl 0.9.8e thì nó hoạt động tốt và tôi có thể thấy nó đang đọc tệp chứng chỉ strace. Không có quyền truy cập tệp tương đương tại cùng một điểm trong các giai đoạn Ubuntu. Nếu tôi sao chép openssl.cnftệp từ máy ảo CentOS sang máy Ubuntu thì sẽ không có gì khác biệt. Không có gì rõ ràng trong môi trường hoặc tệp .rc có thể gây ra điều này.
Bất cứ ý tưởng những gì tôi đang làm sai? Điều này có nên hoạt động không, tức là openssl và curl tự động nhận các CA đã cài đặt từ dòng lệnh? Cái này được cấu hình như thế nào? Cảm ơn!
Một điểm dữ liệu khác: trên bản cài đặt sạch của 13 máy chủ, curlkhông nhận tệp chứng chỉ và hoạt động tốt. openssl s_clientvẫn không, mặc dù. Tại sao lại như vậy?