Komut satırından CURL kullanarak https bağlantısı


127

Curl and Cacerts dünyasında yeniyim ve bir sunucuya bağlanırken bir sorunla karşılaşıyorum. Temel olarak, bir makineden başka bir makineye https üzerinden bağlanabilirliği test etmem gerekiyor. A makinesinden (bir linux makinesi) bağlanmam gereken bir URL’im var Bunu komut isteminde denedim

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

ve aşağıdakileri aldı:

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

İnternet üzerinden bazı makaleleri incelerken şunu yaptım:

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

ve sunucu sertifikası dahil olmak üzere bazı yanıtlar aldı (içinde -----BEGIN CERTIFICATE----- and -----END CERTIFICATE-----).

Bundan sonra ne yapmalıyım? Sanırım, metni kopyalayıp içine yapıştırmam BEGIN CERTIFICATE & END CERTIFICATEve bir dosyaya kaydetmem gerekecek . Ancak, ne tür bir dosya olmalı? .pem, .crt? .. Bundan sonra ne yapmalıyım?

Bunu denedim - içindeki metni kopyaladım ve BEGIN CERTIFICATE & END CERTIFICATEbir .crtdosyaya kaydettim - olarak adlandırdım my-ca.crt(aynı şeyi my-ca.pemdosya olarak adlandırarak da denedim ) ve sonra şunu yaptım:

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

Ama aynı hatayı aldım.



1
--insecureSSL hatasını göz ardı etmek için de ekleyebilirsiniz .
Alexej Magura

curl'nin daha yeni sürümleri (ör. 7.64) RC4-SHA gibi daha eski şifreleri tanımıyordu
curl'nin

Yanıtlar:


142

Aynı sorunu yaşadım - HTTPS üzerinden sunulan kendi sitemden bir sayfa alıyordum, ancak curl aynı "SSL sertifikası sorunu" mesajını veriyordu. -kGüvenli olmayan bağlantılara izin vermek için aramaya bir bayrak ekleyerek bunun etrafında çalıştım .

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

Düzenleme: Sorunun kökenini keşfettim. Bir SSL sertifikası kullanıyordum (StartSSL'den, ancak bunun önemli olduğunu sanmıyorum) ve ara sertifikayı doğru şekilde ayarlamamıştım. Yukarıdaki user1270392 ile aynı sorunu yaşıyorsanız, SSL sertifikanızı test etmek ve düzeltmeye başvurmadan önce onunla ilgili sorunları düzeltmek muhtemelen iyi bir fikirdir curl -k.


5
-k bayrağı güzel bir kısayol. Benim için çalıştı!
tidydee

45

Basit çözüm

Bu benim günlük senaryom:

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

Çıktı:

* 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
Böylece, --insecureher gün TSL üzerinden bir bağlantıya izin
veriyorsunuz

2
@Brethlosze Yorumunuz için teşekkürler. Ama durum bu değil. Önemli olan SSL bilgilerini her türlü sertifikadan almaktır.
Antonio Feitosa

30

Curl artık herhangi bir CA sertifikasıyla birlikte gönderilmediği için curl için tüm sertifika zincirini sağlamanız gerekir. Cacert seçeneği yalnızca bir dosya kullanabildiğinden, tüm zincir bilgisini 1 dosyada birleştirmeniz gerekir

Sertifika zincirini (örneğin tarayıcınızdan) DER kodlu ikili x.509'a (.cer) kopyalayın. Bunu her sertifika için yapın.

Sertifikaları PEM'e dönüştürün ve 1 dosyada birleştirin.

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"

Bunun nasıl yapılacağına dair bir blog yazdım: http://javamemento.blogspot.no/2015/10/using-curl-with-ssl-cert-chain.html


1
Lütfen userName ve Password'ü geçirmenin amacını açıklar mısınız? Bir Java İstemcisi yazıyorsam, bu durumda GET isteğinin başlığındaki userName ve parolayı iletmem gerekir mi?
Shubhi224

@ Shubhi224 https sunucunuz GET istekleri için basit bir kimlik doğrulama gerektirmiyorsa. Bunu gerektiren bir REST çağrısı olduğu için kimlik doğrulamasını kullanmak zorunda kaldım.
Somaiah Kumbera

Bu yanıtta belirtildiği gibi "curl artık herhangi bir CA sertifikasıyla birlikte gönderilmediği için curl için tüm sertifika zincirini sağlamanız gerekir."
Mohamed Bana

16

--cacertbir .crtdosya belirtmek için kullanın . ca-root-nss.crtÖrneğin.


6

Aslında bu tür bir problemim vardı ve şu adımlarla çözüyorum:

  1. Kök CA sertifikaları paketini buradan edinin : https://curl.haxx.se/ca/cacert.pem ve yerel olarak kaydedin

  2. php.iniDosyayı bul

  3. curl.cainfoSertifikaların yolu olarak ayarlayın . Yani şöyle bir şey olacak:

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



1

problemi yaşadıktan sonra mevcut sistem varsayılan CA dosyasını kullanabildim, debian6'da bu:

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

kök olarak bu şu şekilde yapılabilir:

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

ardından web sunucusunu yeniden başlatın.


1

bunu kullanabilirsin

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


0

Benim için, otomatik http-> https yönlendirmesi olan bir web sitesini test etmek istedim. Sanırım bazı sertifikalarım zaten kurulu, bu yüzden bu tek başına benim için Ubuntu 16.04'te çalışıyorcurl 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>


-3

Curl'nin modern sürümleriyle, --resolve veya --connect-to (7.49 sürümünden daha yeni curl) kullanarak hangi ip adresine bağlanacağınızı basitçe geçersiz kılabilirsiniz. Bu, SSL / SNI ile bile çalışır. Tüm detaylar man sayfasında.

Örneğin, DNS'yi geçersiz kılmak ve www.example.com'a belirli bir ip adresi kullanarak ssl ile bağlanmak için: (Bu aynı zamanda ipv6'yı da geçersiz kılacaktır)

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

Başka bir örnek, 8080 numaralı bağlantı noktasında arka uç1 adlı belirli bir arka uç sunucusuna bağlanmak için

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

Sunucunun doğru yanıt vermesi gerekiyorsa ana bilgisayar başlığını eklemeyi unutmayın:

-H 'Host:www.example.com' 

Bunun soruyu nasıl yanıtladığından emin değilim.
Brethlosze
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.