Koneksi https menggunakan CURL dari baris perintah

127

Saya baru mengenal dunia Curl dan Cacerts dan menghadapi masalah saat menyambung ke server. Pada dasarnya, saya perlu menguji konektivitas melalui https dari satu mesin ke mesin lain. Saya memiliki URL yang harus saya sambungkan dari Mesin A (mesin linux). Saya mencoba ini pada prompt perintah

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

dan mendapatkan yang berikut ini:

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

Saat membaca beberapa artikel melalui internet saya melakukan ini:

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

dan mendapat beberapa tanggapan termasuk sertifikat server (di dalam -----BEGIN CERTIFICATE----- and -----END CERTIFICATE-----).

Apa yang harus saya lakukan selanjutnya dari sini. Saya pikir, saya hanya perlu menyalin dan menempel teks di dalamnya BEGIN CERTIFICATE & END CERTIFICATEdan menyimpannya dalam sebuah file. Tapi, jenis file apa yang seharusnya? .pem, .crt? .. Apa yang harus saya lakukan setelah itu?

Saya mencoba ini - menyalin teks di dalamnya BEGIN CERTIFICATE & END CERTIFICATEdan menyimpannya dalam .crtfile - menamakannya sebagai my-ca.crt(juga mencoba hal yang sama dengan menamainya sebagai my-ca.pemfile) dan kemudian melakukan ini:

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

Namun mendapat error yang sama.

pengguna1270392
sumber
Tidak yakin tentang solusi yang Anda sarankan, tetapi saya hanya mencari info serupa dan saya menemukan situs yang berguna ini untuk menggunakan curl dengan PHP unitstep.net/blog/2009/05/05/…
MauroPerez
1
Anda juga dapat menambahkan --insecureuntuk mengabaikan kesalahan SSL.
Alexej Magura
versi curl yang lebih baru (mis. 7.64) tidak akan mengenali cipher lama seperti RC4-SHA - menggunakan versi curl yang lebih lama (7.46) membantu saya serverfault.com/questions/889631/…
hello_earth

Jawaban:

142

Saya mengalami masalah yang sama - saya mengambil halaman dari situs saya sendiri, yang disajikan melalui HTTPS, tetapi curl memberikan pesan "masalah sertifikat SSL" yang sama. Saya mengatasinya dengan menambahkan -kbendera ke panggilan untuk memungkinkan koneksi yang tidak aman.

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

Sunting: Saya menemukan akar masalahnya. Saya menggunakan sertifikat SSL (dari StartSSL, tapi menurut saya itu tidak terlalu penting) dan belum menyiapkan sertifikat perantara dengan benar. Jika Anda mengalami masalah yang sama dengan pengguna1270392 di atas, mungkin sebaiknya Anda melakukannya menguji sertifikat SSL Anda dan memperbaiki masalah apa pun sebelum beralih ke curl -kperbaikan.

Dave Child
sumber
5
-k flag adalah jalan pintas yang bagus. Bekerja untuk saya!
tidydee
45

Solusi sederhana

Itu naskah sehari-hari saya:

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

Keluaran:

* 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
Antonio Feitosa
sumber
11
Jadi, Anda mengizinkan --insecurekoneksi melalui TSL, setiap hari ...
Brethlosze
2
@Brethlosze Terima kasih atas komentar Anda. Tapi, bukan itu masalahnya. Intinya adalah mendapatkan informasi SSL dari semua jenis sertifikat.
Antonio Feitosa
30

Anda harus menyediakan seluruh rantai sertifikat ke curl, karena curl tidak lagi dikirimkan dengan sertifikat CA apa pun. Karena opsi cacert hanya dapat menggunakan satu file, Anda perlu menggabungkan info rantai lengkap menjadi 1 file

Salin rantai sertifikat (dari browser Anda, misalnya) ke biner berenkode DER x.509 (.cer). Lakukan ini untuk setiap sertifikat.

Ubah sertifikat menjadi PEM, dan gabungkan menjadi 1 file.

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"

Saya menulis blog tentang cara melakukan ini di sini: http://javamemento.blogspot.no/2015/10/using-curl-with-ssl-cert-chain.html

Somaiah Kumbera
sumber
1
Bisakah Anda menjelaskan tujuan mengirimkan nama pengguna dan kata sandi? Bagaimana jika saya menulis Klien Java, apakah saya harus memasukkan nama pengguna dan kata sandi di header permintaan GET, dalam hal ini?
Shubhi224
@ Shubhi224 tidak jika server https Anda tidak memerlukan otentikasi sederhana untuk permintaan GET. Saya harus menggunakan otentikasi karena itu adalah panggilan REST yang memerlukannya.
Somaiah Kumbera
Seperti yang disebutkan dalam jawaban ini, "Anda harus menyediakan seluruh rantai sertifikat untuk digulung, karena curl tidak lagi dikirimkan dengan sertifikat CA apa pun."
Mohamed Bana
16

gunakan --cacertuntuk menentukan .crtfile. ca-root-nss.crtsebagai contoh.

ano
sumber
6

Saya sebenarnya memiliki masalah seperti ini dan saya menyelesaikannya dengan langkah-langkah berikut:

  1. Dapatkan bundel sertifikat root CA dari sini: https://curl.haxx.se/ca/cacert.pem dan simpan di lokal

  2. Temukan php.inifile

  3. Tetapkan curl.cainfomenjadi jalur sertifikat. Jadi akan seperti ini:

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

tokek
sumber
1

setelah mengangkat masalah saya dapat menggunakan file CA default sistem yang ada, di debian6 ini adalah:

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

sebagai root ini bisa dilakukan seperti:

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

lalu mulai ulang server web.

Jasen
sumber
1

kamu bisa menggunakan ini

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

Ahmed Ali
sumber
0

Bagi saya, saya hanya ingin menguji situs web yang memiliki pengalihan http-> https otomatis. Saya pikir saya sudah menginstal beberapa sertifikat, jadi ini saja berfungsi untuk saya di Ubuntu 16.04 yang sedang berjalancurl 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>

SamCyanide
sumber
-3

Dengan versi modern dari curl, Anda cukup mengganti alamat ip mana yang akan dihubungkan, menggunakan --resolve atau --connect-to (curl lebih baru dari versi 7.49). Ini bekerja bahkan dengan SSL / SNI. Semua detail ada di halaman manual.

Misalnya, untuk menimpa DNS dan menyambung ke www.example.com dengan ssl menggunakan alamat ip tertentu: (Ini juga akan menimpa ipv6)

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

Contoh lain, untuk menyambung ke server backend tertentu bernama backend1 pada port 8080

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

Ingatlah untuk menambahkan header host jika server membutuhkannya untuk menjawab dengan benar:

-H 'Host:www.example.com' 
ingvarha.dll
sumber
Saya tidak yakin bagaimana ini menjawab pertanyaan itu.
Brethlosze