4

X509Enrollment.CX509CertificateRequestPkcs10オブジェクトのInitializeFromPrivateKey()でテンプレート パラメーターを指定すると問題が発生します。「ユーザー」のテンプレート以外のものは、次の例外になります:-

CertEnroll::CX509CertificateRequestPkcs10::InitializeFromPrivateKey: 要求された証明書テンプレートは、この CA ではサポートされていません。0x80094800 (-2146875392)

使用する必要がある特定の証明書テンプレートがあり、それを試すとコードが例外をスローします。テンプレートは、CA と、次のコードを実行しているクライアント マシンに存在します。

Javascript コードは次のとおりです。

 <script type="text/javascript">

     var sCertificate = null;
     var sDistinguishedName = "C=\"\";S=\"\";L=\"\";O=\"XXXXX\";OU=\"XXXXXXX\";E=\"XXXXX@XXXX.com\";CN=\"xxxxxxx\";";
     var template = "RegistrationCert"; //Anything Other than "User" fails, have tried template Oid too.

     var classFactory = new ActiveXObject("X509Enrollment.CX509EnrollmentWebClassFactory");
     var objEnroll = classFactory.CreateObject("X509Enrollment.CX509Enrollment");
     var objPrivateKey = classFactory.CreateObject("X509Enrollment.CX509PrivateKey");
     var objRequest = classFactory.CreateObject("X509Enrollment.CX509CertificateRequestPkcs10");
     var objDN = classFactory.CreateObject("X509Enrollment.CX500DistinguishedName");

     objPrivateKey.ProviderName = "Microsoft Enhanced Cryptographic Provider v1.0";
     objPrivateKey.KeySpec = "1";
     objPrivateKey.ProviderType = "1";

    try 
    {
            objRequest.InitializeFromPrivateKey(1, objPrivateKey, template);
            objDN.Encode(sDistinguishedName, 0);
            objRequest.Subject = objDN;
            objEnroll.InitializeFromRequest(objRequest);
            sCertificate = objEnroll.CreateRequest(1);
            document.writeln(sCertificate);
    }
    catch (ex)
    {
             document.writeln(ex.description);
    }
 </script>

他のいくつかの質問
- テンプレートがクライアント マシンに存在する必要があると思いますか? そうでなければ、テンプレートを照会する CA の場所をどのように知るのでしょうか?
- クライアント上の CertEnroll は、Windows 2003 CA サーバーに対しても機能しますか??

あなたが私を助けることができれば、それは大歓迎です!!!

追加情報
- クライアントは Windows 7 で、MS IE9 クライアントが管理者として実行されています。
- 上記のページをホストする Web アプリは、HTTPs 経由でアクセスされます。
- Web アプリは Win2003 CA サーバーでホストされています。

投稿する前に私が見た... -
CertEnroll + InitializeFromPrivateKey に関する Stackoverflow スレッド-テンプレート名ではなくテンプレート OID の使用に関するブログ - MSDN / alejacma のサイト - MSDN の CertEnroll API


4

2 に答える 2

5

わかりました、それでそれを考えました..典型的です。

  • CX509ExtensionTemplateNameを使用し、OIDテンプレート値でInitializeEncodeを呼び出します
  • InitializeFromPrivateKeyでテンプレート パラメータを指定しないでください。

すなわち:

var objExtensionTemplate = classFactory.CreateObject("X509Enrollment.CX509ExtensionTemplateName")


objRequest.InitializeFromPrivateKey(1, objPrivateKey, ""); //empty string, don't specify template here
objExtensionTemplate.InitializeEncode(template); //Specify Template as OID value!
objRequest.X509Extensions.Add(objExtensionTemplate);

要求が指定したテンプレート タイプに対するものであることを CA で確認し、実際にそのタイプの証明書のみを作成します。

これがいつか誰かに役立つことを願っています。

于 2011-08-06T07:36:57.883 に答える
1

See also this code, where I'm using a newer DLL that doesn't include the methods you're using. I also am not using the "interop types" which cause issues when deploying or building the code.

 CObjectId EkuOid = new CObjectId();
        EkuOid.InitializeFromValue("1.3.6.1.4.1.311.21.8.4946465.16405226.12930948.10533807.2139545.33.5005369.11644649");
        CObjectIds EkuOids = new CObjectIds();
        EkuOids.Add(EkuOid);
        CX509ExtensionEnhancedKeyUsage eku = new CX509ExtensionEnhancedKeyUsage();
        eku.InitializeEncode(EkuOids);
        eku.Critical = false;
        objPkcs10.X509Extensions.Add((CX509Extension)eku);

The OID can be obtained using this method on serverfault

Alternate implementations of this code (VBS, C#, etc) is located here.

于 2014-07-03T22:10:45.623 に答える