Dieser Artikel erklärt wie man SSL-Zertifikate verwenden kann, um Composer per SSL-Zertifikat zu authentifizieren. Das ist wahrscheinlich die beste Möglichkeit, wenn man einen Server mit privaten Repositories hat und die Berechtigung kontrollieren möchte. Dafür muss man einfach die nächsten Schritte befolgen:
- Um Zertifikatsanfragen signieren zu können muss ein Root-Zertifikat bei der Zertifizierungsstelle (CA Zertifikat) erstellt werden.
- Um SSL benutzen zu können muss ein Zertifikat für den Server erstellt werden.
- Ein Zertifikat für jeden Client erstellen, um jeden Client authentifizieren zu können.
- Konfigurieren des Apache-Servers, um Zertifikatauthentifizierung verwenden zu können
- Konfigurieren der Clients, in unserem Fall Composer, um Zertifikatauthentifizierung verwenden zu können.
Voraussetzungen
Zuerst muss man sich vergewissern, dass sowohl OpenSSL als auch ein Web-Server auf dem System vorhanden sind. In unserem Fall nutzen wir den Apache-Server, andere Server werden hier nicht beleuchtet. Alles was wir brauchen ist ein Terminal. Der folgende Befehl wird (unter Debian/Ubuntu) als root ausgeführt:
# apt-get install apache2 openssl
Falls die Pakete nicht installiert sind, werden sie automatisch geladen und installiert.
Erstellen der benötigten Verzeichnisse
Um SSL-Authentifizierung benutzen zu können, muss als erstes ein CA-Zertifikat erstellt werden. Das wird benötigt, um ein Zertifikat zu signieren. Dafür wird zuerst der Verzeichnisbaum erstellt, der alle benötigten Zertifikate enthalten soll. Das Debian Distribution Standardverzeichnis ist /etc/ssl/
. Als root erstellt man den CA-Verzeichnisbaum mit dem folgenden Befehl:
# mkdir -m 0755 /etc/ssl/myCA /etc/ssl/myCA/private /etc/ssl/myCA/certs /etc/ssl/myCA/newcerts /etc/ssl/myCA/crl
OpenSSL Konfiguration
Wir kopieren die OpenSSL-Standard-Konfigurationsdatei openssl.cnf
in unser CA Verzeichnis (im vorigem Schritt erstellt):
# cp /etc/ssl/openssl.cnf /etc/ssl/myCA/openssl.my.cnf
Diese Datei soll nicht für alle lesbar sein, also ändern wir die Verzeichnisberechtigung:
# chmod 0600 /etc/ssl/myCA/openssl.my.cnf
Wir müssen zusätzlich zwei Dateien anlegen. Die erste Datei enthält die Datenbank für OpenSSL:
# touch /etc/ssl/myCA/index.txt
In der zweiten Datei befindet sich zunächst die Zertifikats-ID. Da wir unser erstes Zertifikat erstellen, initialisieren wir die ID mit 01
:
echo '01' > /etc/ssl/myCA/serial
Da wir später noch weitere Zertifikate erstellen werden, nutzen wir getrennte Verzeichnisse. Dafür müssen wir die OpenSSL Konfigurationsdatei anpassen: Also öffnen wir die Datei openssl.my.conf
in einem Editor und ändern die folgenden Zeilen:
[ CA_default ] dir = . # Ändere diese Zeile certs = $dir/certs crl_dir = $dir/crl database = $dir/index.txt #unique_subject = no
new_certs_dir = $dir/newcerts certificate = $dir/certs/myca.crt # Ändere diese Zeile serial = $dir/serial crlnumber = $dir/crlnumber
crl = $dir/crl.pem private_key = $dir/private/myca.key # Ändere diese Zeile RANDFILE = $dir/private/.rand
Hier muss man drei Parameters ändern: Der erste enthält das Verzeichnis, in dem unsere Dateien liegen. In den anderen beiden wird der CA Zertifikat-Dateiname und der CA Key-Dateiname, die man in den folgenden Schritten erstellt, angegeben.
Was bedeuten die Dateiformate
- KEY – Private Key.
- CSR – Zertifikatsregistrierungsanforderung. Es wird von der Zertifizierungsstelle benutzt, um die Zertifikate zu signieren. Nachdem das Zertifikat signiert wurde, kann die CSR Datei gelöscht werden.
- CRT – Zertifikat. Es kann öffentlich verteilt werden.
- PEM – Enthält den Private Key und das Zertifikat. Einige Server benötigen dies.
- P12 – Es ist ein anderes Format als PEM, es enthält ebenfalls Key und Zertifikat und wird normalerweiser für Web-Browser benötigt.
- CRL – Zertifikatsperrliste. Es kann öffentlich verteilt werden.
Erstellung des CA Zertifikates und des CA Keys
Zertifikatsanfrage
Jetzt hat man alle Konfiguration erledigt. Um andere Zertifikate signieren zu können, erstellen wir ein CA Zertifikat.
Zuerst geht man in das CA-Verzeichnis /etc/ssl/myCA
. Dort erstellt man das CA Zertifikat und den CA Key:
$ openssl req -config openssl.my.cnf -new -x509 -extensions v3_ca -keyout private/myca.key -out certs/myca.crt -days 365
Der Output sollte etwa so aussehen:
Generating a 1024 bit RSA private key ...................................++++++ ...................++++++ writing new private key to 'private/myca.key' Enter PEM pass phrase: Verifying - Enter PEM pass phrase: ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:DE State or Province Name (full name) [Some-State]:Baden-Wuerttemberg Locality Name (eg, city) []:Karlsruhe Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Network Organizational Unit Name (eg, section) []:My Certificate Authority Common Name (eg, YOUR name) []:server.example.com Email Address []:whatever@server.example.com
Der Befehl erstellt das CA Zertifikat, das für ein Jahr gültig ist. Verwenden Sie ein sicheres Passwort!
Tipp
Um eine Zufallspassphrase zu erstellen, kann man einfach den folgender Befehl nutzen:
$ openssl rand -base64 32
Es werden zwei Dateien erstellt:
certs/myca.crt
– CA Zertifikatprivate/myca.key
– CA Private Key
Die Key-Datei sollte nur von root lesbar sein:
# chmod 0400 /etc/ssl/myCA/private/myca.key
Für den Fall, dass der Server das Zertifikat und den Key als .pem
-Datei benötigt, kann es so erstellen:
# cat /etc/ssl/myCA/certs/myca.crt /etc/ssl/myCA/private/myca.key > /etc/ssl/myCA/certs/myca.pem
Erstellung des Zertifikats für den Server
Zertifikatsanfrage
$ openssl req -config openssl.my.cnf -new -nodes -keyout private/server.key -out server.csr -days 365
Die Option -nodes
bewirkt, dass keine Passphrase für den Private Key verlangt wird. Dies ist wichtig, da man sonst bei jedem Neustart des Services danach gefragt würde.
Der Output sollte etwa so aussehen:
Generating a 1024 bit RSA private key ..............................++++++ .........++++++ writing new private key to 'private/server.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:DE State or Province Name (full name) [Some-State]:Baden-Wuerttemberg Locality Name (eg, city) []:Karlsruhe Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Company Organizational Unit Name (eg, section) []: Common Name (eg, YOUR name) []:server.example.com Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
Nach der Befehlsausführung, wird man zwei neue Dateien haben:
server.csr
– Server-Zertifikatsanfrageprivate/server.key
– Private Key, ohne Passphrase
Wie oben sollte die Key-Datei nur von root lesbar sein:
# chmod 0400 /etc/ssl/myCA/private/server.key
Signierung
Nachdem die Zertifikatsanfrage erstellt wurde, muss sie signiert werden.
# openssl ca -config openssl.my.cnf -policy policy_anything -out certs/server.crt -infiles server.csr
Der Output:
Using configuration from openssl.my.cnf Enter pass phrase for ./private/myca.key: Check that the request matches the signature Signature ok Certificate Details: Serial Number: 1 (0x1) Validity Not Before: Dec 11 14:51:36 2013 GMT Not After : Dec 11 14:51:36 2014 GMT Subject: countryName = DE stateOrProvinceName = Baden-Wuerttemberg localityName = Karlsruhe organizationName = My Company commonName = server.example.com X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: 2F:FA:B2:EE:81:E0:B1:9C:C3:C5:5E:29:E0:07:B0:83:ED:02:D8:56 X509v3 Authority Key Identifier: keyid:37:31:11:94:ED:D4:58:5D:03:0C:37:C0:0A:3D:CD:90:25:FA:F2:4D Certificate is to be certified until Dec 11 14:51:36 2014 GMT (365 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated
Tipp
Wenn man möchte, kann man das Zertifikat mit dem folgenden Befehl prüfen:
# openssl verify -purpose sslserver -CAfile /etc/ssl/myCA/certs/myca.crt /etc/ssl/myCA/certs/server.crt /etc/ssl/myCA/certs/server.crt: OK
Danach kann man die Zertifikatsanfragedatei löschen:
# rm /etc/ssl/myCA/server.csr
Erstellung des Zertifikats für den Client
Zertifikatsanfrage
Nachdem der Befehl ausgeführt wurde, wird man nach einem Passphrase gefragt, diese muss stark und sicher sein.
# openssl req -config openssl.my.cnf -new -keyout private/client.key -out client.csr -days 365
Der Output:
Generating a 1024 bit RSA private key ...........................++++++ ........................................++++++ writing new private key to 'private/client.key' Enter PEM pass phrase: Verifying - Enter PEM pass phrase: ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:DE State or Province Name (full name) [Some-State]:Baden-Wuerttemberg Locality Name (eg, city) []:Karlsruhe Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Company Organizational Unit Name (eg, section) []: Common Name (eg, YOUR name) []:composer Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
Nachdem der Befehl ausgeführt wurde, werden man zwei neue Dateien erstellt:
client.csr
– Client-Zertifikatsanfrageprivate/client.key
– Private Key
Und wieder sollte die Key-Datei nur von root lesbar sein:
# chmod 0400 /etc/ssl/myCA/private/client.key
Signierung
Auch diese Zertifikatsanfrage muss signiert werden.
# openssl ca -config openssl.my.cnf -policy policy_anything -out certs/client.crt -infiles client.csr
Der Output:
Using configuration from openssl.my.cnf Enter pass phrase for ./private/myca.key: Check that the request matches the signature Signature ok Certificate Details: Serial Number: 2 (0x2) Validity Not Before: Dec 11 14:59:27 2013 GMT Not After : Dec 11 14:59:27 2014 GMT Subject: countryName = DE stateOrProvinceName = Baden-Wuerttemberg localityName = Karlsruhe organizationName = My Company commonName = composer X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: 97:2A:0C:B9:4F:0D:27:FF:7C:D4:73:BB:AF:83:11:30:19:8F:73:0C X509v3 Authority Key Identifier: keyid:37:31:11:94:ED:D4:58:5D:03:0C:37:C0:0A:3D:CD:90:25:FA:F2:4D Certificate is to be certified until Dec 11 14:59:27 2014 GMT (365 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated
Tipp
Wenn man will, kann man das Zertifikat mit dem folgenden Befehl prüfen:
# openssl verify -purpose sslclient -CAfile /etc/ssl/myCA/certs/myca.crt /etc/ssl/myCA/certs/client.crt /etc/ssl/myCA/certs/client.crt: OK
Danach kann man die Zertifikatsanfragedatei löschen:
# rm /etc/ssl/myCA/client.csr
Wird Composer als Client verwendet, benötigt dieser ein .pem
-Zertifikat. Erstellt wird dieses mit dem folgenden Befehl.
# cat /etc/ssl/myCA/certs/client.crt /etc/ssl/myCA/private/client.key > /etc/ssl/myCA/certs/client.pem
Konfigurieren des Apache-Servers
Nachdem man die benötigen Zertifikate erstellt hat, kann man mit der Apache Konfiguration weiter machen. Zuerst muss man sich vergewissern, dass mod_ssl
aktiviert ist.
# a2enmod ssl
Im nächsten Schritt wird die entsprechende Apache Virtual Host-Datei angepasst, standardmäßig ist das /etc/apache2/sites-available/default-ssl
. Dort muss man das Server-Zertifikat, den Server-Key und den CA-Zertifikat hinterlegen.
SSLEngine on
SSLCertificateFile /etc/ssl/myCA/certs/server.crt# Benötigt für SSL Verbindung SSLCertificateKeyFile /etc/ssl/myCA/private/server.key # Benötigt für SSL Verbindung
SSLVerifyClientrequire # Benötigt für SSL Authentifizierung SSLVerifyDepth 1 # Benötigt für SSL Authentifizierung SSLCACertificateFile /etc/ssl/myCA/certs/myca.crt # Benötigt für SSL Authentifizierung
Dann muss man die Seite aktivieren und den Apache-Server neu starten.
# a2ensite default-ssl # /etc/init.d/apache2 restart
Composer-Konfiguration
In die composer.json
muss jetzt die Repository-URL, die Client Zertifikatdatei im PEM-Format und die Key-Passphrase eingetragen werden.
Als Beispiel gibt es hier, eine composer.json Datei für ein privates Repository mit der URL https://your-repository-server.com
.
{ "repositories": [ { "type": "composer", "url": "https://your-repository-server.com", "options": { "ssl": { "local_cert": ".ssl/client.pem", "passphrase": "your-passphrase" } } }, { "packagist": false } ] }
Testen
Wir haben den Apache-Server konfiguriert, damit er per SSL-Zertifikat authentifizieren kann. Das heißt, dass die Repository-Webseite momentan von einem Browser nicht aufgerufen werden kann, weil man dieser das Zertifikat noch nicht mitsendet. Meistens akzeptieren Browser nur Zertifikate im P12-Format, d.h. wir müssen unsere Dateien konvertieren. Wir benötigen:
- Zertifikat im CRT-Format
- Private Key
- CA-Zertifikat
Wenn man alle Dateien hat, kann man einfach den folgenden Befehl ausführen:
# openssl pkcs12 -export -out /etc/ssl/myCA/certs/client.p12 -inkey /etc/ssl/myCA/private/client.key -in /etc/ssl/myCA/certs/client.crt -chain -CAfile /etc/ssl/myCA/private/myca.crt
Die erzeugte Datei client.p12
wird im Browser importiert. Damit authentifiziert sich der Browser gegenüber dem Repository und die Webseite wird angezeigt.
Widerruf des Zertifikats
Möchte man z.B. das Zertifikat client.crt
widerrufen, damit dieser Client keinen Zugang mehr auf das Repository hat, nutzt man die Option -revoke
:
# openssl ca -config openssl.my.cnf -keyfile private/myca.key -cert certs/myca.crt -revoke certs/client.crt
Nachdem ein Zertifikat widerrufen wurde, muss man die CRL-Datei (Zertifikatsperrliste) generieren:
# openssl crl -in myca.crl -text
Der Output:
Certificate Revocation List (CRL): ... Revoked Certificates: Serial Number: XXXX ...
Damit Apache weiß, welche Zertifikate nicht mehr gültig sind und auf welche nicht mehr zugegriffen werden darf, muss man in der Virtual-Host-Datei angeben wo die CRL-Datei liegt. Dafür muss man einfach eine neue Zeile hinzufügen:
SSLCARevocationFile /etc/ssl/myCA/myca.crl
0 Kommentare