it-swarm.com.de

Konfigurieren Sie die gegenseitige SSL-Authentifizierung (bidirektionale Authentifizierung)

Viele Tutorials, viele Seiten, viele Fragen und sie unterscheiden sich in der Implementierung dieses Problems "Konfigurieren der gegenseitigen (bidirektionalen) SSL-Authentifizierung". Ich muss es mit Linux machen und weiß nicht, wo ich anfangen soll oder welche Anweisungen ich befolgen soll.

Was ich tun muss ist:

  • Ich habe einen Server und viele Clients. Sie können nur dann auf Code auf dem Server zugreifen, wenn sie ein signiertes Zertifikat vom Server haben.
  • der Server kann diese Zertifikate generieren und deaktivieren. Der Hauptserver ist die Zertifizierungsstelle. Dies bedeutet, dass er Zertifikate für andere generieren und diese dann signieren muss.

Ich hatte mir überlegt, was ich tun sollte

  1. cA-Zertifikat generieren
  2. zertifikate für andere Benutzer generieren.
  3. geben Sie den Benutzern ein Zertifikat.
  4. zertifikate unterschreiben.
  5. zertifikat überprüfen.
  6. zertifikat für Benutzer neu generieren oder deaktivieren.
  7. benutzer kann nur von einem Gerät aus signieren. (Zertifikat darf nicht kopiert werden)

Habe ich etwas verpasst Muss ich ein Root-Benutzer sein? Gibt es dafür eine fertige Bash? Wo finde ich es? Warum gibt es mehr als eine openssl.cnf-Datei unter Linux? Wo ich das CA-Zertifikat ablegen soll, sind alle Informationen willkommen.

25
SafeY

Neben openssl gibt es ein praktisches Skript, CA.sh, Um die meisten dieser Dinge zu erledigen. Der Standort ist verteilungsspezifisch. In Debian und Derivaten können Sie es finden mit:

# apt-file search CA.sh
openssl: /usr/lib/ssl/misc/CA.sh

Und RedHat und Derivate das (ungefähre) Äquivalent ist:

# yum provides */CA
1:openssl-1.0.1e-4.fc18.x86_64 : Utilities from the general purpose cryptography library with TLS implementation
Repo        : @updates
Matched from:
Filename    : /etc/pki/tls/misc/CA

Dies ist ein sehr einfaches Bash-Skript, das die Erstellung der Verzeichnisstruktur erleichtert, die zum Verwalten einer Zertifizierungsstelle erforderlich ist (dies wird im Abschnitt [ CA_default ] Von openssl.cnf beschrieben). Ich empfehle Ihnen, es zu verwenden und sich den Code anzusehen, um zu erfahren, was er tatsächlich tut.

# ./CA.sh -help
usage: ./CA.sh -newcert|-newreq|-newreq-nodes|-newca|-sign|-verify

Dieses Skript verwendet die in openssl.cnf angegebenen Standardeinstellungen, und/oder Sie können eine Konfigurationsdatei als Argument für openssl $command Mit dem Schalter -config Bereitstellen, wenn Sie nicht CA.sh Verwenden. . Der Speicherort der Datei openssl.cnf Ist ebenfalls verteilungsspezifisch, und Sie können dieselben Befehle wie oben verwenden, um sie zu finden. Das gewünschte Paket wird vom Paket openssl bereitgestellt.

Sie möchten wahrscheinlich die folgenden Abschnitte ändern:

[ CA_default ]
default_days    = 365                   # how long to certify for
default_crl_days= 30                    # how long before next CRL

[ req ]
default_bits            = 2048

[ req_distinguished_name ]
countryName                     = Country Name (2 letter code)
countryName_default             = AU
countryName_min                 = 2
countryName_max                 = 2
stateOrProvinceName             = State or Province Name (full name)
stateOrProvinceName_default     = Some-State
localityName                    = Locality Name (eg, city)
0.organizationName              = Organization Name (eg, company)
0.organizationName_default      = Internet Widgits Pty Ltd
#1.organizationName             = Second Organization Name (eg, company)
#1.organizationName_default     = World Wide Web Pty Ltd
organizationalUnitName          = Organizational Unit Name (eg, section)
#organizationalUnitName_default =
commonName                      = Common Name (e.g. server FQDN or YOUR name)
commonName_max                  = 64
emailAddress                    = Email Address
emailAddress_max                = 64
  • Generieren Sie die Zertifizierungsstelle

Nachdem Sie openssl.cnf An Ihre Anforderungen angepasst haben, können Sie ein CA-Zertifikat erstellen. Je nachdem, ob diese Zertifizierungsstelle von einer anerkannten Drittanbieter-Zertifizierungsstelle signiert werden muss oder nicht, können Sie eine selbstsignierte Zertifizierungsstelle oder eine CSR generieren, die zur Signatur eingereicht werden soll.

./CA.sh -newca

Sie werden interaktiv aufgefordert, einige Fragen zu stellen. Die Standardeinstellungen werden in eckigen Klammern angezeigt. Hier erkennen Sie die Optionen, die Sie in openssl.cnf Geändert haben.

  • Generieren Sie ein Zertifikat für den Server

Sie können eine Zertifikatanforderung für den Server mit demselben Skript erstellen:

./CA.sh -newreq

Sie werden erneut aufgefordert, mehrere Fragen zu stellen. Der wichtigste ist der allgemeine Name des Zertifikats, der mit dem DNS-auflösbaren Namen für die IP des Servers übereinstimmen muss (oder Sie können andere Mittel wie /etc/hosts Verwenden. , nicht empfohlen, schwer zu warten und zu skalieren)

Was Sie erhalten, ist eine Zertifikatsignierungsanforderung (kurz CSR). Dies wird von der zuvor erstellten Zertifizierungsstelle (CA) signiert.

./CA.sh -sign

  • Generieren Sie Zertifikate für die Clients

Wiederholen Sie die Schritte zum Erstellen einer CSR und zum Signieren durch die Zertifizierungsstelle. Achten Sie dabei genau darauf, wie Sie die Felder Common Name, Organization und Organizational Unit ausfüllen, da diese anschließend für die Konfiguration des Servers erforderlich sind.

Eine gute Möglichkeit, die Client-Zertifikate zusammen mit ihren jeweiligen privaten Schlüsseln und dem CA-Zertifikat zu verteilen, ist die Verwendung von p12-Bundles:

openssl pkcs12 -export -in Certificates/client.pem -inkey client.key -certfile CA.pem -out clientcert.p12

  • Konfigurieren Sie den Server

Angenommen, der Server, auf den Sie sich beziehen, ist ein Apache-Webserver. Sobald Sie über das Serverzertifikat verfügen, konfigurieren Sie das entsprechende VHOST, um alle Inhalte bereitzustellen, die durch gegenseitige SSL-Authentifizierung geschützt werden sollen. Ein Beispiel könnten diese virtuellen Hosts phpmyadmin sein. Dies funktioniert auf einem Apache 2.4-Server. Verwenden Sie ihn daher nicht unverändert und überprüfen und testen Sie ihn sorgfältig, um ihn an Ihre Anforderungen anzupassen.

Listen                   443 https

<VirtualHost 120.120.120.120:443>
  DocumentRoot           "/srv/www/html"
  ServerAdmin            [email protected]
  SSLCACertificateFile   /etc/pki/CA/cacert.pem
  SSLCertificateFile     /etc/pki/tls/private/phpmyadmin.company.com/newcert.pem
  SSLCertificateKeyFile  /etc/pki/tls/private/phpmyadmin.company.com/newkey.pem
  SSLCARevocationCheck   chain
  SSLCARevocationFile    /etc/pki/CA/crl/crl.pem
  SSLEngine              on
  SSLStrictSNIVHostCheck on
  SSLVerifyClient        require
  SSLVerifyDepth         5
  ServerName             phpmyadmin.company.com
  RewriteEngine          on
  RewriteCond            %{REMOTE_ADDR} !^127\.0\.0\.1$
  RewriteCond            %{HTTPS} !=on
  RewriteRule            . - [F]
  Alias                  /console /usr/share/phpMyAdmin
  ErrorLog               "|/usr/sbin/rotatelogs -L /var/log/httpd/phpmyadmin/error.log -f /var/log/httpd/phpmyadmin/error.log.%Y%m%d 86400"
  CustomLog              "|/usr/sbin/rotatelogs -L /var/log/httpd/phpmyadmin/access.log -f /var/log/httpd/phpmyadmin/access.log.%Y%m%d 86400" logstash_json
  <Directory /usr/share/phpMyAdmin/>
    Require              ssl
    Require              ssl-verify-client
    SSLRequireSSL
    SSLOptions           +FakeBasicAuth +StrictRequire
    SSLRequire           %{SSL_CIPHER_USEKEYSIZE} >= 256
    SSLRequire           %{SSL_CLIENT_S_DN_O} eq "Awesome Company" \
                     and %{SSL_CLIENT_S_DN_OU} eq "Development" \
                     and %{SSL_CLIENT_S_DN_CN} in {"John Doe", "Jane Doe"}
    SSLRenegBufferSize   131072
  </Directory>
</VirtualHost>

Sie können so viele Zugriffskontrollen pro Verzeichnis verwenden, wie Sie benötigen. Der wichtige Teil ist, dass die angezeigten Client-Zertifikate den Einschränkungen entsprechen müssen, die durch die Direktiven SSLRequire auferlegt wurden, dh sie müssen mit der Organisation, der Organisationseinheit und übereinstimmen Common Name-Bedingungen (oder andere Felder des Zertifikats, wie Sie es für richtig halten). Diese Felder stammen aus den Client-Zertifikaten.

  • Generieren Sie eine Zertifikatsperrliste

Um den Zugriff auf ein Client-Zertifikat widerrufen zu können, müssen Sie eine CRL generieren. Der Befehl dazu (vorausgesetzt, Sie befinden sich oben in der CA-Verzeichnisstruktur):

openssl ca -config /path/to/openssl.cnf -gencrl -out crl/crl.pem

Anschließend widerrufen Sie Client-Zertifikate nach Bedarf mit:

openssl ca -config /path/to/openssl.cnf -revoke clientcert.pem

Verweise:

OpenSSL Online-Dokumentation und Apache Online-Dokumentation.

18
dawud