Jak naprawić curl: (60) certyfikat SSL: nieprawidłowy łańcuch certyfikatów podczas korzystania z sudo

12

Odkąd curl aktualizacji Mavericks ma więcej problemów z certyfikatami.

Podczas próby zwinięcia pliku z mojego serwera internetowego za pomocą certyfikatu z podpisem własnym pojawia się błąd „Certyfikat SSL: nieprawidłowy łańcuch certyfikatów”.

Zostało to poprawione poprzez dodanie certyfikatu do mojego pęku kluczy systemu i ustawienie go tak, aby zawsze zezwalał na SSL, informacje, które znalazłem tu i tutaj .

Działa to dobrze, a kiedy zwijam plik, jest on pobierany poprawnie.

Jeśli jednak wcześniej uruchamiam curl za pomocą sudo (np. Mam skrypt, który należy uruchomić za pomocą sudo i robi w nim curl), wrócę do tego samego komunikatu o błędzie.

Zgaduję, że root nie może odczytać z systemowego pęku kluczy?

Czy ktoś wie, jak to naprawić?

Jacob Tomlinson
źródło

Odpowiedzi:

17

Jeśli przechowujesz swoje certyfikaty CA w systemie plików (w formacie PEM), możesz powiedzieć curl, aby ich używał

sudo curl --cacert /path/to/cacert.pem ...

Możesz także wyłączyć weryfikację certyfikatu za pomocą

sudo curl --insecure ...

Edycja: Zaktualizowano w odniesieniu do opinii

Jeśli chcesz ustawić to na stałe, powinieneś utworzyć .curlrcpliki i umieścić je w swoim katalogu domowym. sudopolecenia mogą wymagać tego pliku w /var/rootpliku Plik ma te same opcje co wiersz poleceń, ale bez myślników. Jedna opcja na linię:

cacert=/path/to/my/certs.pem
Dan
źródło
Dzięki za odpowiedź, skrypt uruchamiany za pomocą sudo pochodzi od innej firmy, więc nie mogę tak naprawdę modyfikować samego polecenia curl. Niepewność nie jest tak naprawdę opcją. Czy można to zrobić na całym świecie?
Jacob Tomlinson
Możesz utworzyć plik .curlrc i zapisać go w folderze domowym, chociaż w przypadku sudo może być konieczne użycie /var/root/.curlrc. Plik powinien zawierać opcje bez myślników, po jednej w wierszu. Tak więc „cacert = / path / to / my / certs.pem”
Dan
1
+1 za ustawienie root-dostępne .curlrczamiast --insecure. Dokładnie tak, jak to mówi - aby atakujący znajdujący się w sieci mógł to zrobić, MITM i wstrzyknięcie kodu byłoby banalne.
zigg
Dzięki za to, brzmi jak to, czego szukam. Spróbuję jutro i przyznam nagrodę, jeśli zadziała.
Jacob Tomlinson,
6

Root nie odczytuje z bieżących ustawień zaufania użytkownika, ale istnieją zarówno ustawienia zaufania administratora, jak i ustawienia zaufania specyficzne dla użytkownika root. (Są one również różne od ustawień zaufania systemu .) Należy również pamiętać, że ustawienia zaufania certyfikatów różnią się nieco od dodania certyfikatu do pęku kluczy; możesz oznaczyć certyfikat jako zaufany bez pełnego dodawania. (Dokładna sytuacja tutaj nie jest dla mnie jasna, a dokumenty, które widziałem, są niejasne.)

Możesz oznaczyć certyfikat jako zaufany dla bieżącego użytkownika jako

$ security add-trusted-cert /path/to/cert.pem

ale to nie pomaga w rootowaniu. Rozwiązanie, jak można się teraz domyślać, odnosi się do sudopowyższego, co oznacza, że ​​jest to szczególnie zaufane dla użytkownika root:

$ sudo security add-trusted-cert /path/to/cert.pem

lub użyć -dflagi, aby dodać ją do ustawień zaufania administratora:

$ security add-trusted-cert -d /path/to/cert.pem

(OS X wyświetli okno dialogowe hasła, aby je potwierdzić).

Każdy z dwóch ostatnich wydaje się wystarczający sudo curl.

Odniesienie: https://developer.apple.com/library/mac/Documentation/Darwin/Reference/ManPages/man1/security.1.html

Wes Campaigne
źródło
Jak powiedziałem w pytaniu, dodałem je już do pęku kluczy systemu, a także pęku kluczy logowania.
Jacob Tomlinson,
Czy rzeczywiście próbowałeś tego, co zasugerowałem? Przetestowałem to w dokładnie opisanej sytuacji i zadziałało. Nie mam jasności co do wszystkich szczegółów - dokumentacja jest niejasna - ale powinieneś wiedzieć, że ustawienia zaufania certyfikatu NIE są dość jednoznaczne z dodaniem certyfikatu do pęku kluczy, a ustawienia zaufania certyfikatu administratora istnieją niezależnie od systemu i ustawienia użytkownika / pęku kluczy. (Wydaje się, że w miksie jest również zestaw ustawień użytkownika specyficznych dla użytkownika root). Zedytowałem swoją odpowiedź, aby była bardziej zrozumiała w tym punkcie. Spróbuj tego rozwiązania.
Wes Campaigne
Tak, wypróbowałem to rozwiązanie, kiedy opublikowałeś je po raz pierwszy. Certyfikaty znajdują się w pęku kluczy systemu i są ustawione jako zaufane. Wciąż nie ma szczęścia.
Jacob Tomlinson,
5

To jest tak naprawdę w podpowiedzi wyjściowej:

echo insecure >> ~/.curlrc

Zaletą zastosowania powyższego rozwiązania jest to, że działa ono dla wszystkich curlpoleceń, ale nie jest zalecane, ponieważ może wprowadzać ataki MITM , łącząc się z niepewnymi i niezaufanymi hostami.

mrugać
źródło
2

Jeśli używasz MacPorts (a wspomniany skrypt innej firmy nie usuwa go $PATHani nie wywołuje /usr/bin/curl), możesz zainstalować porty certsynci curlw tej kolejności.

certsyncjest narzędziem i odpowiednią listą uruchomieniową, która wyeksportuje breloczek do systemu $prefix/etc/openssl/cert.pemi zainstaluje dowiązanie symboliczne, $prefix/share/curl/curl-ca-bundle.crt -> $prefix/etc/openssl/cert.pemdzięki czemu curl MacPorts automatycznie odbierze certyfikaty. certsyncautomatycznie zaktualizuje również wygenerowane pliki po zmianie pęku kluczy systemu.

nigdy niepanic
źródło
Dzięki za to, chciałbym jednak unikać korzystania z MacPorts, jeśli to możliwe.
Jacob Tomlinson,
-1

Aby sudo curldziałać (w OSX Sierra), musieliśmy zaimportować certyfikat do System.keychaini tam zaufać. Można to zrobić ręcznie w aplikacji pęku kluczy lub za pomocą tego polecenia:

sudo security add-trusted-cert -d -k /Library/Keychains/System.keychain /path/to/cert.pem

Ważne było zarówno określenie, jak -di ręczne ustawienie ścieżki do pęku kluczy Systemu, -kaby upewnić się, że certyfikat rzeczywiście zostanie tam zaimportowany, jeśli jeszcze tego nie zrobił.

Polecenie działa bez sudo, ale następnie poprosi o hasło w oknie dialogowym interfejsu użytkownika, co może być przeszkodą dla skryptów.

Alexander Klimetschek
źródło
SecCertificateCreateFromData: Unknown format in import.
Pojawia się
Ktokolwiek głosował, proszę wiedzieć, że wyraźnie napisałem „na OSX Sierra” i było to dla nas działające rozwiązanie. Jeśli nie działa w nowszych wersjach OSX, może to wynikać z faktu, że obsługa lub narzędzia OSX uległy zmianie. Lub problem taki jak poprzedni komentator, w którym plik wejściowy nie ma obsługiwanego formatu (pytanie tego nie określa).
Alexander Klimetschek