composer

SSL-Zertifikatsauthentifizierung für Composer

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 Zertifikat
  • private/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-Zertifikatsanfrage
  • private/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-Zertifikatsanfrage
  • private/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
SSLVerifyClient	require					        # 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
Antonio Mansilla
Antonio Mansilla ist PHP Entwickler bei der Flagbit GmbH & Co. KG.

Hinterlasse einen Kommentar

Hinterlasse den ersten Kommentar!

Benachrichtige mich zu:
avatar

wpDiscuz
Weitere Beiträge zum Thema
TYPO3 Bugday: Kernentwickler beheben Fehler
Extension: GSA Shop
TypoGento 1.0 ist released!
CObject im Backend