2013-06-18 20 views
5

wenig Hintergrund: ich ein certificate authority m2crypto und Django baue verwenden, so zweimal überlegen, bitte, bevor Sie diese als vom Thema zu schließen wählen! :)auf Zertifikaten, welche Art sollten E-Mail-Adressen sein, wenn in subjectAltName

Mein Ansatz ist, dass Endnutzer durch E-Mail-Adressen identifiziert werden und ihre selbstsignierten Vertrauensanker offensichtlich von sich selbst ausgestellt werden, aber wie soll ich ihre "Identität" speichern?

I viele Zertifikate da draußen in der freien Natur gesehen habe, wo die Praxis Mail-Adressen als subjectAltName = rfc822:[email protected] zu speichern hat, aber googling suggest, dass der normale Weg subjectAltName = email:[email protected] sei.

Gibt es irgendein Unterschied zwischen den beiden, und wenn ja, welches ist bevorzugt?

Antwort

4

Gibt es einen Unterschied zwischen den beiden, und wenn ja, welcher wird bevorzugt?

Nicht wirklich; und es hängt von dem PKI-Profil ab, das Sie verwenden. PKI und X509 sind der wilde, wilde Westen.

Wenn Sie eine private PKI innerhalb Ihrer Organisation ausführen, spielt es keine Rolle, wie Sie es tun. Wähle etwas und mache es konsequent.


Im Netz in RFC 5280 seine allgemein PKIX und angegeben, Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile. Nach 4.1.2.6, Betreff:

Conforming implementations generating new certificates with 
electronic mail addresses MUST use the rfc822Name in the subject 
alternative name extension (Section 4.2.1.6) to describe such 
identities. Simultaneous inclusion of the emailAddress attribute in 
the subject distinguished name to support legacy implementations is 
deprecated but permitted. 

Dann Abschnitt 4.2.1.6, Subject Alternative Name:

When the subjectAltName extension contains an Internet mail address, 
the address MUST be stored in the rfc822Name. The format of an 
rfc822Name is a "Mailbox" as defined in Section 4.1.2 of [RFC2821]. 
A Mailbox has the form "[email protected]". Note that a Mailbox has 
no phrase (such as a common name) before it, has no comment (text 
surrounded in parentheses) after it, and is not surrounded by "<" and 
">". 

Beachten Sie, dass es auch nicht rfc822:[email protected] oder email:[email protected] nicht verwendet. Wie ich schon sagte, es ist der wilde, wilde Westen. Du solltest auf alles vorbereitet sein.


Sie haben auch die CA/Browser-Foren und ihre Standards für die Ausstellung von Zertifikaten. Die beiden Dokumente von Interesse sind:

Aber sie verschieben zurück in RFC 5280.


Die rfc822: und email: Sie sehen, ist wahrscheinlich hinzugefügt von Software für die Präsentation. Um zum Beispiel die SANs mit OpenSSL aufzuzählen, würde Ihre Funktion aussehen:

void print_san_name(X509* const cert) 
{ 
    int success = 0; 
    GENERAL_NAMES* names = NULL; 
    unsigned char* utf8 = NULL; 

    do 
    { 
     if(!cert) break; /* failed */ 

     names = X509_get_ext_d2i(cert, NID_subject_alt_name, 0, 0); 
     if(!names) break; 

     int i = 0, count = sk_GENERAL_NAME_num(names); 
     if(!count) break; /* failed */ 

     for(i = 0; i < count; ++i) 
     { 
      GENERAL_NAME* entry = sk_GENERAL_NAME_value(names, i); 
      if(!entry) continue; 

      if(GEN_DNS == entry->type) 
      { 
       int len1 = 0, len2 = -1; 

       len1 = ASN1_STRING_to_UTF8(&utf8, entry->d.dNSName); 
       if(utf8) { 
        len2 = (int)strlen((const char*)utf8); 
       } 

       if(len1 != len2) { 
        fprintf(stderr, "Strlen and ASN1_STRING size do not match (embedded null?):" 
            " %d vs %d\n", len2, len1); 
        /* Handle error */ 
       } 

       /* Do something with utf8 */ 

       if(utf8) { 
        OPENSSL_free(utf8), utf8 = NULL; 
       } 
      } 
      else if(GEN_EMAIL == entry->type) 
      { 
       ... 
      } 
      ... 
     } 

    } while (0); 

    if(names) 
     GENERAL_NAMES_free(names); 

    if(utf8) 
     OPENSSL_free(utf8); 
} 

(Leider habe ich nicht ein Beispiel haben, die die IA5Strings praktisch extrahiert).

In den oben genannten, beachten Sie den Typ: GEN_DNS oder allgemeinen DNS-Namen.Das wird für Namen wie www.example.com verwendet. OpenSSL hat ein paar von diesen Typen, und unten ist von x509v3.h:

#define GEN_OTHERNAME 0 
#define GEN_EMAIL  1 
#define GEN_DNS   2 
#define GEN_X400  3 
#define GEN_DIRNAME  4 
#define GEN_EDIPARTY 5 
#define GEN_URI   6 
#define GEN_IPADD  7 
#define GEN_RID   8 

Ihr Zertifikat-Viewer oder Präsentationssoftware wahrscheinlich rfc822: oder email: angezeigt wird, weil es eine Art GEN_EMAIL angetroffen.


Wenn Sie bei OpenSSL-Konfigurationsdatei betrachten, werden Sie zum Beispiel sehen:

... 
[ v3_ca ] 
subjectKeyIdentifier = hash 
authorityKeyIdentifier = keyid:always,issuer:always 
subjectAltName   = email:[email protected] 
issuerAltName   = issuer:copy 

Die email: ist nicht wörtlich in das SAN kopiert. Vielmehr teilt es OpenSSL mit, den Typ GEN_EMAIL für das Feld zu verwenden.


Wenn Ihr Zertifikat-Viewer oder Präsentationssoftware nicht, indem das Präfix ist, dann Parsen seines wahrscheinlich einen Distinguished benannt.

Peter Gutmann hat mir vor langer Zeit (von seiner E-Mail) gesagt: "Halte alles was du willst in der DN und präsentiere nur die Bits, die nützlich sind". Wie ich schon sagte, es ist der wilde, wilde Westen.


E-Mail-Adressen können auch unter einer OID angezeigt werden. Zum Beispiel die 1.2.840.113549.1.9.1 arc. Das ist neben dem SAN. Es ist warum das Bild unten das Etikett "Email Address" hat.


Peter Gutmann hat eine X509 Style Guide. Aus seiner Beschreibung: Es beschreibt verschiedene Implementierungsdetails und Fallstricke des X.509-Zertifikats, gibt Empfehlungen, was zu tun ist und was nicht zu tun ist, und schließt mit einer Liste bekannter Fehler und Probleme ab, auf die in vorhandenen Implementierungen geachtet werden muss.


Endlich, hier ist ein Benutzerzertifikat von Startcom ausgestellt. Sie bieten kostenlose Zertifikate an und verlangen bei Bedarf einen Widerruf (weil dort die Kosten liegen). Das ist diametral zu anderen CAs gegenüber, die für den Widerruf erheben vorne und die Tasche stecken, wenn sie nicht benötigt wird;)

Die erste ist die X509-Zertifikat:

enter image description here

Und zweitens ist der Dump des Zertifikats unter Verwendung von Gutmann's dumpasn1 (Get Dumpasn1.c und Dumpasn1.cfg von www.cs.auckland.ac.nz/~pgut001; kompilieren mit gcc dumpasn1.c -o dumpasn1; und kopieren Sie in /usr/local/bin). Beachten Sie es nicht rfc822: oder email: Präfix:

enter image description here

+0

Awesome! Vielen Dank. – Kimvais