2つに違いはありますか?もしそうなら、どちらが好まれますか?
あまり; 使用している PKI プロファイルによって異なります。PKI と X509 は、ワイルド、ワイルド、ウェストです。
組織内でプライベート PKI を実行している場合、その方法は問題ではありません。何かを選び、それを一貫して行う。
Web では、一般に PKIX であり、RFC 5280、Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profileで指定されています。4.1.2.6 によると、件名:
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.
次に、セクション 4.2.1.6、サブジェクトの別名:
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 "Local-part@Domain". 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
">".
rfc822:user@domain.test
またはを使用していないことに注意してくださいemail:user@domain.test
。私が言ったように、それは野生の、野生の西です。何事にも備えておくべきです。
また、CA/Browser Forums と、証明書を発行するための標準もあります。対象となる 2 つのドキュメントは次のとおりです。
しかし、彼らは RFC 5280 まで延期します。
ご覧のrfc822:
とemail:
は、おそらくプレゼンテーション用のソフトウェアによって追加されたものです。たとえば、OpenSSL を使用して SAN を列挙するには、関数は次のようになります。
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);
}
(申し訳ありませんが、IA5Strings
ハンディを抽出する例はありません)。
GEN_DNS
上記の type:または一般的な DNS 名に注目してください。のような名前に使用されますwww.example.com
。OpenSSL にはこれらのタイプがいくつかあります。以下は からのもの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
証明書ビューアーまたはプレゼンテーション ソフトウェアが表示されているか、タイプが検出されたことが原因である可能性rfc822:
がemail:
ありGEN_EMAIL
ます。
OpenSSL の構成ファイルを見ると、たとえば次のように表示されます。
...
[ v3_ca ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer:always
subjectAltName = email:myEmail@email.com
issuerAltName = issuer:copy
はそのまま SAN にコピーされemail:
ません。むしろ、GEN_EMAIL
フィールドの型を使用するように OpenSSL に指示します。
証明書ビューアーまたはプレゼンテーション ソフトウェアがプレフィックスを追加していない場合は、おそらく識別名を解析しています。
識別名に含まれるものについては、Peter Gutmann がずっと前に (彼の電子メールから引用して) 私に次のように語っています。私が言ったように、それは野生の、野生の西です。
電子メール アドレスも OID の下に表示される場合があります。たとえば、1.2.840.113549.1.9.1 arcです。それはSANに加えてです。下の画像に「メールアドレス」というラベルが付いているのはそのためです。
Peter Gutmann はX509 Style Guideを持っています。彼の説明から抜粋: X.509 証明書のさまざまな実装の詳細と落とし穴について説明し、何をすべきか、何をすべきでないかについての推奨事項を提供し、既存の実装で注意すべき既知のバグと問題のリストで締めくくります。
最後に、これが Startcom によって発行されたユーザー証明書です。彼らは無料の証明書を提供し、必要に応じて失効の料金を請求します (費用がかかるため)。これは、取り消しを前もって請求し、必要がなければポケットに入れる他の CA とは正反対です ;)
1 つ目は X509 証明書です。

2 つ目は Gutmann を使用した証明書のダンプですdumpasn1
(www.cs.auckland.ac.nz/~pgut001 から dumpasn1.c と dumpasn1.cfg を取得し、 でコンパイルしgcc dumpasn1.c -o dumpasn1
、 にコピーします/usr/local/bin
)。rfc822:
またはemail:
プレフィックスがないことに注意してください。
