git-Zugriff via https und Client-Zertifikaten

Vor einiger Zeit hatte ich ein Howto geschrieben, wie man einen Git-Server mit https und Client-Zertifikaten einrichtet - höchste Zeit, auch die Einrichtung der Clientseite mal zusammenzufassen!

Schlüssel und Zertifikate aus einer pkcs12-Datei extrahieren

git benötigt das Client-Zertifikat, den zugehörigen Schlüssel sowie das Server-Zertifikat in separaten Dateien. Wer das schon zur Hand hat, kann diesen Abschnitt überspringen :-)
Vom Import des Clientzertifikats hatte ich noch eine pkcs12-Datei vorliegen. Mit Hilfe des Kommandozeilentools des openssl-Pakets kann man die Dateien daraus extrahieren. Das eigene Zertifikat erhält man mittels
openssl pkcs12 -in your.p12 -clcerts -nokeys -out cert.crt
Den zugehörigen Schlüssel extrahiert man folgendermaßen unverschlüsselt in eine Datei:
openssl pkcs12 -in your.p12 -nocerts -nodes -out key.pem
In meinem Fall wird dieselbe CA als Serverzertifikat verwendet - das ist also sicher nicht bei jedem so ;-) Jedenfalls läßt sich dieses Zertifikat mit folgendem Kommando extrahieren:
openssl pkcs12 -in your.p12 -cacerts -nokeys -out cainfo.crt

Vorbereiten des lokalen git-Repositorys

Ein Repository, das auf einem Server liegt, welcher Client-Zertifikate fordert, kann leider nicht mittels eines einfachen "git clone" geklont werden - es sei denn, man konfiguriert das Zertifikat in der globalen git-Konfiguration. Letzteres sperrt einen aber von allen anderen "normalen" Repositories aus, daher ist das nur in Ausnahmefällen eine gangbare Lösung. Deshalb gehen wir hier anders vor: Wir legen zunächst ein leeres git-Repository an, konfigurieren darin das Zertifikat und stellen anschließend die Verknüpfung zum Remote Repository her.
Ein leeres git-Repo ist rasch angelegt:
git init repo
Darin legen wir nun ein eigenes Verzeichnis "certificates" an und kopieren dorthin die Dateien aus dem ersten Abschnitt. Nun sagen wir git, wo die Dateien zu finden sind:

git config http.sslCAInfo certificates/cainfo.crt
git config http.sslCert certificates/cert.crt
git config http.sslKey certificates/key.pem

Damit wäre der Zertifikatteil erledigt. Fügen wir das Remote Repository unter dem Namen "origin" hinzu:
git remote add origin https://...
...und legen nun noch origin als Standard-Gegenstelle für den lokalen master fest:
git config branch.master.remote origin
git config branch.master.merge refs/heads/master

Das war's!

Das war's auch schon! Nun können wir die Daten aus dem Remote Repo abholen (und sind damit an dem Punkt, was im Normalfall ein einfaches "git clone" erledigt):
git pull
Abschließend macht es noch Sinn, das certificates-Verzeichnis in die .gitignore-Liste aufzunehmen - um zu vermeiden, versehentlich seinen geheimen Schlüssel zu committen :-)