Die Zertifikatverwaltung

Die Verwaltung aller in Kommunikationsvorgängen verwendeter Zertifikate erfolgt beim Nutzer. Die Verwaltung umfasst auch X.509-Zertifikate. Für die vollständige Nutzung der X.509-Funktionalitäten umfasst dies auch die Speicherung der CA-Zertifikate. Dies erlaubt die Definition zusätzlicher Sicherheitsstufen durch den Nutzer.

Zustandstabelle und Nutzbarkeit

Der Zustand eines Zertifikats wird durch eine Statustabelle beschrieben [1]

enum Status
{
    //!
    //! Teil 1: X509-Statusinformationen

    VERIFIED = 0x00000000,
    OCSP_RESPONSE_GOOD,
    NO_REVOCATION_DATA,

    SIGNATURE_METHOD_TOO_WEAK = 1000,
    UNTRUSTED_HASH,

    CERT_NOT_YET_VALID = 2000,
    CERT_HAS_EXPIRED,

    OCSP_NOT_YET_VALID,
    OCSP_HAS_EXPIRED,
    CRL_NOT_YET_VALID,
    CRL_HAS_EXPIRED,

    CERT_ISSUER_NOT_FOUND = 3000,
    CANNOT_ESTABLISH_TRUST,
    CERT_CHAIN_LOOP,

    POLICY_ERROR = 4000,
    INVALID_USAGE,
    CERT_CHAIN_TOO_LONG,
    CA_CERT_NOT_FOR_CERT_ISSUER,
    NAME_CONSTRAINT_ERROR,

    CA_CERT_NOT_FOR_CRL_ISSUER,
    OCSP_CERT_NOT_LISTED,
    OCSP_BAD_STATUS,
    CERT_NAME_NOMATCH,
    UNKNOWN_CRITICAL_EXTENSION,

    CERT_IS_REVOKED = 5000,
    CRL_BAD_SIGNATURE,
    SIGNATURE_ERROR,

    //!
    //! Teil 2: EI-Statusinformationen
    //!
    EI_PRIVATE_KEY_KNOWN = 10000,
    EI_VORBIDDEN,                   //! Zertifikat gesperrt
    EI_VERIFIED,                    //! Zertifikat vom Nutzer verifiziert
    IS_TRUSTED_CA,                  //! Zertifikat ist eine CA
    IS_SIGNED_BY_TRUSTED,               //! Das Zertifikat ist von einer verifizierten Instanz signiert
    EI_EXCLUDED = 10014,            //! das Zertifikat ist eine Fälschung und wird nicht mehr berücksichtigt

    EI_OLD_GENERATION = 10020,
    EI_USAGE_DENIED = 10030,            //! Das Zertifikat ist aufgrund des Zustands eines anderen Zertifikats gesperrt
                                        //! In der Regel ist eines der Signaturzertifikate (rekursiv) ungültig
    EI_URL_DENIED,                      //! Für die URL ist ein anderes Zertifikat zuständig
    EI_CERT_REFUSED,                    //! Das Zertifikat wurde nicht akzeptiert

    IS_EI_CERT = 10100,                     //! Unterscheidung zwischen EI und X509
    EI_SIGNED_BY_X509,                      //! Zertifikat ist durch ein X509-Zertifikat signiert
    EI_SIGNED_BY_EI,                        //! EI-Signatur = closed group, falls cert eine ei ist
    EI_SELF_SIGNED,                         //! Selbst signiertes Zertifikat
    EI_UNSIGNED,                            //! unsigniertes Zertifikat (beispielsweise RVB-Zertifikate)
    EI_UPGRADE_VERIFIED,                    //! Das Zertifikat wurde durch ein automatisches Update verifiziert
    IS_X509_CA,

    EI_USER_ACTION = 11000,             //! Statusänderungen durch den Nutzer (lässt Gruppe 1-Änderungen zu)
    EI_UPDATE_ACTION,                     //! Eigenes Upgrade vorgemerkt
    EI_COMM_ACTION                     //! Auswertung aus Kommuniktion eingehender Zertifikate
};

Bestimmte Zustände schließen einander aus, Änderungen am Zustand eines Zertifikats können Auswirkungen auf die Zustände anderer Zertifikate haben. Der erste Teil der Tabelle betrifft die im X.509-Schema vergebenen Zustände. Alle Zertifikate werden zunächst im Rahmen des X.509-Schemas begutachtet, anschließend nach den erweiterten Regeln des EI-Schemas. Für die Nutzbarkeit eines Zertifikats gilt:

bool CertStatus::usage_allowed() const
{
    return !has_status_m(10,
                     Status::CERT_NOT_YET_VALID,
                     Status::CERT_HAS_EXPIRED,
                     Status::CERT_IS_REVOKED,
                     Status::EI_VORBIDDEN,
                     Status::EI_EXCLUDED,
                     Status::EI_OLD_GENERATION,
                     Status::EI_USAGE_DENIED,
                     Status::SIGNATURE_ERROR,
                     Status::EI_URL_DENIED,
                     Status::EI_CERT_REFUSED);
}

Die Statusinformationen sind teilweise statisch an das Zertifikat gebunden, teilweise werden sie dynamisch während der Kommunikationsvorgangs ermittelt. Die Vergabe von Zuständen orientiert sich am Authentifizierungsprinzip, d.h. es soll die größtmögliche Sicherheit erreicht werden, dass ein Zertifikat auch der Person oder dem System gehört, mit dem man kommunizieren möchte, und nicht einem Betrüger.

Eigene Zertifikate

Vom Nutzersystem werden anderen Systemen nur eigene Zertifikate präsentiert. Eigene Zertifikate sind per Definition solche, für die ein privater Schlüssel vorliegt (EI_PRIVATE_KEY_KNOWN). Dabei handelt es sich um

  • importierte X.509-Zertifikate des Nutzers, z.B. von einer CA erstellt,
  • vom System erzeugte EI-Zertifikate (die auch X.509-Regeln unterliegen und durch ein CA signiert werden können).

Private Schlüssel können nicht gelöcht werden, d.h. eigene Zertifikate bleiben eigene Zertifikate. Private Schlüssel von X.509-Zertifikaten können nachträglich importiert werden und machen Fremdzertifikate zu eigenen Zertifikaten.

Eine Zertifikatfamilie kann entweder Eigenzertifikate oder Fremdzertifikate enthalten. Ein gemischter Betrieb (nur für einige Zertifikate einer Familie vorhandene private Schlüssel) wird vom System nicht zugelassen.

Zertifikate können vom Nutzer manuell gesperrt oder freigegeben werden (EI_VORBIDDEN).

Wird ein Zertifikat einer neuen Generation erzeugt, werden automatisch alle früheren Generationen ungültig (EI_OLD_GENERATION). Diese Zuweisung ist nicht umkehrbar.

Fremdsignierte Eigen-Zertifikate werden automatisch gesperrt (EI_USAGE_DENIED), wenn das Signaturzertifikat gesperrt wird. Sofern das Signaturzeritifikat wieder entsperrt wird, wird auch das Eigenzertifikat automatisch entsperrt.

Die Zustände sind unabhängig voneinander.

Die Verwendung von Zertifikaten in Kommunikationsvorgängen erfolgt

  • durch feste Vorgabe des zu verwendenden Zertifikats in den Konfigurationsdaten (dies ist i.d.R. in allen Serveranwendungen sowie in lokalen Netzwerken zu verwenden),
  • automatisch durch Verwendung des ersten nutzbaren Zertifikats, das für die betreffende Anwendung konfiguriert ist (z.B. die URL in EI.Owner oder EI.Description, die absendende Emailadresse usw.),
  • durch das erste nutzbare Zertifikat, sofern keine der vorgenannten Bedingungen erfüllt sind.

Im Rahmen der Verwendung eines EI-Zertifikats im X.509-Umfeld ist darauf zu achten, dass die X.509-Vorgaben erfüllt werden.

Wichtig

Bei fest vordefinierten Zertifikaten ist darauf zu achten, dass nach Zustandsänderungen, die zur Sperrung der Zertifikate führen, die Konfiguration ebenfalls angepasst wird. Sonst sind Verbindungen mit anderen Systemen nicht möglich. Die manuelle Konfiguration kann nicht durch eine Automatik ersetzt werden.

Importierte Zertifikate und Vertrauensniveau

Notwendige Zertifikate können manuell importiert werden. Dies betrifft beispielsweise X.509-CA-Root-Zertifikate, die aus den Browserumgebungen importiert werden können. Für die Auswertung von Zertifikaten in Kommunikationsvorgängen ist das Vertrauensniveau der signierenden Zertifikate von Bedeutung:

bool CertStatus::is_trusted() const
{
    return has_status_m(4,
                    Status::EI_PRIVATE_KEY_KNOWN,
                    Status::EI_VERIFIED,
                    Status::IS_SIGNED_BY_TRUSTED,
                    Status::IS_TRUSTED_CA);
}

Die Zustände EI_VERIFIED und IS_TRUSTED_CA werden vom Nutzer manuell vergeben (der zweite Zustand zusätzlich zum automatisch vergebenen IS_X509_CA). Eine Unterscheidung zwischen vertrauenswürdigen CA und beispielsweise der freien EI-CA (oder anderen freien CA), bei denen die Identität des signierten Zertifikats nicht garantiert wird, ist so möglich (siehe Kommunikationszertifikate).

IS_SIGNED_BY_TRUSTED ist eine rekursive Eigenschaft, die an signierte Zertifikate weitergeben wird und das Vertrauen in eine Zertifikatkette wiedergibt. Die Eigenschaft wird dynamisch vergeben oder gelöscht.

Kommunikationszertifikate

Die folgenden Regeln behandeln den Empfang von Server-Zertifikaten oder Partner-Zertifikaten in offline-Kommunikation. Sie sind mit den anderen Regeln zum Teil rekursiv zu kombinieren, d.h. der Code umfasst weitere Details. Client-Zertifikate unterliegen den gleichen Regeln bis auf die Kontrolle des Verwendungszwecks: ein Server kann mit beliebigen Clients kommunizieren und die Client-Zertifikate können zur Identifizierung des Client-Systems herangezogen werden, jedoch ist deren Überprüfung Angelegenheit der Anwendung und nicht des EI-Management-Systems.

CA signed X.509. Es gelten die X.509-Regeln für die Gültigkeit von Zertifikaten. CA-Zertifikate müssen registriert sein, mitgesandte Zwischenzertifikate werden ausgewertet. Bereits registrierte und zugelassene Zertifikate werden ohne weitere Prüfung zugelassen, bei nicht zugelassenen Zertifikaten wird die Verbindung verweigert.

Für neue Zertifikate gilt:

  • Mit einer Trusted-CA signierte Zertifikate werden ohne weitere Prüfung zugelassen. Ist bereits ein Zertifikat für den Zweck registriert, aber nicht als TRUSTED markiert, wird dieses ausgeschlossen und muss vom Nutzer kontrolliert werden. Mehrere TRUSTED Zertifikate für den gleichen Zweck sind zulässig.
  • Mit einer Nicht-Trusted-markierten CA werden die Zertifikate
    • zugelassen, wenn keine anderen Zertifikate für den aktuellen Verwendungszweck (URL, Mailadresse, ...) registriert sind.
    • nicht zugelassen, wenn andere Zertifikate für den Zweck registriert sind. Das Zertifikat wird registriert, muss aber vom Nutzer überprüft werden.

“Zertifikate” umfasst sowohl X.509- als auch EI-Zertifikate mit dem Status usage_allowed. Zugelassene Zertifikate werden mit dem Verwendungszweck registriert.

self signed X.509. Hier gelten sinngemäß die für signierte Zertifikate genannten Regeln:

  • Bekannte zugelassene Zertifikate werden wieder zugelassen.
  • Neue Zertifikate werden zugelassen, wenn kein anderes zugelassenes Zertifikat für den Zweck registriert ist. (Vorrang hat immer das bereits registrierte Zertifikat).

CA signed EI. Mit TRUSTED CA signierte EI-Zertifikate werden immer zugelassen. Ansonsten gelten die gleichen Regeln wie für self-signed EI-Zertifikate.

self signed EI. Für bereits registrierte und zugelassene Zertifikate werden verwendet, wenn kein EI-Zertifikat einer anderen Familie für den Zweck registriert oder das Zertifikat den TRUSTED-Vermerk besitzt. Andernfalls wird eine Prüfung des Konfliktfalls durch den Nutzer ausgelöst.

Zertifikate unbekannter Familien werden registriert und zugelassen. Der Verwendungszweck wird gemäß den vorstehenden Regeln zusätzlich kontrolliert.

Zertifikate bekannter Familien werden nur zugelassen, wenn das neue Zertifikat den öffentlichen Schlüssel eines bekannten und zugelassenen Zertifikats verwendet. Andernfalls wird das Zertifikat zunächst einem Bestätigungsverfahren zugeleitet. Zugelassene neue Zertifikate einer neuen Generation machen die Verwendung aller Zertifikate der vorhergehenden Generation unzulässig.

EI signed EI. Hierbei handelt es sich um lokale Netzwerke, d.h. die Systeme werden manuell für diesen Zweck mit Signaturzertifikat und Systemzertifikat konfiguriert. So konfigurierte Systeme lassen nur gültige Zertifikate zu, die mit dem gleichen Signaturzertifikat signiert sind. Als einzige Regel gilt, dass eine neue Generation alte Generationen ungültig macht.

[1]Im Code können je nach Projektfortschritt weitere Zustände definiert sein. Die aktuelle Bedeutung ist im Code kommentiert.