Als ob ich Git nicht schon genug ausgereizt habe, geht es nun doch weiter.
Heute: Wie kann ich mit Git über HTTP arbeiten und das ganze noch kombinieren, indem ich Apache2 SSL nutzen lasse.
Apache 2 + SSL mit eigenem Zertifikat
1. Erstellen des Zertifikats
mkdir /etc/apache2/myssl cd /etc/apache2/myssl openssl req -new > server.cert.csr openssl rsa -in privkey.pem -out server.cert.key openssl x509 -in server.cert.csr -out server.cert.crt -req -signkey server.cert.key -days 365
Beim ersten Aufruf von openssl werdet ihr einige Daten eingeben müssen. Abgesehen von Common Name (eg, YOUR name) und eurem PEM Key ist hier alles optional und ihr könnt eintragen, was ihr wollt. Bei Common Name muss der Hostname der SSL Webseite eingetragen werden, z.B. meine.domain.de, beim PEM Key dürft ihr euch ein schönes Passwort ausdenken, was am besten zwischengespeichert werden sollte.
2. Konfigurieren von Apache 2
Apache unterstützt dank mod_ssl SSL, solltet ihr diesen also nicht haben, dann solltet ihr ihn installieren. Danach einfach mit a2enmod ssl aktivieren.
Sollte in eurer ports.conf kein Eintrag zu Listen 443 sein, dann könnt ihr diesen einfach hinzufügen, damit euer Apache auf dem Port für SSL Verbindungen mithört.
Zum Anschalten von SSL müsst ihr noch eine Konfiguration für SSL anlegen.
<VirtualHost *:443> SSLEngine on SSLCertificateKeyFile /etc/apache2/myssl/server.cert.key SSLCertificateFile /etc/apache2/myssl/server.cert.crt </VirtualHost>
Da ich meine ganze Kommunikation über SSL verschlüsseln wollte, hab ich mir einfach in meiner alten Site Config den Port auf 443 gelegt und mir alle Anfragen die auf Port 80 kommen, auf HTTPS umgeleitet. Das sieht dann so aus:
<VirtualHost *:80> Redirect permanent / https://HOST.NAME/ </VirtualHost>
3. Apache neustarten
/etc/init.d/apache2 restart
Troubleshooting
Solltet ihr beim Aufruf der HTTPS Seite einen SSL_ERROR_RX_RECORD_TOO_LONG Fehler bekommen, dann ist in den meisten Fällen was beim Konfigurieren falschgelaufen. Schaut ob eure Site Config die entsprechenden SSLEngine Einträge hat und ob die Pfade zum Zertifikat richtig sind.
Da ihr euch selbst ein Zertifikat erstellt habt, bekommt man beim Aufruf der Seite eine Warnung – jedenfalls bei Firefox – dass diese Seite ein ungültiges Zertifikat hat. Wenn ihr euch kein gültiges Zertifikat kaufen wollt, kann man diese Nachricht getrost ignorieren.
Git Smart HTTP
Wenn nicht schon getan, solltet ihr euch den git-core installieren. Git Core bietet das HTTP Backend, bei dem später mit Git Daten abgerufen werden können.
1. Anpassen des Repositories
Damit Git weiß, welches Repo nach außen gelegt wird, müsst ihr eine Datei namens git-daemon-export-ok im Ordner der Repo erzeugen. Außerdem muss der Ordner noch von Apache beschreibbar sein.
cd /home/git git update-server-info touch git-daemon-export-ok chown www-data . -R chgrp www-data . -R chmod 750 .
2. Anpassen von Apache
Als erstes müssen wir einige Umgebungsvariable für Apache erstellen. Dazu legen wir eine neue Configdatei mit dem Namen git.conf im Ordner /etc/apache2/conf.d/ an.
SetEnv GIT_PROJECT_ROOT /home/git SetEnv GIT_HTTP_EXPORT_ALL SetEnv REMOTE_USER $REDIRECT_REMOTE_USER ScriptAlias /git/ /usr/lib/git-core/git-http-backend/
GIT_PROJECT_ROOT ist das Hauptverzeichnis, indem alle eure Repositories liegen, die angesprochen werden sollen.
Als nächstes müssen wir noch unseren VirtualHost anpassen:
Alias /git /home/git
3. Absichern mit Userauthentifizerung
Damit nicht jeder auf das Repository zugreifen kann, sollten wir noch eine Authentifizierung festlegen. Deshalb erstellen wir noch eine Datei git-auth.conf im Ordner /etc/apache2/conf.d/.
<LocationMatch "/git*"> AuthType Basic require user git AuthName "Git" AuthUserFile /etc/apache2/htpasswd/git SSLRequireSSL </LocationMatch>
Danach erstellen wir noch eine htpasswd Datei:
mkdir /etc/apache2/htpasswd htpasswd -bc /etc/apache2/htpasswd git password
Troubleshooting
Wenn ihr beim Verwalten der Repo einen error: error setting certificate verify locations:-Fehler bekommt, dann hängt das damit zusammen, dass ihr ein unverifiziertes Zertifikat habt. Um dennoch Änderungen machen zu können, kann man in der Git Config http.sslverify auf false setzen.
Solltet ihr beim Pushen einen Error code 22 bekommen, dann hängt das normalerweise damit zusammen, dass Apache einen 401 oder 403 Fehler zurückliefert. Zur Fehleranalyse eignen sich access.log und error.log des Apache.
fatal: failed to write object: Apache hat keine Schreibrechte auf den Ordner des Git Repositories.
Service not enabled: ‚receive-pack‘: Smart HTTP ist nicht richtig konfiguriert, deshalb greift Git auf WebDAV zurück, was nicht vorhanden ist. Alternativ kann es auch sein, dass ihr vergessen habt, REMOTE_USER in Schritt 2 zu definieren.
TortoiseGit bzw. Msysgit gibt euch folgende Fehlermeldung aus: Password: fatal: Out of memory, realloc failed.
Dazu hab ich leider noch keine gute Lösung gefunden, was jedoch hilft ist, Username und Passwort direkt in die URL zu schreiben: https://username:password@mein.server.de/git
Mehrere Repositories verteilt auf mehrere Ordner?
Das ist auch möglich, hier geb ich euch aber nur ein kleinen Codeauszug aus meiner Server Config, da das Wichtigste schon oben erklärt wurde.
ScriptAlias /compiler/ /usr/lib/git-core/git-http-backend/ ScriptAlias /git/ /usr/lib/git-core/git-http-backend/ <LocationMatch "^/compiler*"> SetEnv GIT_PROJECT_ROOT /home/git-compiler SetEnv GIT_HTTP_EXPORT_ALL SetEnv REMOTE_USER $REDIRECT_REMOTE_USER AuthType Basic require user git AuthName "Compiler" AuthUserFile /etc/apache2/htpasswd/gitcompiler SSLRequireSSL </LocationMatch> <LocationMatch "^/git*"> SetEnv GIT_PROJECT_ROOT /home/git SetEnv GIT_HTTP_EXPORT_ALL SetEnv REMOTE_USER $REDIRECT_REMOTE_USER AuthType Basic require user git AuthName "Git" AuthUserFile /etc/apache2/htpasswd/git SSLRequireSSL </LocationMatch>
Soweit so gut. Sollte ich nichts vergessen habe, habt ihr jetzt eine lauffähige Variante um Git über HTTPS zu bedienen.
Fragen und Hinweise auf Fehler nehme ich gerne in den Comments entgegen!
Quellen:
1. Git und Smart HTTP (kupschke.net)
2. Apache2 und SSL (mrfoo.de)
3. Git + SSL + Zertifikatfehler (lostechies.com)
4. Git Pushfehler (blog.nullspace.me)