Menggunakan sertifikat SSL yang ditandatangani sendiri untuk repositori internal APT berbasis HTTPS

10

Saya telah menyiapkan repositori Debian (sebenarnya Ubuntu) untuk penggunaan internal dengan beberapa paket pribadi, dan sekarang ingin membuatnya tersedia melalui web ke beberapa server tertentu. Saya ingin apt-get / aptitude untuk terhubung menggunakan HTTPS, dan karena saya tidak ingin menghabiskan uang menggunakan sertifikat yang ditandatangani sendiri.

Saya sudah mencoba mengikuti halaman manual apt.conf tentang menunjuk apt-get untuk menggunakan sertifikat CA root saya sendiri untuk memvalidasi host, tetapi sepertinya tidak berhasil.

File apt.conf saya terlihat seperti ini:

#Acquire::https::repo.mydomain.com::Verify-Peer "false";
Acquire::https::repo.mydomain.com::CaInfo      "/etc/apt/certs/my-cacert.pem";
Acquire::https::repo.mydomain.com::SslCert     "/etc/apt/certs/my-cert.pem";
Acquire::https::repo.mydomain.com::SslKey      "/etc/apt/certs/my-key.pem";

Saya juga menggunakan sertifikat klien, tetapi tampaknya tidak menjadi masalah karena ketika saya mengatur Verify-Peer menjadi "false" (berkomentar di atas) semuanya berfungsi.

Menggunakan sertifikat CA yang sama, sertifikat klien dan kunci berfungsi dengan baik dengan curl.

Saya mengaktifkan debugging tepat (Debug :: Acquire :: https "true") tetapi hanya menawarkan sedikit informasi.

Ada saran tentang cara melanjutkan?

shevron
sumber

Jawaban:

5

Saya tidak menggunakan otentikasi klien, hanya HTTPS, tetapi saya hanya membuatnya bekerja menggunakan ini:

Acquire::https {
        Verify-Peer "false";
        Verify-Host "false";
}

Saya meletakkan ini pada file di bawah /etc/apt/apt.conf.d.

coredump
sumber
1
Itulah tepatnya yang saya tidak inginkan - saya ingin memverifikasi server menggunakan CA Cert saya sendiri. Menonaktifkan verifikasi berfungsi tetapi saya tidak ingin melakukannya dalam jangka panjang.
shevron
5

Baru-baru ini, saya mengalami masalah serupa. Saya menyelesaikannya dengan menambahkan SslForceVersionopsi.

Konfigurasi saya seperti:

Acquire::https::test.com {
    Verify-Peer "true";
    Verify-Host "true";

    CaInfo "/tmp/ca.crt";

    SslCert "/tmp/client.crt";
    SslKey  "/tmp/client.key";
    SslForceVersion "SSLv3";
};
onemouth
sumber
2
Hati-hati dengan ini. Situs web mulai menonaktifkan SSLv3 karena berbagai alasan keamanan; di masa depan hanya TLSv1 dan yang lebih tinggi yang akan bekerja, dan kemudian hanya TLSv1.2 +
Michael Hampton
3

Di askubuntu , saya menemukan versi yang lebih sederhana dari solusi ini dan yang membatasi pilihan untuk satu host.

Acquire::https::mirror.ufs.ac.za::Verify-Peer "false";

Ini berhasil untuk saya.

Namun, penanya di sini ingin mempertahankan otentikasi; Saya mencoba beberapa hal di sepanjang garis di atas, tetapi tidak berhasil juga. Di sisi lain, karena repositori saya ditandatangani dan saya telah menginstal kunci penandatanganan, otentikasi SSL tidak penting untuk keamanan.

Ted
sumber
lagi, tidak apa yang saya inginkan - Saya melakukan verifikasi kebutuhan rekan. Yang mengatakan, secara pribadi saya memiliki pengaturan yang berfungsi (lihat solusi saya dengan stunnel). Ini mungkin masih membantu orang lain.
shevron
3

Saya menyelesaikannya dengan cara lain, dengan menginstal ca-sertifikat.

  1. Salin *.crtfile Anda ke `/ usr / local / share / ca-sertifikat /
  2. Lari sudo update-ca-certificates

Solusi ini setidaknya berfungsi dengan Ubuntu 14.04.

ortang
sumber
1
Ini juga berfungsi di sekitar proxy yang melakukan intersepsi / dekripsi SSL. Cukup menambahkan cert ke / etc / ssl / certs tidak. Terima kasih untuk ini!
Jordan Anderson
1
Itu tidak berfungsi karena sertifikat yang dipasang oleh saya adalah sertifikat yang ditandatangani sendiri dari firewall kami. Saya tidak punya sertifikat lain.
Paul
1

Semoga ini bisa membantu orang lain - saya belum bisa menyelesaikan ini secara langsung.

Sebagai solusinya, saya sekarang menggunakan stunnel4 untuk membuat terowongan ke repositori HTTPS saya. Sertifikat yang ditandatangani sendiri dan sertifikat klien. Saya telah bekerja sangat baik dengan stunnel4.

Saya telah menyiapkan stunnel untuk mendengarkan di localhost: 8888 untuk koneksi yang masuk, dan mengarahkannya ke repo saya (repo.mydomain.com:443). Saya telah menyiapkan apt untuk mencari repositori saya di http: // localhost: 8888 / .

Sejauh ini ini telah bekerja dengan baik, meskipun sepertinya ini adalah hack yang tidak perlu.

shevron
sumber
-1

GnuTLS atau apt tampaknya buggy. Jika nama host dari apt sources.list saya tidak cocok dengan Apache ServerName dari server web repositori saya, saya mendapatkan kesalahan berikut menggunakan TLSv1:

W: Gagal mengambil https: //repo.example/debian/dists/unstable/non-free/binary-amd64/Packages : gnutls_handshake () gagal: peringatan peringatan TLS telah diterima.

Menggunakan SSLv3 semuanya berfungsi dengan baik.

Catatan: Ini tidak ada hubungannya dengan sertifikat SSL. Sertifikat yang tidak valid akan menghasilkan kesalahan berikut:

Err https: //repo1.example tidak stabil / non-bebas Paket i386 SSL: Nama subjek sertifikat (repo.example) tidak sesuai target nama host 'repo1.example'

Jörg Ludwig
sumber
Sebenarnya, ini benar - Apache mendukung SNI, dan memperingatkan ketika nama host yang diterima dari klien tidak cocok dengan nama host yang dikonfigurasi dari server. Akan lebih baik jika apt akan mencetak detail peringatan, tetapi melakukan hal yang benar. Kembali ke SSLv3 sangat tidak bijaksana akhir-akhir ini, dan hanya "berfungsi" karena Anda menonaktifkan fitur yang seharusnya Anda gunakan.
djmitche