kết nối https bằng cách sử dụng CURL từ dòng lệnh


127

Tôi mới biết đến thế giới Curl và Cacerts và gặp vấn đề trong khi kết nối với máy chủ. Về cơ bản, tôi cần kiểm tra kết nối qua https từ máy này sang máy khác. Tôi có một URL mà tôi cần kết nối từ Máy A (máy linux) Tôi đã thử điều này trên dấu nhắc lệnh

cmd> curl https://[my domain or IP address]

và nhận được những điều sau đây:

curl: (60) SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

Khi xem qua một số bài viết qua internet tôi đã làm điều này:

openssl s_client -connect <domain name or Ip address>:443

và nhận được một số phản hồi bao gồm chứng chỉ máy chủ (bên trong -----BEGIN CERTIFICATE----- and -----END CERTIFICATE-----).

Tôi nên làm gì tiếp theo từ đây. Tôi nghĩ rằng, tôi sẽ chỉ cần sao chép dán văn bản bên trong BEGIN CERTIFICATE & END CERTIFICATEvà lưu nó vào một tập tin. Nhưng, nó nên là loại tập tin nào? .pem, .crt? .. Tôi nên làm gì sau đó?

Tôi đã thử điều này - sao chép văn bản bên trong BEGIN CERTIFICATE & END CERTIFICATEvà lưu nó trong một .crttệp - đặt tên nó là my-ca.crt(cũng đã thử điều tương tự bằng cách đặt tên nó là my-ca.pemtệp) và sau đó thực hiện điều này:

cmd>curl --cacert my-ca.crt https://[my domain or IP address]

Nhưng đã nhận được cùng một lỗi.


Không chắc chắn về giải pháp mà bạn đề xuất, nhưng tôi chỉ tìm kiếm thông tin tương tự và tôi đã tìm thấy trang web hữu ích này để sử dụng curl với PHP unitstep.net/blog/2009/05/05/ Khăn
MauroPerez

1
bạn cũng có thể thêm --insecuređể bỏ qua lỗi SSL.
Alexej Magura

các phiên bản mới hơn của curl (ví dụ 7.64) sẽ không nhận ra các mật mã cũ hơn như RC4-SHA - sử dụng phiên bản cũ hơn của curl (7.46) đã giúp tôi serverfault.com/questions/889631/iêu
hello_earth

Câu trả lời:


142

Tôi có cùng một vấn đề - Tôi đã tìm nạp một trang từ trang web của riêng tôi, được phục vụ qua HTTPS, nhưng curl đã đưa ra thông báo "vấn đề chứng chỉ SSL" tương tự. Tôi đã làm việc xung quanh nó bằng cách thêm một -kcờ vào cuộc gọi để cho phép các kết nối không an toàn.

curl -k https://whatever.com/script.php

Chỉnh sửa: Tôi phát hiện ra gốc rễ của vấn đề. Tôi đã sử dụng chứng chỉ SSL (từ StartSSL, nhưng tôi không nghĩ điều đó quan trọng lắm) và đã không thiết lập chứng chỉ trung gian đúng cách. Nếu bạn đang gặp vấn đề tương tự như user1270392 ở trên, có lẽ bạn nên kiểm tra chứng chỉ SSL của mình và khắc phục mọi sự cố với nó trước khi sử dụng cách curl -kkhắc phục.


5
-k cờ là một phím tắt tốt đẹp. Đã làm cho tôi!
tidydee

45

Giải pháp đơn giản

Đó là kịch bản hàng ngày của tôi:

curl --insecure -v https://www.google.com 2>&1 | awk 'BEGIN { cert=0 } /^\* Server certificate:/ { cert=1 } /^\*/ { if (cert) print }'

Đầu ra:

* Server certificate:
*    subject: C=US; ST=California; L=Mountain View; O=Google Inc; CN=www.google.com
*    start date: 2016-01-07 11:34:33 GMT
*    expire date: 2016-04-06 00:00:00 GMT
*    issuer: C=US; O=Google Inc; CN=Google Internet Authority G2
*    SSL certificate verify ok.
* Server GFE/2.0 is not blacklisted
* Connection #0 to host www.google.com left intact

11
Do đó, bạn đang cho phép --insecurekết nối thông qua TSL, hàng ngày ...
Brethlosze

2
@Brethlosze Cảm ơn bình luận của bạn. Nhưng, đó không phải là trường hợp. Vấn đề là lấy thông tin SSL từ tất cả các loại chứng chỉ.
Antonio Feitosa

30

Bạn cần cung cấp toàn bộ chuỗi chứng chỉ để cuộn tròn, vì curl không còn vận chuyển với bất kỳ cer CA nào. Vì tùy chọn cacert chỉ có thể sử dụng một tệp, bạn cần nối thông tin chuỗi đầy đủ vào 1 tệp

Sao chép chuỗi chứng chỉ (ví dụ từ trình duyệt của bạn) vào nhị phân được mã hóa DER x.509 (.cer). Làm điều này cho mỗi chứng chỉ.

Chuyển đổi các certs thành PEM và ghép chúng thành 1 tệp.

openssl x509 -inform DES -in file1.cer -out file1.pem -text
openssl x509 -inform DES -in file2.cer -out file2.pem -text
openssl x509 -inform DES -in file3.cer -out file3.pem -text

cat *.pem > certRepo

curl --cacert certRepo -u user:passwd -X GET -H 'Content-Type: application/json' "https//somesecureserver.com/rest/field"

Tôi đã viết một blog về cách làm điều này tại đây: http://javamemento.blogspot.no/2015/10/USE-curl-with-ssl-cert-chain.html


1
Bạn có thể vui lòng giải thích mục đích của việc chuyển userName và Mật khẩu không? Điều gì xảy ra nếu tôi đang viết một Máy khách Java, tôi có cần phải chuyển tên người dùng và mật khẩu trong tiêu đề của yêu cầu GET không, trong trường hợp đó?
Shubhi224

@ Shubhi224 không nếu máy chủ https của bạn không yêu cầu xác thực đơn giản cho các yêu cầu GET. Tôi đã phải sử dụng xác thực vì đó là một cuộc gọi REST yêu cầu nó.
Somaiah Kumbera

Như đã đề cập trong câu trả lời này "Bạn cần cung cấp toàn bộ chuỗi chứng chỉ để cuộn tròn, vì curl không còn vận chuyển với bất kỳ certs CA nào."
Mohamed Bana

16

sử dụng --cacertđể chỉ định một .crttập tin. ca-root-nss.crtví dụ.


6

Tôi thực sự đã có loại vấn đề này và tôi giải quyết nó bằng các bước sau:

  1. Nhận gói chứng chỉ CA gốc từ đây: https://curl.haxx.se/ca/cacert.pem và lưu nó vào cục bộ

  2. Tìm php.initập tin

  3. Đặt curl.cainfolà đường dẫn của chứng chỉ. Vì vậy, nó sẽ một cái gì đó như:

curl.cainfo = /path/of/the/keys/cacert.pem



1

gặp vấn đề nghiêm trọng, tôi có thể sử dụng tệp CA mặc định của hệ thống hiện có, trên debian6, đây là:

/etc/ssl/certs/ca-certificates.crt

như root, điều này có thể được thực hiện như sau:

echo curl.cainfo=/etc/ssl/certs/ca-certificates.crt >> /etc/php5/mods-available/curl.ini

sau đó khởi động lại máy chủ web.


1

bạn có thể sử dụng cái này

curl_setopt($curl->curl, CURLOPT_SSL_VERIFYPEER, false);


0

Đối với tôi, tôi chỉ muốn thử nghiệm một trang web có chuyển hướng http-> https tự động. Tôi nghĩ rằng tôi đã cài đặt một số certs, vì vậy bản thân nó hoạt động với tôi trên Ubuntu 16.04 đang chạycurl 7.47.0 (x86_64-pc-linux-gnu) libcurl/7.47.0 GnuTLS/3.4.10 zlib/1.2.8 libidn/1.32 librtmp/2.3

curl --proto-default https <target>


-2

Với các phiên bản hiện đại của curl, bạn chỉ cần ghi đè địa chỉ IP nào để kết nối, sử dụng --resolve hoặc --connect-to (curl mới hơn phiên bản 7.49). Điều này hoạt động ngay cả với SSL / SNI. Tất cả các chi tiết có trong trang người đàn ông.

Ví dụ: để ghi đè DNS và kết nối với www.example.com bằng ssl bằng một địa chỉ IP cụ thể: (Điều này cũng sẽ ghi đè ipv6)

curl --resolve www.example.com:443:192.168.42.2 https://www.example.com/

Một ví dụ khác, để kết nối với một máy chủ phụ trợ cụ thể có tên backend1 trên cổng 8080

curl --connect-to www.example.com:80:backend1.example.com:8080 http://www.example.com/

Hãy nhớ thêm tiêu đề máy chủ nếu máy chủ cần câu trả lời chính xác:

-H 'Host:www.example.com' 

Tôi không chắc làm thế nào điều này trả lời câu hỏi.
Brethlosze
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.