https-Verbindung mit CURL über die Befehlszeile

127

Ich bin neu in der Curl and Cacerts-Welt und habe ein Problem beim Herstellen einer Verbindung zu einem Server. Grundsätzlich muss ich die Konnektivität über https von einem Computer zu einem anderen Computer testen. Ich habe eine URL, zu der ich eine Verbindung von Maschine A (einer Linux-Maschine) herstellen muss. Ich habe dies an der Eingabeaufforderung versucht

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

und bekam folgendes:

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

Als ich einige Artikel über das Internet durchgesehen habe, habe ich Folgendes getan:

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

und erhielt eine Antwort einschließlich des Serverzertifikats (innen -----BEGIN CERTIFICATE----- and -----END CERTIFICATE-----).

Was soll ich als nächstes von hier aus tun? Ich denke, ich muss nur kopieren, den Text einfügen BEGIN CERTIFICATE & END CERTIFICATEund in einer Datei speichern. Aber welche Art von Datei sollte es sein? .pem, .crt? .. Was soll ich danach tun werden?

Ich habe dies versucht - habe den Text darin kopiert BEGIN CERTIFICATE & END CERTIFICATEund in einer .crtDatei gespeichert - habe ihn benannt my-ca.crt(habe auch das Gleiche versucht, indem ich ihn als my-ca.pemDatei benannt habe) und dann Folgendes getan:

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

Habe aber den gleichen Fehler.

user1270392
quelle
Ich bin mir nicht sicher, welche Lösung Sie vorschlagen, aber ich habe nur nach ähnlichen Informationen gesucht und diese nützliche Website für die Verwendung von Curl mit PHP gefunden. Unitstep.net/blog/2009/05/05/…
MauroPerez
1
Sie können auch hinzufügen, --insecureum den SSL-Fehler zu ignorieren.
Alexej Magura
Neuere Versionen von Curl (z. B. 7.64) würden ältere Chiffren wie RC4-SHA nicht erkennen - die Verwendung einer älteren Version von Curl (7.46) hat mir geholfen, serverfault.com/questions/889631/…
hallo_earth

Antworten:

142

Ich hatte das gleiche Problem - ich habe eine Seite von meiner eigenen Site abgerufen, die über HTTPS bereitgestellt wurde, aber curl hat die gleiche Meldung "SSL-Zertifikatsproblem" ausgegeben. Ich habe es umgangen, indem ich -kdem Anruf ein Flag hinzugefügt habe , um unsichere Verbindungen zuzulassen.

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

Bearbeiten: Ich habe die Wurzel des Problems entdeckt. Ich habe ein SSL-Zertifikat verwendet (von StartSSL, aber ich denke nicht, dass das wichtig ist) und das Zwischenzertifikat nicht ordnungsgemäß eingerichtet. Wenn Sie das gleiche Problem wie oben bei user1270392 haben, ist es wahrscheinlich eine gute Idee, Ihr SSL-Zertifikat zu testen und Probleme damit zu curl -kbeheben, bevor Sie auf das Update zurückgreifen .

Dave Child
quelle
5
-k flag ist eine nette Abkürzung. Hat für mich gearbeitet!
Tidydee
45

Einfache Lösung

Das ist mein alltägliches Drehbuch:

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

Ausgabe:

* 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
quelle
11
So erlauben Sie eine --insecureVerbindung über TSL, jeden Tag ...
Brethlosze
2
@Brethlosze Danke für deinen Kommentar. Das ist aber nicht der Fall. Der Punkt ist, die SSL-Informationen von allen Arten von Zertifikaten zu erhalten.
Antonio Feitosa
30

Sie müssen die gesamte Zertifikatkette zum Einrollen bereitstellen, da das Einrollen nicht mehr mit CA-Zertifikaten geliefert wird. Da die Option cacert nur eine Datei verwenden kann, müssen Sie die vollständigen Ketteninformationen in einer Datei zusammenfassen

Kopieren Sie die Zertifikatkette (z. B. von Ihrem Browser) in die DER-codierte Binärdatei x.509 (.cer). Tun Sie dies für jedes Zertifikat.

Konvertieren Sie die Zertifikate in PEM und verknüpfen Sie sie in eine Datei.

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"

Ich habe hier einen Blog darüber geschrieben: http://javamemento.blogspot.no/2015/10/using-curl-with-ssl-cert-chain.html

Somaiah Kumbera
quelle
1
Können Sie bitte den Zweck der Übergabe von Benutzername und Passwort erläutern? Was passiert, wenn ich einen Java-Client schreibe, muss ich in diesem Fall den Benutzernamen und das Kennwort im Header der GET-Anforderung übergeben?
Shubhi224
@ Shubhi224 nicht, wenn Ihr https-Server keine einfache Authentifizierung für GET-Anforderungen erfordert. Ich musste die Authentifizierung verwenden, da dies ein REST-Aufruf war, der dies erforderte.
Somaiah Kumbera
Wie in dieser Antwort erwähnt "Sie müssen die gesamte Zertifikatkette zum Einrollen bereitstellen, da das Einrollen nicht mehr mit CA-Zertifikaten geliefert wird."
Mohamed Bana
16

Verwenden Sie --cacertdiese Option, um eine .crtDatei anzugeben . ca-root-nss.crtbeispielsweise.

ano
quelle
6

Ich hatte tatsächlich ein solches Problem und löse es durch folgende Schritte:

  1. Das Paket mit Stammzertifizierungsstellenzertifikaten erhalten Sie hier: https://curl.haxx.se/ca/cacert.pem und speichern Sie es lokal

  2. Suchen Sie die php.iniDatei

  3. Legen Sie den curl.cainfoPfad der Zertifikate fest. Also wird es so etwas wie:

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

Geckob
quelle
1

Nachdem ich das Problem gelöst hatte, konnte ich die vorhandene Standard-CA-Systemdatei verwenden. Auf debian6 ist dies:

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

Als Wurzel kann dies wie folgt gemacht werden:

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

Starten Sie dann den Webserver neu.

Jasen
quelle
1

Sie könnten dies verwenden

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

Ahmed Ali
quelle
0

Für mich wollte ich nur eine Website testen, die eine automatische http-> https-Weiterleitung hatte. Ich glaube, ich hatte bereits einige Zertifikate installiert, daher funktioniert dies allein für mich unter Ubuntu 16.04curl 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
quelle
-2

Mit modernen Versionen von curl können Sie einfach die IP-Adresse überschreiben, mit der Sie eine Verbindung herstellen möchten, indem Sie --resolve oder --connect-to verwenden (curl neuer als Version 7.49). Dies funktioniert auch mit SSL / SNI. Alle Details finden Sie in der Manpage.

So überschreiben Sie beispielsweise DNS und stellen mit ssl unter Verwendung einer bestimmten IP-Adresse eine Verbindung zu www.example.com her: (Dadurch wird auch IPv6 überschrieben.)

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

Ein weiteres Beispiel, um eine Verbindung zu einem bestimmten Backend-Server mit dem Namen backend1 auf Port 8080 herzustellen

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

Denken Sie daran, den Host-Header hinzuzufügen, wenn der Server dies benötigt, um richtig zu antworten:

-H 'Host:www.example.com' 
ingvarha
quelle
Ich bin mir nicht sicher, wie dies die Frage beantwortet.
Brethlosze