Das Projekt wird in einer virtualisierte Umgebung mit einer DMZ[(gl:dmz)]-Netzwerk-Architektur der Firma <FIRMA1> ( <FIRMA1> hier Dienstleister / Auftragnehmer) als Tochter Unternehmen der <FIRMA2> (Kunde / Auftraggeber) entwickelt, getestet und für die gedachte Umsetzung im Hause der <FIRMA2> vorbereitet.
Es soll ein Lösungskonzept zum Aufbau einer einfachen PK-Infrastruktur im Unternehmensumfeld der <FIRMA2> erstellt werden. Bislang gibt es Intern keine geeignete Möglichkeit, welche den aufkommenden Daten-Verkehr zwischen den Clients den unterschiedlichen Angeboten an Diensten (u.a. über dei Protokolle HTTP[(gl:prot:http)] und FTP[(gl:prot:ftp)] an Dokumenten-Server) zu Verschlüsselung. Mittelfristig wird der Einsatz einer neuen Software vorbereitet, welche diese einfache PK-Infrastruktur[(gl:pki)] ebenso als Schnittstelle zur Datenübertragung beinhalten könnte.
Spätestens seid den sogenannten Snoden-Enthüllungen und Ransomware (Krypto-/Erpressungstrojaner) Angriffen, ist offensichtlich geworden das nicht nur gezielte Angriffe erfolgen müssen um Schäden in Millionen Höhe zu verursachen.
Mit dem Internet of Things (IoT) wächst die Gefahr durch fehlerhafte Massenware auch annähernd Zufällig sensible Daten zu verlieren oder preis zugeben. Gerade auch in Bezug auf Industriespionage wäre ein solchen zustande kommen für ein Unternehmen fatal.
Eine fehlerhafte Schnittstelle in einem Router oder Switch könnte bereits ausreichen, wie z.B. offene Lücken im telnet-Dienst.
Sicherheitsupdate in Sicht: Gravierende Telnet-Lücke bedroht zahlreiche Cisco-Switches | 20.03.2017 PDF Artikel - Heise Security - Gravierende "telnet"-Lücke
Das Projekt wurde für 35 Stunden gem. der IHK Vorgaben geplant. Die Meilensteine dienen nicht nur der Orientierung und Soll/Ist Vergleichspunkte sondern vor allem wie im iterativen Wasserfallmodell (erweit. Wasserfallmodell) vorgesehen, als Kontrollrückkopplung um eventuellen Schwierigkeiten bei der Umsetzung des Projektes mit geeigneten Maßnahmen frühzeitig entgegen wirken zu können. Und zwar rechtzeitig, bevor ein Projekt mangels Qualitätssicherungsmaßnahmen ganz oder teilweise scheitert.
Die zur Umsetzung des Projektes genutzte Hard- und Software sowie die mind. Systemvoraussetzungen werden im Anhang vollständig Aufgeführt und Beschrieben.
| Nr | Phase | Kurz Beschr. | Zeit |
|---|---|---|---|
| 1 | Projektstart | Vorstellung des Projektes | 1 h |
| 2 | Analyse & Definition | Soll-Ist Analyse | 2 h |
| 3 | Entwurf | Ausarbeitung Scripte | 5 h |
| 4 | Implementation | Aufsetzen Server / Client Instanzen | 10 h |
| 5 | Test / Validierung | Testlauf Zertifikat Verteilung | 8 h |
| 6 | Einsatz | Roll-Out | 2 h |
| 7 | Abschluss | Übergabe | 7 h |
| Projektphase | Gesamtstunden | Meilenstein | Zwischensumme | Teilsumme | Datum | ||
|---|---|---|---|---|---|---|---|
| 1. Projektstart | 1 h | ||||||
| 1.1 Projekt Vorstellung | 45 min | 21.12.16 | |||||
| 1.2 Projekt Genehmigung | 15 min | 21.12.16 | |||||
| 2. Analyse & Definition | 2 h | ||||||
| 2.1 Durchführung IST-Analyse | 30 min | 27.03.17 | |||||
| 2.2 Durchführung SOLL-Analyse | 1,25 h | 27.03.17 | |||||
| 2.3 Formulierung Definition | 15 min | 27.03.17 | |||||
| 1. Meilenstein | Abschluss A & D mit erfg. Formulierung | ||||||
| 3. Entwurf | 5 h | ||||||
| 3.1 openSSL | 2,75 h | ||||||
| 3.1.1 Template ca.conf | 1 h | 27.03.17 | |||||
| 3.1.2 BASH Script CA-Cert.sh | 15 min | 27.03.17 | |||||
| 3.1.3 Template cic.certs.conf | 1 h | 27.03.17 | |||||
| 3.1.4 BASH Script CIC-Cert.sh | 30 min | 27.03.17 | |||||
| 2.1 Meilenstein | BASH-Scripte Lösung Formuliert | ||||||
| 3.2 Microsoft X.509-Storage | 1,25 h | ||||||
| 3.2.1 C# Program Cert-Installer.exe | 1h | 27.03.17 | |||||
| 3.2.1 PS Script Firefox Cert-Install | 15 min | 27.03.17 | |||||
| 2.2 Meilenstein | X509-Stores Lösung Formuliert | ||||||
| 3.3 Web-Interface | 1 h | ||||||
| 3.3.1 PHP Scripte | 30 min | 27.03.17 | |||||
| 3.3.1 Bootstrap Webpage | 30 min | 27.03.17 | |||||
| 2.3 Meilenstein | Web-Interface Konzipiert | ||||||
| 4. Implementation | 10 h | ||||||
| 4.1 Linux Server | 3 h | ||||||
| 4.1.1 Update & Installation | 1 h | 28.03.17 | |||||
| 4.1.2 BASH-Scripte Lösung integrieren | 15 min | 28.03.17 | |||||
| 4.1.3 Webserver Konfiguration | 1 h | 28.03.17 | |||||
| 4.1.4 CA Zertifikate erzeugen & einbinden | 30 min | 28.03.17 | |||||
| 4.1.5 Über Web-Server Prüfen | 30 min | 28.03.17 | |||||
| 4.1.6 Fehler Dokumentation | 30 min | 28.03.17 | |||||
| 3.1 Meilenstein | BASH-Scripte Lösung integriert | ||||||
| 4.2 Windows Server & Client | 5 h | ||||||
| 4.2.1 Windows Server Updates | 1 h | 28.03.17 | |||||
| 4.2.2 Domäne-Controller konfigurieren | 2 h | 28.03.17 | |||||
| 4.2.3 Active Directory konfigurieren | 1 h | 28.03.17 | |||||
| 4.2.4 Windows Client Updates | 1 h | 28.03.17 | |||||
| 4.2.5 Windows Client in Domäne Aufnehmen | 15 min | 29.03.17 | |||||
| 4.2.6 Konnektivität zwischen allen Systemen prüfen | 15 min | 29.03.17 | |||||
| 4.2.7 Fehler Dokumentation | 30 min | 29.03.17 | |||||
| 3.2. Meilenstein | Windows Server AD-DC funktionsfähig | ||||||
| 14.3 Web-Interface | 1 h | ||||||
| 4.3.1 Web-Interface einpflegen | 15 min | 29.03.17 | |||||
| 4.3.2 Web Ausgabe überprüfen | 15 min | 29.03.17 | |||||
| 4.3.3 HTTPs Verbindung protokollieren | 15 min | 29.03.17 | |||||
| 4.3.4 Fehler Dokumentation | 15 min | 29.03.17 | |||||
| 3.3. Meilenstein | Webserver & Interface erreichbar | ||||||
| 5. Test / Validierung | 8 h | ||||||
| 5.1 Server Test | 3 h | ||||||
| 5.1.1 Funktionsprüfung Bereitstellung Zertifikate | 30 min | 29.03.17 | |||||
| 5.1.2 Funktionsprüfung Verteilung CA - Zertifikate | 30 min | 29.03.17 | |||||
| 5.1.3 Auswertung und Dokumentation Logs bzw. Events | 1 h | 29.03.17 | |||||
| 5.1.4 Fehlerkorrekturen | 1 h | 29.03.17 | |||||
| 4.1 Meilenstein | Bereitstellung und Verteilung erfolgt | ||||||
| 5.2 Client Test | 3 h | 31.03.17 | |||||
| 5.2.1 Abruf und Installation der Client Zertifikate | 30 min | 29.03.17 | |||||
| 5.2.2 Überprüfung Windows.Store und Browser Ausgabe | 30 min | 29.03.17 | |||||
| 5.2.3 Auswertung und Dokumentation Logs bzw. Events | 1 h | 29.03.17 | |||||
| 5.2.4 Fehlerkorrekturen | 1 h | 30.03.17 | |||||
| 4.2 Meilenstein | Client Authentifizierung erfolgt | ||||||
| 5.3 Web-Interface Test | 2 h | ||||||
| 5.3.1 Web-Interface Funktionsprüfung | 30 min | 30.03.17 | |||||
| 5.3.2 Automatischer Abruf Client Zertifikate prüfen | 30 min | 30.03.17 | |||||
| 5.3.3 Fehlerkorrekturen | 1 h | 30.03.17 | |||||
| 4.3. Meilenstein | Web Verwaltung und automatischer Abruf erfolgt | ||||||
| 6. Einsatz | 2 h | ||||||
| 6.1 Zurücksetzen und 2. Durchlauf starten | 1 h | 30.03.17 | |||||
| 5. Meilenstein | 2. Durchlauf erfolgreich ohne Fehler | ||||||
| 6.2 Einweisung und Übergabe an Kunden | 1 h | ||||||
| 6.2.1 Projekt Präsentation und Vorführung | 30 min | 29.03.17 | |||||
| 6.2.2 Abnahme durch Kunden | 30 min | 29.03.17 | |||||
| 7. Abschluss | 7 h | ||||||
| 7.1 Nachbereitung | 1 h | ||||||
| 7.1.1 Fehlerkorrekturen | 30 min | 30.03.17 | |||||
| 7.1.2 Versionierung abschließen | 30 min | 30.03.17 | |||||
| 7.2 Dokumentation | 6 h | 31.03.17 | |||||
| 8. Projektende | 0 h | ||||||
Ein Schaden am Unternehmen, hervorgerufen durch ‚Men in the Middle‘ Angriffe in Verbindung mit der Entwendung von Daten oder ähnlichem, ist nicht kalkulierbar, auch ein wirtschaftlichen Totalschaden kann die Folge sein. Es gilt diese Schäden vom Unternehmen abzuwenden durch die Anwendung aller möglichen Maßnahmen, daher sind Sicherheitsmaßnahmen wie die Nutzung von kryptographischen Lösungen unabdingbar.
| Vergabe | Stunden | Einzel | Summe |
|---|---|---|---|
| Extern | 35 h | 85 € | ∑ 2975 € |
| Intern | 35 h | 35 € | ∑ 1225 € |
Übersetzung aus [(rfc5280)]
[(rfc5280>https://tools.ietf.org/html/rfc5280 | RFC5280 )]
| Certificate Authority | Subordinated CA | non-CA certificates | ||
|---|---|---|---|---|
| CA: <FIRMA2> Root CA X1 | –> | Intermediate: <FIRMA2> Sign CA X2 | –> | Server |
| –> | Client | |||
| –> | Codesign | |||
Der Script Aufruf erfolgt mit den folgen Parametern :
Beispiel: ./use_cert.sh -srv create PC-Name_001 192.168.0.1
| Host-Type: | Funktion: | notwendige Angaben | optional | |||
|---|---|---|---|---|---|---|
| Parameter: | Parameter: | |||||
| 1 | Server | -srv | Ausstellen | create | <Hostname> <IP-Adresse> | <Tage> |
| 2 | Client | -cli | Sperren | revoke | <Hostname> | |
| 3 | Code | -code | Prüfen | check | <Hostname> |
Die angewandten Strukturen sollten bereits zu beginn des Projektes so konzipiert werden, das es möglich ist für andere Systeme einen Zugang zu schaffen. Beispielsweise müssen/sollten die Ordner für das Web-Interface nicht direkt im Hauptordner für den Webserver liegen.
Ausgearbeitet wurden die Funktionen: Erstellen, Sperren und Prüfen, welche auf die verschiedenen Zertifikats-Arten angewendet werden. Das sind Server, Client und Code Zertifikate die dazu notwendigen Angaben sind Hostname und IP-Adresse optional kann auch die Gültigkeitsdauer angegeben werden.
| Betriebssystem | Name | Location | Funktion | File-Konfiguration | User |
|---|---|---|---|---|---|
| Linux | PKI-CA Hauptordner | /opt/ca/<CA-Class> | Projekt Gesamt-Ordner | 0755 | root |
| Linux | CA-Root Zertifikate | /opt/ca/<CA-Class>/certs | Ablage CA-Root Zertifikate | 0755 | root |
| Linux | CA-Sign Hauptordner | /opt/ca/<CA-Class>/intermediate | Hauptordner Intermediate | 0755 | www-data |
| Linux | Sign Zertifikate | /opt/ca/<CA-Class>/intermediate/certs/<HOSTNAME> | Ablage CA-Sign-Zertifikate | 0755 | www-data |
| Linux | Web-Interface | /opt/ca/<CA-Class>/intermediate/ppwi | HTML und PHP Scripte | 0755 | www-data |
| Betriebssystem | Name | Location | Funktion | File-Konfiguration | |
|---|---|---|---|---|---|
| Linux | Key Files | ../privates | Private Keys | 0755 | www-data |
| Linux | Config Files | ../templates | Konfigurationen | 0755 | www-data |
| Linux | Requests Files | ../requests | Anfragen | 0755 | www-data |
| Linux | CRL Files | ../revokes | Sperrungen | 0755 | www-data |
Begriffe ( CA-Root, Intermediate, Sign, Key , Config , Requests , CRL , File-Konfiguration )
| Betriebssystem | Name | Location | Funktion | File-Konfiguration | |
|---|---|---|---|---|---|
| Linux | SSL-Config | /etc/apache2/sites-enabled/default-ssl.conf | Webserver SSL Konfigurations-File | 0755 | root |
| Linux | Web-Interface | /var/www/html/ppwi | /opt/ca/<CA-Class>/intermediate/ppwi | Symlink | www-data |
Durch die gewählte Struktur ist der Zugriff auf die notwendigen Dateien für die Ausführung der PHP-Scripte vereinfacht worden, auch braucht so die Versionsverwaltung in nur einem Ordner angewandt werden.
Der Ordner mit den Web-Interface Dateien wurde als Submodule der Versionsverwaltung bekannt gemacht.
git submodule add [url] ppwi/
Die Konfiguration der Profile für jeweilgen Zertifikat-Arten wurde mit der Version 3 des X.509 Standards ermöglicht.
Wichtige angaben wurden mit default vordefiniert. Diese sind ggf. bei Standort Änderungen und ähnlichen Anzupassen.
[SNIPPET]
countryName_default = DE stateOrProvinceName_default = Sachsen-Anhalt localityName_default = Magdeburg 0.organizationName_default = <FIRMA2> Test organizationalUnitName_default = <FIRMA2> Root Certificate Authority commonName_default = <FIRMA2> CA Root X1 emailAddress_default = <FIRMA2>@<FIRMA2>.local
[SNIPPET]
[ req_distinguished_name ] # See <https://en.wikipedia.org/wiki/Certificate_signing_request>. countryName = Country Name (2 letter code) stateOrProvinceName = State or Province Name localityName = Locality Name 0.organizationName = Organization Name organizationalUnitName = Organizational Unit Name commonName = Common Name emailAddress = Email Address [ v3_ca ] # Extensions for a typical CA (`man X509v3_config`). subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer:always basicConstraints = critical, CA:true keyUsage = critical, digitalSignature, cRLSign, keyCertSign, dataEncipherment, keyEncipherment, nonRepudiation extendedKeyUsage = clientAuth, serverAuth, emailProtection, msCTLSign, msEFS, codeSigning, caIssuers issuerAltName = issuer:copy crlDistributionPoints = URI:http://pp-linux1/revoke.crl nsComment = <FIRMA2> Stammzertifikat
Nach dem das Grundprofil für die Certificate Authority angelegt wurde kann die Bash-Verarbeitung umgesetzt werden.
Im weiteren Projekt Verlauf ist an dieser Stelle ein schwerwiegender Fehler deutlich geworden.
Im Ursprünglichen Entwurf habe ich bei der extendedKeyUsage nur die Werte caIssuers, msCTLSign und msEFS definiert gehabt.
Aus diesem Grund war es in der CA Hierarchie dem Intermediate-Zertifikat untersagt Client Zertifikate auszustellen, dies Führte bei der Client-Server Authentifizierung zur gegenseitigen Ablehnung Zertifikate. Es war notwendig auch clientAuth und serverAuth hinzuzufügen.
Das unterzeichnende (Intermediate) Zertifikat muss die Funktionen welche sie signiert selbst beinhalten
eine weitere Möglichkeit um auch die Verwendung des Client Zertifikates einzuschränken besteht darin das `extendedKeyUsage` als `critical` zu definieren. ( ist für dieses Projekt jedoch nicht Vorgesehen )
[SNIPPET]
openssl genrsa -aes256 -out privates/ca.key.pem \ -passout pass:$capw 4096 openssl req -config $caconfig \ -key privates/ca.key.pem \ -new -x509 -days 730 -sha512 \ -extensions v3_ca \ -out certs/ca.cert.pem \ -passin pass:$capw \ -batch
openssl genrsa -aes256 \ -out intermediate/priates/intermediate.key.pem \ -passout pass:$caspw 4096 openssl req -config $caiconfig -new -sha512 \ -key intermediate/priates/intermediate.key.pem \ -out intermedicsrests/intermediate.csr.pem \ -passin pass:$caspw \ -batch openssl ca -config $caiconfig -extensions v3_intermediate_ca \ -days 3650 -notext -md sha512 \ -in intermediate/csr/intermediate.csr.pem \ -out intermediate/certs/intermediate.cert.pem \ -passin pass:$capw \ -batch
[SNIPPET]
[ v3_usr_cert_ca ] # Extensions for user certificates (`man X509v3_config`). basicConstraints = CA:FALSE nsCertType = objsign, email nsComment = "<FIRMA2> CA :VAR6: Class 2 - :VAR5:" subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer keyUsage = critical, digitalSignature, keyEncipherment, nonRepudiation, dataEncipherment, keyAgreement extendedKeyUsage = codeSigning, emailProtection, msCodeInd, msCodeCom crlDistributionPoints = URI:http://pp-linux1/:VAR6:/<FIRMA2>_policy_:VAR6:.crl authorityInfoAccess = @ocsp_info subjectAltName = $ENV::UAN issuerAltName = $ENV::UAN [ v3_srv_cert_ca ] # Extensions for server certificates (`man X509v3_config`). basicConstraints = CA:FALSE nsCertType = server nsComment = "<FIRMA2> CA :VAR6: Class 2 - Server :VAR2:" subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer:always keyUsage = critical, digitalSignature, keyEncipherment, nonRepudiation, dataEncipherment, keyAgreement extendedKeyUsage = serverAuth, clientAuth crlDistributionPoints = URI:http://pp-linux1/:VAR6:/<FIRMA2>_policy_:VAR6:.crl authorityInfoAccess = @ocsp_info subjectAltName = $ENV::SAN [ v3_cli_cert_ca ] # Extensions for client certificates (`man X509v3_config`). basicConstraints = CA:FALSE nsCertType = client nsComment = "<FIRMA2> CA :VAR6: Class 2 - Client :VAR2:" subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer keyUsage = critical, digitalSignature, keyEncipherment, nonRepudiation, dataEncipherment, keyAgreement extendedKeyUsage = clientAuth crlDistributionPoints = URI:http://pp-linux1/:VAR6:/<FIRMA2>_policy_:VAR6:.crl authorityInfoAccess = @ocsp_info subjectAltName = $ENV::SAN
[SNIPPET]
openssl req -new -key $key -out $csr -config $cnf -batch; openssl x509 -CA $int_crt_file -CAkey $int_key_file -CAcreateserial $passin -req -in $csr -days $4 -outform PEM -out $pem -$sha_rsa -extensions $v3_ext ; openssl ca -config $cnf -in $csr -days $4 -out $crt -extensions $v3_ext $passin -batch; openssl pkcs12 -export -inkey $key -name "$2" -in $crt -out $pfx $passout ;
- Das zu installierende PFX-File enthält neben dem Client-Zertifikat auch den Private-Key. Dieser Private Schlüssel ist zur Client-Authentifizierung gegen über einem Server notwendig.
WebRequest und WebClient Klassen per HTTPS zu realisieren.
[SNIPPET]
private void InstallCertPfx(string certpw) { try { string certPath = $@"{resultTempPath}\<FIRMA2>-{clientname}.pfx"; var cert = new X509Certificate2(certPath, certpw); var store = new X509Store(StoreName.My, StoreLocation.CurrentUser); store.Open(OpenFlags.ReadWrite); if (!store.Certificates.Contains(cert)) { store.Add(cert); } var storepers = new X509Store(StoreName.TrustedPeople, StoreLocation.CurrentUser); storepers.Open(OpenFlags.ReadWrite); if (!storepers.Certificates.Contains(cert)) { storepers.Add(cert); } } ... }
Nach einigen Fehlversuchen und Fehlerkorrekturen konnte auch das hier vorliegende Mysterium zumindest umgangen werden.
Sowohl der Edge-Browser von Microsoft wie auch der Chrome, welche beide auf den Windows.X509Store zugreifen konnten sich sporadisch nicht am Server mittels des im Eigene Zertifikate befindliche Zertifikat (inkl. Private Key) Authentifizieren.
Im weiteren Verlauf erkante ich das bei dem Authentifizierung-Versuch auch auf den X509Store.Vertraute Personen zu gegriffen wurde.
Daher entschied ich für auch diesen Zertifikat-Storage anzusteuern.
Weiter sollte sichergestellt sein das kein bereits Installiertes Zertifikat wieder Exportiert wird mit privatem Schlüssel, daher wird das PFX-File vom Server aus mit einer Passphrase versehen und ausgeliefert. Diese Passphrase ist im Programm Cert-Installer.exe codiert hinterlegt.
Für Firefox wird nicht ausschließlich ein PFX-File benötigt sonder kan auch ein PEM-File sein. Quelle: developer.mozilla.org
$ComputerName = "<FIRMA2>-cli"+$env:COMPUTERNAME".pem" $ProfilePath = "C:\Users\" + $env:username + "\AppData\Roaming\Mozilla\Firefox\Profiles\" $ProfilePath = $ProfilePath + (Get-ChildItem $ProfilePath | ForEach-Object { $_.Name }).ToString() C:\ctmp\certs\nss\bin\certutil -A -n "<FIRMA2>" -t "CT,C,C" -i $certlocation\$ComputerName -d $ProfilePath
Set-ExecutionPolicy allsigned $Zertifikat = @(gci cert:\currentuser\my -codesigning)[0] Set-AuthenticodeSignature C:\powershell\MFF-Cert-Install.ps1 $Zertifikat Sign MFF-Cert-Install.ps1 $Zertifikat
PHP-Code Snippet
function cert($parm) { exec('cd /opt/ca/x2/intermediate/; ./use_cert.sh '.$parm.' 2>&1', $out0); foreach ($out0 as $i) { echo "<p> $i </p>"; } }
- 4.1.1 Update & Installation
apt update && apt upgrade -y; apt install openssl apache2 php7.0-cli php7.0-curl php7.0-gd \ php7.0-geoip php7.0-intl php7.0-json \ php7.0-mbstring php7.0-mcrypt php7.0-mysql \ php7.0-opcache php7.0-readline php7.0-xml \ php7.0-xsl php7.0-zip;
- über git-Repository einbringen
git clone [url] /opt/ca
oder
mkdir
- Die vorbereiteten Dateien in die Ordner Struktur übertragen via FTP oder SSH/SFTP
/opt/ca/intermediate/certs/srv-PPLINUX001
a2enmod ssl
- und die Konfiguration:
nano /etc/apache2/sites-available/default-ssl.conf
SSLEngine on
SSLUseStapling on
SSLCertificateFile /opt/ca/<CA CLASS>/intermediate/certs/srv-PPLINUX.crt
SSLCertificateKeyFile /opt/ca/<CA CLASS>/intermediate/privates/srv-PPLINUX001.pem
SSLCertificateChainFile /opt/ca/<CA CLASS>/intermediate/certs/intermediate.crt
SSLCACertificatePath /opt/ca/<CA CLASS>/intermediate/certs/
SSLCACertificateFile /opt/ca/<CA CLASS>/intermediate/certs/ca.bundle.crt
SSLCARevocationPath /opt/ca/<CA CLASS>/intermediate/revokes/
SSLCARevocationFile /opt/ca/<CA CLASS>/intermediate/revokes/<FIRMA2>_policy_X1.crl
SSLVerifyClient optional
SSLVerifyDepth 10
ln -s /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-enabled/default-ssl.conf ; apachectl -t ;
Die Ausgabe sollte mit Syntax OK die korrekte Konfiguration bestätigen.
/opt/ca/ca_create.sh; /opt/ca/intermediate/use_cert.sh -srv create PP-LINUX1 192.168.6.201 365 ; chown -R www-data:www-data /opt/ca/intermediate; sleep 10; apachectl restart ;
curl -Iv http://pp-linux1
Die Ausgabe sollte * Connected to ... enthalten
oder den Web-Browser des Clients die Erreichbarkeit prüfen.
d.Z. Keine Daten vorhanden - 4.2.1 Windows Server Updates
Aufgrund der DMZ Restriktionen der virtuellen Umgebung können keine Updates bezogen werden.
- 4.2.2 Domäne-Controller konfigurieren
d.Z. Keine weiteren Daten vorhanden Auf den Inhalt des Projektes ist sind am Domäne-Controller keine Einstellungen notwendig
Die Clients müssen sich in der Domäne befinden
- 4.2.3 Active Directory konfigurieren
Das Programm Cert-Installer.exe konnte nicht als EXE-File über die GPO verteilt werden, dies erforderte noch die Integration in ein MSI-File, was über die Software „Advanced Installer 13“ realisiert wurde.
Im Anschluss kann über die GPO:
-> Gruppenrichtlinien-Editor -> Client OU -> Default Domain Policy
-> Computerkonfiguration -> Richtlinien -> Softwareeinstellungen -> Softwareinstallation
die MSI Datei an die Clients Verteilt werden.
d.Z. Keine weiteren Daten vorhanden
d.Z. Keine weiteren Daten vorhanden
d.Z. Keine weiteren Daten vorhanden
d.Z. Keine Daten vorhanden - 4.3.1 Web-Interface einpflegen
ln -s /opt/ca/x2/intermediate/ppwi/ /var/www/html/ppwi chown www-data:www-data /var/www/html/ppwi
1. Prüfung
curl -L -k http://pp-linux1/ppwi
Die Ausgabe sollte HTML-Code enthalten
Über den Web-Browser die Webseite → http://pp-linux1/ppwi und https://pp-linux1/ppwi aufrufen
Beispiel einer Positiven Verbindung im Logfile von Apache:
----END CERTIFICATE----- Server certificate subject=/C=DE/ST=Sachsen-Anhalt/O=<FIRMA2> Test/OU=<FIRMA2> Root Certificate Authority/CN=PP-Linux1/emailAddress=PP-Linux1@192.168.6.201 issuer=/C=DE/ST=Sachsen-Anhalt/O=<FIRMA2> Test/OU=<FIRMA2> Root Certificate Authority/CN=<FIRMA2> Sign CA X3/emailAddress=<FIRMA2>@192.168.6.201 Acceptable client certificate CA names /C=DE/ST=Sachsen-Anhalt/O=<FIRMA2> Test/OU=<FIRMA2> Root Certificate Authority/CN=<FIRMA2> Sign CA X3/emailAddress=<FIRMA2>@192.168.6.201 /C=DE/ST=Sachsen-Anhalt/L=Magdeburg/O=<FIRMA2> Test/OU=<FIRMA2> Root Certificate Authority/CN=<FIRMA2> CA Root X1/emailAddress=<FIRMA2>@192.168.6.201 Client Certificate Types: RSA sign, DSA sign, ECDSA sign Requested Signature Algorithms: ...+SHA1:ECDSA+SHA1 Shared Requested Signature Algorithms: ...SHA1 Peer signing digest: SHA512 Server Temp Key: ECDH, P-256, 256 bits SSL handshake has read 8085 bytes and written 5673 bytes
d.Z. Keine Daten vorhanden Die Zertifikate können auf dem Linux-Server mittels openSSL geprüft werden.
openssl verify -CAfile /opt/ca/intermediate/certs/sign-ca-chain.crt <client-certificate>
Sollte die Ausgabe OK erzeugen.
Um einen ausschließlichen Client-Authentifizierungsvorgang zu provozieren muss der Apache2 Server noch einmal konfiguriert werden.
In der Datei /etc/apache2/sites-available/default-ssl.conf wird der Wert „optional“ durch „require“ ersetzt. Anschließend muss der Apache Dienst neugestartet werden.
SSLVerifyClient require
Nach dem die Zertifikate an die Client(s) verteilt wurden, sollte mittels der Browser Edge und Chrome beim Aufrufen der Webseite https://pp-linux1/ eine Abfrage über das Zertifikat erfolgen und mit <OK> quittiert werden können.
Dann nach sollte die Apache Test Seite zu sehen sein.
Fehlercode: SSL_ERROR_HANDSHAKE_FAILURE_ALERT oder ähnliches weißt auf das Fehlen oder ein Fehlerhaftes Zertifikat hin.
der Linux-Client PP-Linux2 ermöglicht es hier noch eine Prüfung zu vollziehen
openssl s_client -connect pp-linux1:443 -CAfile ca-chain.cert.pem -cert publicCert.pem -key private.key -showcerts
Die Ausgabe sollte unter anderem verify return:1 beinhalten.
Bei der Wiederholung der oben beschriebenen Vorgänge kam es nur durch eine fehlerhafte Web-Server Konfiguration zu einer Störung. Dann jedoch gab es keinen weiteren Schwierigkeiten.
Dem Windows Server 2008 konnte mittels des Cert_Installer.exe / bzw. der MSI kein Zertifikat übermittelt werden, da keine sichere Verbindung über HTTPS aufgebaut werden konnte bzw. von Windows ablehnt wurde. Als Ursache habe ich den älteren Internet Explorer und fehlenden Updates ermittelt.
| Nr | Ziel | Kurz Beschr. | Status |
|---|---|---|---|
| 1 | CA-Root | Ausstellen eines Certificate Authority Root Zertifikat | |
| 2 | CA-Sign | Ausstellen eines Certificate Authority Sign Zertifikat | |
| 3 | Client Certs | Ausstellen Client Zertifikate per Script | |
| 4 | Deploy CAs | Verteilen CA-Root/CA-Sign Zertifikat | |
| 5 | Deploy Client Certs | Abrufen & installieren Client Zertifikate | |
| 6 | Renew on expired CAs | Erkennen von Ablauf CAs Zertifikate und Erneuerung | |
| 7 | Web-Gen. Client Cert | Erzeugen von Client-Zertifikat via Web-Interface | |
| 8 | Gen. Revoke List | Erzeugen einer abrufbaren Sperrliste | |
| 9 | Cli-Srv Auth | Authentifizierung des Clients am Server via Zertifikat |
* LDAP Zertifikate und ( Wikipedia LDAP )
Das Projekt umfasste in der Planung 35 Stunden, diese Zeit konnte aufgrund einer Störung im betrieblichen Ablauf im Vorfeld des Projektes und wegen meines gravierenden Fehlers bezüglich der PKI-Vererbungshierarchie[(#1)] nicht absolut Eingehalten werden.
Mangels der Internet Anbindung und dem dadurch ausgebliebenen Updates der Windows Systeme habe ich 2 Stunden gewonnen, welche ich wie oben beschrieb dann 4 Stunden Fehler und Ursachen Behebung gegenrechnen muss. Der zeitlich Vergleich zwischen Soll und Ist wurde dem Anhang hinzugefügt.
Auch musste ich feststellen das das strengende erw. Wasserfallmodell nicht zwangsläufig die beste Wahl sein muss für solche Projekte. Das ständige Hin und Her zwischen den Plattformen, die Abhängigkeiten bei Server Zertifikat und Client-Authentifizierung sowie das damit verbundene neustarten der Dienste konnte auch nicht den Fehler Frühzeit erkenntlich machen.
[(gl:ca>CA - Certificate Authority)]
[(gl:dmz> DMZ - Demilitarisierte Zone)]
[(gl:pki> PKI - Demilitarisierte Zone)]
[(gl:prot:http> HTTP - Hyper Text Transfer Protokoll - Port 80)]
[(gl:prot:https> HTTPS - Hyper Text Transfer Protokoll Secure - Port 443)]
[(gl:prot:ftp> FTP - File Transfer Protokoll - Port 21)]
~~REFNOTES gl ~~
~~REFNOTES gl:prot ~~
| Kürzel | Erklärung |
|---|---|
| DMZ | Demilitarisierte Zone |
| Isuser |
~~REFNOTES~~
~~REFNOTES cite 10 ~~ ~~REFNOTES cite /2 ~~
<refnotes cite /2> refnote-id: i; note-preview: none </refnotes>
[(rfc5820>rfc5820)] - https://tools.ietf.org/html/rfc5820
[(RFC6818>RFC6818)] - https://tools.ietf.org/html/rfc6818
<FIRMA2> CA Root X1
countryName_default = DE stateOrProvinceName_default = Sachsen-Anhalt localityName_default = Magdeburg 0.organizationName_default = <FIRMA2> Test organizationalUnitName_default = <FIRMA2> Root Certificate Authority commonName_default = <FIRMA2> CA Root X1 emailAddress_default = <FIRMA2>@<FIRMA2>.local
<FIRMA2> Sign CA X2
countryName_default = DE stateOrProvinceName_default = Sachsen-Anhalt localityName_default = Magdeburg 0.organizationName_default = <FIRMA2> Test organizationalUnitName_default = <FIRMA2> Root Certificate Authority commonName_default = <FIRMA2> Sign CA X2 emailAddress_default = <FIRMA2>@<FIRMA2>.local
| Name | IP | Betriebssystem | Funktion | Konfiguration |
|---|---|---|---|---|
| PP-Linux1 | 192.168.6.201 | #93-Ubuntu SMP | PKI-Server | Ground |
| PP-Linux2 | 192.168.6.202 | #93-Ubuntu SMP | Example SRV/CLI | Ground |
| w2k8-template | 192.168.6.203 | Windows Server 2k8 | AD-Domäne Controller | Template |
| TestCli | 192.168.6.204 | Windows 10 | Example Client | Template |
- Netzwerk Konfiguration
| Nr | Phase | Kurz Beschr. | Soll-Zeit | Ist-Zeit | Diff |
|---|---|---|---|---|---|
| 1 | Projektstart | Vorstellung des Projektes | 1 h | 1 h | |
| 2 | Analyse & Definition | Soll-Ist Analyse | 2 h | 2 h | |
| 3 | Entwurf | Ausarbeitung Scripte | 5 h | 5 h | |
| 4 | Implementation | Aufsetzen Server / Client Instanzen | 10 h | 8 h | - 2 |
| 5 | Test / Validierung | Testlauf Zertifikat Verteilung | 8 h | 12 h | +4 |
| 6 | Einsatz | Roll-Out | 2 h | 2 h | |
| 7 | Abschluss | Übergabe | 7 h | 7 h | |
| Summe | 35 h | 37 h |