GNU/Linux >> Belajar Linux >  >> Linux

Cara Memperbaiki Masalah Protokol SSL TLS Curl dari CLI dan Kode PHP

T: Di salah satu server kami, server web tidak diatur untuk mendukung SSLv2 atau SSLv3. Keduanya dinonaktifkan di sisi server. Ini hanya mendukung TLSv1. Bagaimana saya bisa membuat curl berfungsi dari kedua baris perintah, dan dari dalam kode PHP saya?

J: Dalam kebanyakan kasus, curl akan secara otomatis memilih protokol yang benar dan menghubungkannya. Namun, Anda juga dapat menentukan protokol khusus yang akan digunakan untuk perintah curl. Dalam contoh ini, Anda harus menginstruksikan CURL untuk menggunakan TLSv1, seperti yang dijelaskan dalam tutorial ini.

Tentukan Protokol pada Baris Perintah Curl

Berikut ini adalah berbagai opsi protokol yang didukung pada baris perintah oleh curl:

  • -0 (atau) –http1.0 untuk HTTP 1.0 (H)
  • -1 (atau) –tlsv1 untuk TLSv1 (SSL)
  • -2 (atau) –sslv2 untuk SSLv2 (SSL)
  • -3 (atau) –sslv3 untuk SSLv3 (SSL)

Dalam contoh ini, server khusus ini, bekerja pada HTTP biasa. Tidak ada masalah di sini.

$ curl http://192.168.101.1
<html><body><h1>It works!</h1></body></html>

Lihat ini:15 Contoh Perintah Linux cURL Praktis

Namun, jika Anda menggunakan SSLv3, menggunakan opsi -3, ini akan mengembalikan pesan kesalahan “sslv3 alert handshake failure”.

$ curl -3 https://192.168.101.1
curl: (35) error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure

Jika Anda menggunakan SSLv2, menggunakan opsi -2, ia mengembalikan pesan kesalahan “Protokol SSL tidak dikenal”.

$ curl -2 https://192.168.101.1
curl: (35) Unknown SSL protocol error in connection to 192.168.101.1:443 

Dalam hal ini, di server khusus ini, hanya mendukung TLS. Jadi, gunakan opsi -1 seperti yang ditunjukkan di bawah ini.

$ curl -1 https://192.168.101.1
curl: (60) SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

Dalam hal ini, karena kami menggunakan alamat ip, yang tidak cocok dengan sertifikat SSL yang diinstal pada server web. Jadi, kita mendapatkan pesan kesalahan “SSL3_GET_SERVER_CERTIFICATE:certificate memverifikasi gagal” di atas.

Curl secara default melakukan verifikasi sertifikat SSL. Jika Anda menggunakan bundel otoritas CA, maka nama bundel default adalah curl-ca-bundle.crt. Anda dapat menentukan bundel yang berbeda menggunakan opsi –cacert.

Namun, dalam kasus kami, kami ingin menggunakan protokol TLSv1, tetapi tanpa verifikasi sertifikat SSL. Untuk ini, gunakan opsi -k (atau opsi –insecure), yang tidak akan melakukan verifikasi sertifikat SSL.

Berikut ini adalah penggunaan opsi -k.

$ curl -k https://192.168.101.1
curl: (35) Unknown SSL protocol error in connection to 192.168.101.1:443 

Jika Anda ingin mengetahui lebih detail tentang kesalahan yang dilemparkan oleh perintah CURL, gunakan opsi -v. Seperti yang Anda lihat di bawah ini. Bahkan ketika kami tidak melewati opsi protokol, dari output perintah, kami dapat melihatnya mencoba menggunakan SSLv2 untuk ini.

$ curl -k -v https://192.168.101.1
* About to connect() to 192.168.101.1 port 443
*   Trying 192.168.101.1... connected
* Connected to 192.168.101.1 (192.168.101.1) port 443
* successfully set certificate verify locations:
*   CAfile: /etc/pki/tls/certs/ca-bundle.crt
  CApath: none
* SSLv2, Client hello (1):
Unknown SSL protocol error in connection to 192.168.101.1:443 
* Closing connection #0
curl: (35) Unknown SSL protocol error in connection to 192.168.101.1:443 

Solusi Dari Baris Perintah

Lihat ini:wget vs curl:Cara Mengunduh File Menggunakan wget dan curl

Jadi, dalam kasus kami, karena SSLv2 dan SSLv3 dinonaktifkan di sisi server, dan untuk beberapa alasan jika curl tidak secara otomatis mengatur protokol yang benar, berikut ini berfungsi ketika kami hanya ingin menggunakan protokol TLSv1 dengan curl dari baris perintah sebagai ditunjukkan di bawah ini.

$ curl -k -1 https://192.168.101.1
<html><body><h1>It works!</h1></body></html>

Jika Anda ingin melihat detail tentang apa sebenarnya fungsi ini, berikan opsi -v seperti yang ditunjukkan di bawah ini.

$ curl -k -1 -v https://192.168.101.1

Hal di atas juga dapat dilakukan dengan menggunakan opsi alternatif berikut

$ curl --insecure --tlsv1 --verbose https://192.168.101.1

Sekali lagi, dalam perintah di atas:

  • -1 (atau) –tlsv1 untuk TLSv1 (SSL)
  • -k (atau) –tidak aman untuk Mengizinkan koneksi ke situs SSL tanpa sertifikat (H)
  • -v (atau) –verbose untuk Membuat operasi lebih banyak bicara (huruf kecil v)

Solusi Dari PHP

Dari kode PHP Anda, jika Anda menggunakan fungsi cURL, dan ingin mengatur opsi protokol, Anda harus menggunakan fungsi curl_setopt atau curl_setopt_array.

Gunakan curl_setopt jika Anda hanya ingin menyetel satu opsi.

curl_setopt($c, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);

Di atas:

  • $c adalah variabel curl yang Anda dapatkan dari fungsi curl_init(), saat Anda membuat sumber daya cURL baru dari program PHP Anda.
  • CURLOPT_SSLVERSION adalah nama opsi ikal.
  • CURL_SSLVERSION_TLSv1 adalah nilai ikal untuk opsi yang sesuai di parameter#2

Anda juga dapat menggunakan angka sebagai ganti “CURL_SSLVERSION_TLSv1”. Dalam contoh ini, ini setara dengan 1.

curl_setopt($c, CURLOPT_SSLVERSION, 1);

Berikut ini adalah kemungkinan nilai CURLOPT_SSLVERSION yang dapat Anda atur. Anda dapat menggunakan konstanta deskriptif atau angka yang sesuai yang ditunjukkan di bawah ini.

  • CURL_SSLVERSION_DEFAULT (0)
  • CURL_SSLVERSION_TLSv1 (1)
  • CURL_SSLVERSION_SSLv2 (2)
  • CURL_SSLVERSION_SSLv3 (3)
  • CURL_SSLVERSION_TLSv1_0 (4)
  • CURL_SSLVERSION_TLSv1_1 (5)
  • CURL_SSLVERSION_TLSv1_2 (6)

Saat Anda ingin mengatur beberapa opsi CURL, gunakan curl_setopt_array seperti yang ditunjukkan di bawah ini. Di sini, selain menyetel CURLOPT_SSLVERSION, ini juga menyetel beberapa opsi ikal lainnya.

Dalam hal ini, parameter ke-2 akan berupa larik yang akan berisi beberapa opsi CURL seperti yang ditunjukkan di bawah ini.

curl_setopt_array($c, array
(
  CURLOPT_SSL_VERIFYHOST => 0,
  CURLOPT_SSL_VERIFYPEER => 0,
  CURLOPT_SSLVERSION => 1
));

Linux
  1. Cara Mengkompilasi dan Menginstal Perangkat Lunak dari Kode Sumber di Linux

  2. Cara Memanggil Fungsi C di C++, Fungsi C++ di C (Campuran C dan C++)

  3. Bagaimana cara mendapatkan konsol linux $COLUMNS dan $ROWS dari PHP cli?

  1. Apa itu Perintah cURL Dan Bagaimana Cara Menggunakannya?

  2. Cara memeriksa apakah ada perintah shell dari PHP

  3. Bagaimana cara menghapus VS Code &pengaturan dari Ubuntu?

  1. Keluarkan sertifikat SSL gratis dan CA yang ditandatangani untuk server web dari LetsEncrypt

  2. Bagaimana Cara Downgrade Php Dari 5.3.x Menjadi 5.2.x?

  3. Bagaimana Cara Mengaktifkan Menu Global Dan Memperbaiki Hud (setelah Meningkatkan Ke 12,04 Dari 10,04)?