1

特定の構造を尊重するように、証明書要求 ( CSR ) に拡張機能を追加する必要があります。つまりこれASN.1 構造

左側は、チャレンジ パスワードを尊重する必要がある構造です。右側は、チャレンジ パスワードの OID 値から OID オブジェクトを単純に生成し、これらすべてを PKCS10 要求の拡張リストに直接埋め込んだときに得られる構造です。

CObjectId cp_oid = new CObjectId();

// OID 1.2.840.113549.1.9.7
// cp_oid.InitializeFromName(CERTENROLL_OBJECTID.XCN_OID_RSA_challengePwd);
cp_oid.InitializeFromValue("1.2.840.113549.1.9.7");

次に、CX509Extension オブジェクトを作成し、OID を PKCS10 要求に追加します。

CX509Extension extension = new CX509Extension();
string b64__challengePassword=System.Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(this.challengePassword));

extension.Initialize(cp_oid, EncodingType.XCN_CRYPT_STRING_BASE64_ANY, b64__challengePassword);
_certificateRequest.X509Extensions.Add(extension);

その構造は私が取得しなければならないものとは明らかに異なるため (前の図の右側を参照)、より洗練されたアプローチを使用しています。

_certificateRequest = new CX509CertificateRequestPkcs10();
_certificateRequest.InitializeFromPrivateKey(X509CertificateEnrollmentContext.ContextUser, (CX509PrivateKey)_privateKey, null);
_certificateRequest.Subject = (CX500DistinguishedName)_subjectName;

CObjectIds cp_oids = new CObjectIds();

CObjectId cp_oid = new CObjectId();
// OID 1.2.840.113549.1.9.7
// cp_oid.InitializeFromName(CERTENROLL_OBJECTID.XCN_OID_RSA_challengePwd);
cp_oid.InitializeFromValue("1.2.840.113549.1.9.7");

CX509Extension _extension = new CX509Extension();

cp_oids.Add(cp_oid);

//now how do I add that oid list to the 1.2.840.113549.1.9.14 OID ?
//I try with CX509ExtensionEnhancedKeyUsage instead of a simple CX509Extension
//which one of all these is the correct extensions?
/*
 *  IX509ExtensionAlternativeNames          Specifies one or more alternative name forms for the subject of a certificate.
    IX509ExtensionAuthorityKeyIdentifier    Represents an AuthorityKeyIdentifier extension.
    IX509ExtensionBasicConstraints          Specifies whether the certificate subject is a certification authority and, if so, the depth of the subordinate certification authority chain.
    IX509ExtensionCertificatePolicies        Represents a collection of policy information terms.
    IX509ExtensionMSApplicationPolicies     Represents a collection of object identifiers that indicate how a certificate can be used by an application.
    IX509ExtensionEnhancedKeyUsage            Represents a collection of object identifiers that identify the intended uses of the public key contained in a certificate.
    IX509ExtensionKeyUsage                    Represents restrictions on the operations that can be performed by the public key contained in the certificate.
    IX509Extensions                         Manages a collection of IX509Extension objects.
    IX509ExtensionSmimeCapabilities            Represents a collection that reports the decryption capabilities of an email recipient to an email sender.
    IX509ExtensionSubjectKeyIdentifier        Represents a SubjectKeyIdentifier extension used to identify a signing certificate.
    IX509ExtensionTemplate                    Represents a CertificateTemplate extension that contains a version 2 template.
    IX509ExtensionTemplateName                Represents a CertificateTemplateName extension that contains a version 1 template.
                 */

CX509ExtensionEnhancedKeyUsage eku = new CX509ExtensionEnhancedKeyUsage();
eku.InitializeEncode(cp_oids);
eku.Critical = false;

CX509AttributeExtensions InitExt = new CX509AttributeExtensions();

//  Add the extension objects into an IX509Extensions collection.
CX509Extensions ext1 = new CX509Extensions();
ext1.Add((CX509Extension)eku);
//  Use the IX509Extensions collection//to initialize an IX509AttributeExtensions object.
CX509AttributeExtensions ext1att = new CX509AttributeExtensions();
ext1att.InitializeEncode(ext1);

//Add the IX509AttributeExtensions object to an IX509Attributes collection.
CX509Attributes att1 = new CX509Attributes();
att1.Add((CX509Attribute)ext1att);

//Use the IX509Attributes collection to initialize an ICryptAttribute object.
CCryptAttribute crypt1 = new CCryptAttribute();
crypt1.InitializeFromValues(att1);

//Initialize a CMC or PKCS #10 request object and retrieve the ICryptAttributes collection.


//Add the ICryptAttribute object to the ICryptAttributes collection for the request.
_certificateRequest.CryptAttributes.Add(crypt1);

//Console.WriteLine("-- encode");
this.status2 = this.status2 + "-- encode <BR>";


try
{
    _certificateRequest.Encode();
}
catch (Exception ex)
{
    Console.WriteLine(ex.ToString());
}

string rawData = _certificateRequest.get_RawData();

Console.WriteLine("data=" + rawData);

ただし、リクエストをエンコードするときに、プロセスの最後に「ファイルが存在します。(HRESULT からの例外: 0x80070050)」という不可解なエラーが表示されます。

このチャレンジパスワード拡張を追加するための私のアプローチは正しいですか?このエラーをどのように解釈できますか?

4

2 に答える 2

2

「ファイルが存在します。(HRESULT からの例外: 0x80070050)」というエラーに対する答えは、既にキーを持つテンプレートにキーを設定しようとしているためです。これをコメントするだけです:

    CX509ExtensionEnhancedKeyUsage eku = new CX509ExtensionEnhancedKeyUsage();
    eku.InitializeEncode(cp_oids);
    eku.Critical = false;

    CX509AttributeExtensions InitExt = new CX509AttributeExtensions();


  //  Add the extension objects into an IX509Extensions collection.
    CX509Extensions ext1= new CX509Extensions();
    ext1.Add((CX509Extension)eku);

そしてそれはうまくいくはずです。


C#を介した Active Directory 証明書サービスの操作の記事でこれを検索します。

終了したようですが、実行しただけでは、いくつかの拡張機能を追加するときにファイルが存在するという例外がスローされます。

それはすべてを説明します。


記事から:

例外メッセージは少しわかりにくいかもしれません。実際、これは、証明書テンプレートで定義されていたものを定義したためです。ソース コードを詳しく調べると、キー使用法拡張を追加したときに例外が発生したことがわかります。

CA サーバーに戻り、使用しているテンプレートを開くと、キーの使用法がテンプレートで定義されていることがわかります。これは、コードまたは証明書要求で、再度指定しないことを意味します。

したがって、キー使用法を追加するコードにコメントを付ける必要があります。また、拡張されたキー使用法部分もテンプレートで定義されているため、コメントする必要があります。リクエストでサブジェクト名を提供するため、ここでもリクエストでサブジェクト情報を指定できます。リクエストメッセージの生成方法はこのようになります。

于 2014-09-30T10:41:50.080 に答える