Verwenden eines selbstsignierten SSL-Zertifikats für ein HTTPS-basiertes internes APT-Repository

10

Ich habe ein Debian-Repository (eigentlich Ubuntu) für den internen Gebrauch mit einigen privaten Paketen eingerichtet und möchte es nun einigen bestimmten Servern über das Internet zur Verfügung stellen. Ich möchte, dass apt-get / aptitude über HTTPS eine Verbindung herstellt, und weil ich kein Geld ausgeben möchte, verwende ich ein selbstsigniertes Zertifikat.

Ich habe versucht, der Manpage apt.conf zu folgen, um auf apt-get zu verweisen und mein eigenes Stammzertifizierungsstellenzertifikat zum Überprüfen des Hosts zu verwenden, aber es scheint nicht zu funktionieren.

Meine apt.conf-Datei sieht folgendermaßen aus:

#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";

Ich verwende auch ein Client-Zertifikat, aber es scheint kein Problem zu sein, denn wenn ich Verify-Peer auf "false" setze (siehe oben), funktioniert alles.

Wenn Sie dasselbe CA-Zertifikat verwenden, funktionieren Client-Zertifikat und -Schlüssel gut mit Curl.

Ich habe das Apt-Debugging aktiviert (Debug :: Acquire :: https "true"), aber es bietet nur sehr wenige Informationen.

Irgendwelche Vorschläge, wie es weitergehen soll?

Shevron
quelle

Antworten:

5

Ich verwende keine Clientauthentifizierung, nur HTTPS, aber ich habe es nur so zum Laufen gebracht:

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

Ich habe dies in eine Datei unter gestellt /etc/apt/apt.conf.d.

Core-Dump
quelle
1
Genau das möchte ich nicht - ich möchte den Server mit meinem eigenen CA-Zertifikat überprüfen. Das Deaktivieren der Überprüfung funktioniert, aber ich möchte es nicht langfristig tun.
Shevron
5

Vor kurzem bin ich auf ein ähnliches Problem gestoßen. Ich habe es durch Hinzufügen einer SslForceVersionOption gelöst .

Meine Konfiguration ist wie folgt:

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

    CaInfo "/tmp/ca.crt";

    SslCert "/tmp/client.crt";
    SslKey  "/tmp/client.key";
    SslForceVersion "SSLv3";
};
ein Mund
quelle
2
Sei vorsichtig damit. Websites beginnen aus verschiedenen Sicherheitsgründen, SSLv3 zu deaktivieren. In Zukunft wird nur TLSv1 und höher funktionieren und später nur TLSv1.2 +
Michael Hampton
3

In askubuntu habe ich eine etwas einfachere Version dieser Lösung gefunden, die die Option auf einen einzelnen Host beschränkt.

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

Das hat bei mir funktioniert.

Der Fragesteller hier wollte jedoch die Authentifizierung beibehalten; Ich habe ein paar Dinge in der oben genannten Richtung ausprobiert, konnte es aber auch nicht zum Laufen bringen. Da mein Repository signiert ist und ich den Signaturschlüssel installiert habe, ist die SSL-Authentifizierung für die Sicherheit nicht kritisch.

Ted
quelle
wieder, nicht das, was ich will - ich tun Notwendigkeit Peer Verifikation. Das heißt, ich persönlich habe ein funktionierendes Setup (siehe meine Problemumgehung mit Stunnel). Dies kann anderen noch helfen.
Shevron
3

Ich habe es auf andere Weise gelöst, indem ich das ca-Zertifikat installiert habe.

  1. Kopieren Sie Ihre *.crtDatei nach `/ usr / local / share / ca-certificates /
  2. Lauf sudo update-ca-certificates

Diese Lösung funktioniert mindestens mit Ubuntu 14.04.

ortang
quelle
1
Dies funktioniert auch bei Proxys, die SSL abfangen / entschlüsseln. Das einfache Hinzufügen des Zertifikats zu / etc / ssl / certs ist nicht möglich. Danke dafür!
Jordan Anderson
1
Es funktioniert nicht, da das von mir installierte Zertifikat ein selbstsigniertes Zertifikat unserer Firewall ist. Ich habe kein anderes Zertifikat.
Paul
1

Hoffentlich hilft das anderen - ich konnte das nicht direkt lösen.

Um dieses Problem zu umgehen, verwende ich jetzt stunnel4, um einen Tunnel zu meinem HTTPS-Repository zu erstellen. Selbstsignierte Zertifikate und das Client-Zertifikat Ich habe sehr gut mit stunnel4 gearbeitet.

Ich habe stunnel eingerichtet, um auf localhost: 8888 nach eingehenden Verbindungen zu suchen und diese an mein Repo (repo.mydomain.com:443) weiterzuleiten. Ich habe apt eingerichtet, um unter http: // localhost: 8888 / nach meinem Repository zu suchen .

Bisher hat dies gut funktioniert, obwohl es wie ein unnötiger Hack scheint.

Shevron
quelle
-1

GnuTLS oder apt scheint fehlerhaft zu sein. Wenn der Hostname aus meiner apt source.list nicht mit dem Apache-Servernamen von meinem Repository-Webserver übereinstimmt, wird bei TLSv1 der folgende Fehler angezeigt:

W: Fehler beim Abrufen von https: //repo.example/debian/dists/unstable/non-free/binary-amd64/Packages : gnutls_handshake () fehlgeschlagen: Eine TLS-Warnmeldung wurde empfangen.

Mit SSLv3 funktioniert alles einwandfrei.

Hinweis: Dies hat nichts mit dem SSL-Zertifikat zu tun. Ein ungültiges Zertifikat würde zu folgendem Fehler führen:

Err https: //repo1.example instabile / nicht freie i386-Pakete SSL: Der Name des Zertifikatssubjekts (repo.example) stimmt nicht mit dem Zielhostnamen 'repo1.example' überein.

Jörg Ludwig
quelle
Tatsächlich ist dies richtig - Apache unterstützt SNI und warnt, wenn der vom Client empfangene Hostname nicht mit dem konfigurierten Hostnamen des Servers übereinstimmt. Es wäre schön, wenn apt die Warnungsdetails drucken würde, aber es macht das Richtige. Das Zurückgreifen auf SSLv3 ist heutzutage sehr unklug und "funktioniert" nur, weil Sie Funktionen deaktivieren, die Sie wirklich verwenden sollten.
Djmitche