git-Zugriff via https und Client-Zertifikaten

Vor ei­ni­ger Zeit hatte ich ein Howto ge­schrie­ben, wie man einen Git-Ser­ver mit https und Cli­ent-Zer­ti­fi­ka­ten ein­rich­tet - höchs­te Zeit, auch die Ein­rich­tung der Cli­ent­sei­te mal zu­sam­men­zu­fas­sen!

Schlüs­sel und Zer­ti­fi­ka­te aus einer pk­cs12-Da­tei ex­tra­hie­ren

git be­nö­tigt das Cli­ent-Zer­ti­fi­kat, den zu­ge­hö­ri­gen Schlüs­sel sowie das Ser­ver-Zer­ti­fi­kat in se­pa­ra­ten Da­tei­en. Wer das schon zur Hand hat, kann die­sen Ab­schnitt über­sprin­gen :-)
Vom Im­port des Cli­ent­zer­ti­fi­kats hatte ich noch eine pk­cs12-Da­tei vor­lie­gen. Mit Hilfe des Kom­man­do­zei­len­tools des opens­sl-Pa­kets kann man die Da­tei­en dar­aus ex­tra­hie­ren. Das ei­ge­ne Zer­ti­fi­kat er­hält man mit­tels
openssl pkcs12 -in your.p12 -clcerts -nokeys -out cert.crt
Den zu­ge­hö­ri­gen Schlüs­sel ex­tra­hiert man fol­gen­der­ma­ßen un­ver­schlüs­selt in eine Datei:
openssl pkcs12 -in your.p12 -nocerts -nodes -out key.pem
In mei­nem Fall wird die­sel­be CA als Ser­ver­zer­ti­fi­kat ver­wen­det - das ist also si­cher nicht bei jedem so ;-) Je­den­falls läßt sich die­ses Zer­ti­fi­kat mit fol­gen­dem Kom­man­do ex­tra­hie­ren:
openssl pkcs12 -in your.p12 -cacerts -nokeys -out cainfo.crt

Vor­be­rei­ten des lo­ka­len git-Re­po­si­to­rys

Ein Re­po­si­to­ry, das auf einem Ser­ver liegt, wel­cher Cli­ent-Zer­ti­fi­ka­te for­dert, kann lei­der nicht mit­tels eines ein­fa­chen "git clone" ge­klont wer­den - es sei denn, man kon­fi­gu­riert das Zer­ti­fi­kat in der glo­ba­len git-Kon­fi­gu­ra­ti­on. Letz­te­res sperrt einen aber von allen an­de­ren "nor­ma­len" Re­po­si­to­ries aus, daher ist das nur in Aus­nah­me­fäl­len eine gang­ba­re Lö­sung. Des­halb gehen wir hier an­ders vor: Wir legen zu­nächst ein lee­res git-Re­po­si­to­ry an, kon­fi­gu­rie­ren darin das Zer­ti­fi­kat und stel­len an­schlie­ßend die Ver­knüp­fung zum Re­mo­te Re­po­si­to­ry her.
Ein lee­res git-Re­po ist rasch an­ge­legt:
git init repo
Darin legen wir nun ein ei­ge­nes Ver­zeich­nis "cer­ti­fi­ca­tes" an und ko­pie­ren dort­hin die Da­tei­en aus dem ers­ten Ab­schnitt. Nun sagen wir git, wo die Da­tei­en zu fin­den sind:

git con­fig http.​sslCAInfo cer­ti­fi­ca­tes/cainfo.​crt
git con­fig http.​sslCert cer­ti­fi­ca­tes/cert.​crt
git con­fig http.​sslKey cer­ti­fi­ca­tes/key.​pem

Damit wäre der Zer­ti­fik­at­teil er­le­digt. Fügen wir das Re­mo­te Re­po­si­to­ry unter dem Namen "ori­gin" hinzu:
git remote add origin https://...
...​und legen nun noch ori­gin als Stan­dard-Ge­gen­stel­le für den lo­ka­len mas­ter fest:
git con­fig branch.​master.​remote ori­gin
git con­fig branch.​master.​merge refs/heads/mas­ter

Das war's!

Das war's auch schon! Nun kön­nen wir die Daten aus dem Re­mo­te Repo ab­ho­len (und sind damit an dem Punkt, was im Nor­mal­fall ein ein­fa­ches "git clone" er­le­digt):
git pull
Ab­schlie­ßend macht es noch Sinn, das cer­ti­fi­ca­tes-Ver­zeich­nis in die .gi­ti­gno­re-Lis­te auf­zu­neh­men - um zu ver­mei­den, ver­se­hent­lich sei­nen ge­hei­men Schlüs­sel zu com­mit­ten :-)