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:
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:
Awesome! Vielen Dank. – Kimvais