7

ちょっとした背景: 私はM2Crypto と Django を使用して認証局を構築しているので、投票する前によく考えて、これを話題から外してください! :)

私のアプローチは、エンドユーザーは電子メールアドレスで識別され、自己署名されたトラストアンカーは明らかに自分自身で発行されるというものですが、どのように「ID」を保存する必要がありますか?

メールアドレスを. _ _ _subjectAltName = rfc822:user@domain.testsubjectAltName = email:user@domain.test

2つに違いはありますか?もしそうなら、どちらが好まれますか?

4

1 に答える 1

7

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:プレフィックスがないことに注意してください。

ここに画像の説明を入力

于 2013-12-19T00:37:23.197 に答える