Cara memperbaiki ikal: (60) Sertifikat SSL: Rantai sertifikat tidak valid saat menggunakan sudo

12

Jadi karena ikal pemutakhiran Mavericks memiliki lebih banyak masalah dengan sertifikat.

Ketika mencoba meringkuk file dari server web saya dengan sertifikat yang ditandatangani sendiri itu mendapatkan kesalahan "Sertifikat SSL: rantai sertifikat tidak valid".

Ini diperbaiki dengan menambahkan sertifikat ke gantungan kunci sistem saya dan mengaturnya untuk selalu mengizinkan SSL, informasi yang saya temukan di sini dan di sini .

Ini berfungsi dengan baik dan ketika saya menggulung file itu mengunduh dengan benar.

Namun jika saya menjalankan curl dengan sudo sebelumnya (misalnya saya memiliki skrip yang perlu dijalankan dengan sudo dan melakukan curl di dalamnya) maka saya kembali ke pesan kesalahan yang sama.

Saya menduga root tidak membaca dari gantungan kunci sistem mungkin?

Adakah yang tahu cara untuk memperbaikinya?

Yakub Tomlinson
sumber

Jawaban:

17

Jika Anda menyimpan sertifikat CA pada sistem file (dalam format PEM), Anda dapat memberi tahu curl untuk menggunakannya

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

Anda juga dapat mematikan verifikasi sertifikat dengan

sudo curl --insecure ...

Sunting: Diperbarui berkaitan dengan umpan balik

Jika Anda ingin mengatur ini secara permanen, Anda harus membuat .curlrcfile dan tempat di direktori home Anda. sudoperintah mungkin memerlukan file ini dalam /var/rootFile ini mengambil opsi yang sama dengan baris perintah tetapi tanpa tanda hubung. Satu opsi per baris:

cacert=/path/to/my/certs.pem
Dan
sumber
Terima kasih atas jawaban Anda, skrip yang sedang dijalankan dengan sudo berasal dari pihak ketiga dan jadi saya tidak bisa benar-benar memodifikasi perintah curl itu sendiri. Tidak aman sebenarnya bukan pilihan. Bisakah ini dilakukan secara global?
Jacob Tomlinson
Anda dapat membuat file .curlrc dan menyimpannya di folder rumah Anda, meskipun menggunakan sudo, file tersebut mungkin harus /var/root/.curlrc. File harus berisi opsi tanpa tanda hubung, satu per baris. Jadi "cacert = / path / to / my / certs.pem"
Dan
1
+1 untuk menyiapkan yang roottersedia .curlrcsebagai gantinya --insecure. Yang persis seperti yang dikatakannya — bagi penyerang di posisi jaringan untuk melakukannya, itu akan sepele bagi MITM dan menyuntikkan kode.
zigg
Terima kasih untuk ini, kedengarannya seperti apa yang saya cari. Saya akan mencobanya besok dan memberi hadiah jika berhasil.
Jacob Tomlinson
6

Root tidak membaca dari pengaturan kepercayaan pengguna saat ini, tetapi ada pengaturan admin trust dan pengaturan trust khusus pengguna root. (Ini juga berbeda dari pengaturan kepercayaan sistem .) Perhatikan, juga, bahwa pengaturan kepercayaan sertifikat agak berbeda dari hanya menambahkan sertifikat ke gantungan kunci; Anda dapat menandai sertifikat sebagai tepercaya tanpa menambahkannya sepenuhnya. (Situasi tepatnya di sini tidak jelas bagi saya, dan dokumen yang saya lihat tidak jelas.)

Anda dapat menandai sertifikat sebagai tepercaya untuk pengguna Anda saat ini

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

tetapi itu tidak membantu dengan root. Solusinya, seperti yang mungkin Anda tebak sekarang, adalah untuk yang sudodi atas, yang kemudian menandainya sebagai tepercaya untuk pengguna root secara khusus:

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

atau menggunakan -dbendera untuk menambahkannya ke pengaturan kepercayaan admin:

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

(OS X akan memunculkan dialog kata sandi untuk mengonfirmasi yang ini.)

Salah satu dari dua yang terakhir tampaknya cukup untuk sudo curl.

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

Wes Campaigne
sumber
Seperti yang saya katakan di pertanyaan saya telah menambahkannya ke sistem keychain dan juga keychain login.
Jacob Tomlinson
Apakah Anda benar-benar mencoba apa yang saya sarankan? Saya mengujinya, persis dalam situasi yang Anda gambarkan, dan itu berhasil. Saya tidak jelas tentang semua detail - dokumentasi tidak jelas - tetapi Anda harus tahu bahwa pengaturan kepercayaan sertifikat TIDAK cukup identik dengan hanya menambahkan sertifikat ke gantungan kunci, dan bahwa pengaturan kepercayaan admin cert ada secara terpisah dari sistem dan pengaturan pengguna / gantungan kunci. (Tampaknya juga ada set pengaturan pengguna root-khusus pengguna dalam campuran.) Saya telah mengedit jawaban saya untuk lebih jelas tentang hal ini. Tolong, coba solusi ini.
Wes Campaigne
Ya saya mencoba solusi ini ketika Anda pertama kali mempostingnya. Sertifikat ada di gantungan kunci sistem dan ditetapkan sebagai tepercaya. Masih belum berhasil.
Jacob Tomlinson
5

Ini benar-benar dalam petunjuk keluaran:

echo insecure >> ~/.curlrc

Keuntungan menggunakan solusi di atas adalah ia bekerja untuk semua curlperintah, tetapi tidak dianjurkan karena dapat memperkenalkan serangan MITM dengan menghubungkan ke host yang tidak aman dan tidak terpercaya.

zinking
sumber
2

Jika Anda menggunakan MacPorts (dan skrip pihak ke-3 yang Anda sebutkan tidak menghapusnya $PATHatau menelepon /usr/bin/curl), Anda dapat menginstal certsyncdan curlport dalam urutan ini.

certsyncadalah alat dan daftar peluncuran yang sesuai yang akan mengekspor gantungan kunci sistem Anda ke $prefix/etc/openssl/cert.pemdan menginstal symlink $prefix/share/curl/curl-ca-bundle.crt -> $prefix/etc/openssl/cert.pemsehingga MacPorts curl akan secara otomatis mengambil sertifikat. certsyncjuga akan secara otomatis memperbarui file yang dihasilkan ketika Anda mengubah gantungan kunci sistem Anda.

Neverpanic
sumber
Terima kasih untuk ini, saya ingin menghindari menggunakan MacPort jika memungkinkan.
Jacob Tomlinson
-1

Untuk membuat sudo curlpekerjaan (pada OSX Sierra), kami harus mengimpor sertifikat ke System.keychaindan percaya di sana. Ini dapat dilakukan secara manual di aplikasi Keychain atau menggunakan perintah ini:

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

Penting untuk menentukan -ddan secara manual mengatur jalur ke gantungan kunci Sistem melalui -kuntuk memastikan sertifikat benar-benar diimpor di sana jika belum.

Perintah bekerja tanpa sudo, tetapi kemudian akan meminta kata sandi melalui dialog UI, yang mungkin menjadi rintangan untuk skrip.

Alexander Klimetschek
sumber
Saya mendapatkan kesalahanSecCertificateCreateFromData: Unknown format in import.
rraallvv
Siapa pun yang downvoted, ketahuilah bahwa saya dengan jelas menulis "di OSX Sierra" dan ini adalah solusi yang bagus untuk kami. Jika tidak bekerja di versi OSX yang lebih baru dari itu mungkin karena dukungan atau tooling OSX telah berubah. Atau masalah seperti komentator sebelumnya, di mana file input tidak dalam format yang didukung (pertanyaan tidak menentukan itu).
Alexander Klimetschek