Chúng tôi gặp sự cố khi curl
khô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_NAME
trong ssl.h
.
Nếu tôi thử openssl s_client -connect the-problem-site.com:443
thay 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.pem
và 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.0
và 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à strace
họ thì không có nỗ lực đọc /usr/lib/ssl/certs
hoặc hoàn /etc/ssl/certs
toà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.cnf
tệ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ủ, curl
không nhận tệp chứng chỉ và hoạt động tốt. openssl s_client
vẫn không, mặc dù. Tại sao lại như vậy?