<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Decrypt my World : CertEnroll</title><link>http://blogs.msdn.com/alejacma/archive/tags/CertEnroll/default.aspx</link><description>Tags: CertEnroll</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>CertEnroll::CX509Enrollment::p_CreateRequest returns error 0x8009000b</title><link>http://blogs.msdn.com/alejacma/archive/2009/05/28/certenroll-cx509enrollment-p-createrequest-returns-error-0x8009000b.aspx</link><pubDate>Thu, 28 May 2009 13:36:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9646751</guid><dc:creator>alejacma</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/alejacma/comments/9646751.aspx</comments><wfw:commentRss>http://blogs.msdn.com/alejacma/commentrss.aspx?PostID=9646751</wfw:commentRss><description>&lt;P&gt;Hi all,&lt;/P&gt;
&lt;P&gt;One of the issues we may find when trying the code in my post &lt;A href="http://blogs.msdn.com/alejacma/archive/2009/05/27/how-to-create-a-certificate-request-that-uses-key-archival-with-certenroll-javascript.aspx" mce_href="http://blogs.msdn.com/alejacma/archive/2009/05/27/how-to-create-a-certificate-request-that-uses-key-archival-with-certenroll-javascript.aspx"&gt;&lt;FONT color=#006ff7&gt;How to create a certificate request that uses key archival with CertEnroll (JavaScript)&lt;/FONT&gt;&lt;/A&gt;&amp;nbsp;is the following &lt;STRONG&gt;error&lt;/STRONG&gt; when creating the request:&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&lt;STRONG&gt;CertEnroll::CX509Enrollment::p_CreateRequest: Key not valid for use in specified state. 0x8009000b (-2146893813)&lt;/STRONG&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P mce_keep="true"&gt;If the &lt;STRONG&gt;issue&lt;/STRONG&gt; happens on &lt;STRONG&gt;Vista RTM&lt;/STRONG&gt; but &lt;STRONG&gt;not&lt;/STRONG&gt; on &lt;STRONG&gt;Vista SP1/Server 2008&lt;/STRONG&gt;&amp;nbsp;or later, then this may be the issue:&lt;/P&gt;
&lt;P mce_keep="true"&gt;When &lt;STRONG&gt;CertEnroll&lt;/STRONG&gt; creates the request, it needs to &lt;STRONG&gt;export&lt;/STRONG&gt; the &lt;STRONG&gt;private key&lt;/STRONG&gt; of the &lt;STRONG&gt;certificate&lt;/STRONG&gt; we are requesting to encode it so we can send it to the CA for &lt;STRONG&gt;key archival&lt;/STRONG&gt;. This operation will fail if the key doesn't have at least one of these flags: &lt;STRONG&gt;CRYPT_EXPORTABLE&lt;/STRONG&gt; or &lt;STRONG&gt;CRYPT_ARCHIVABLE&lt;/STRONG&gt;. These are flags that CertEnroll should pass to &lt;A href="http://msdn.microsoft.com/en-us/library/aa379941(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/aa379941(VS.85).aspx"&gt;CryptGenKey&lt;/A&gt; API when generating the key under the hood.&lt;/P&gt;
&lt;P&gt;Those flags are calculated from &lt;A href="http://msdn.microsoft.com/en-us/library/aa379002(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/aa379002(VS.85).aspx"&gt;ExportPolicy&lt;/A&gt;&amp;nbsp;field of the &lt;STRONG&gt;X509Enrollment.CX509PrivateKey&lt;/STRONG&gt; object. If we specify &lt;STRONG&gt;XCN_NCRYPT_ALLOW_EXPORT_FLAG or XCN_NCRYPT_ALLOW_PLAINTEXT_EXPORT_FLAG&lt;/STRONG&gt;, we get the key created with &lt;STRONG&gt;CRYPT_EXPORTABLE&lt;/STRONG&gt; flag, and if we specify &lt;STRONG&gt;XCN_NCRYPT_ALLOW_ARCHIVING_FLAG or XCN_NCRYPT_ALLOW_PLAINTEXT_ARCHIVING_FLAG&lt;/STRONG&gt;, we get the key created with &lt;STRONG&gt;CRYPT_ARCHIVABLE&lt;/STRONG&gt; flag.&lt;/P&gt;
&lt;P&gt;On &lt;STRONG&gt;Vista SP1/2008 Server&lt;/STRONG&gt; and later, &lt;STRONG&gt;XCN_NCRYPT_ALLOW_ARCHIVING_FLAG&lt;/STRONG&gt; is being set by &lt;STRONG&gt;default&lt;/STRONG&gt;. This won't happen on &lt;STRONG&gt;Vista RTM&lt;/STRONG&gt;, so setting &lt;STRONG&gt;ExportPolicy&lt;/STRONG&gt; to &lt;STRONG&gt;XCN_NCRYPT_ALLOW_ARCHIVING_FLAG (0x4)&lt;/STRONG&gt; should make things work there. Or even better, &lt;STRONG&gt;update to Vista SP2&lt;/STRONG&gt;, and you forget about this and many other issues ;-)&lt;/P&gt;
&lt;P&gt;I hope this helps.&lt;/P&gt;
&lt;P&gt;Regards,&lt;/P&gt;
&lt;P&gt;Alex (Alejandro Campos Magencio)&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9646751" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/alejacma/archive/tags/CertEnroll/default.aspx">CertEnroll</category></item><item><title>CertEnroll::CX509Enrollment::p_CreateRequest returns error 0x80092012</title><link>http://blogs.msdn.com/alejacma/archive/2009/05/28/certenroll-cx509enrollment-p-createrequest-returns-error-0x80092012.aspx</link><pubDate>Thu, 28 May 2009 13:10:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9646708</guid><dc:creator>alejacma</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/alejacma/comments/9646708.aspx</comments><wfw:commentRss>http://blogs.msdn.com/alejacma/commentrss.aspx?PostID=9646708</wfw:commentRss><description>&lt;P&gt;Hi all,&lt;/P&gt;
&lt;P&gt;One of the issues we may find when trying the code in my post &lt;A href="http://blogs.msdn.com/alejacma/archive/2009/05/27/how-to-create-a-certificate-request-that-uses-key-archival-with-certenroll-javascript.aspx" mce_href="http://blogs.msdn.com/alejacma/archive/2009/05/27/how-to-create-a-certificate-request-that-uses-key-archival-with-certenroll-javascript.aspx"&gt;&lt;FONT color=#006ff7&gt;How to create a certificate request that uses key archival with CertEnroll (JavaScript)&lt;/FONT&gt;&lt;/A&gt;&amp;nbsp;is the following &lt;STRONG&gt;error&lt;/STRONG&gt; when creating the request:&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&lt;STRONG&gt;CertEnroll::CX509Enrollment::p_CreateRequest: The revocation function was unable to check revocation for the certificate. 0x80092012 (-2146885614)&lt;/STRONG&gt;&lt;/EM&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;This error will happen if the &lt;STRONG&gt;CRL&lt;/STRONG&gt; of the certificate passed to the&amp;nbsp;&lt;STRONG&gt;KeyArchivalCertificate&lt;/STRONG&gt; property of the &lt;STRONG&gt;CMC request&lt;/STRONG&gt; &lt;STRONG&gt;can't be accessed&lt;/STRONG&gt;.&amp;nbsp;One reason for instance&amp;nbsp;may be that the certificate is just missing a CRL distribution point.&lt;/P&gt;
&lt;P&gt;We can &lt;STRONG&gt;check&lt;/STRONG&gt; if we can properly download the CRL of a certificate with the following command: &lt;BR&gt;&lt;BR&gt;&lt;EM&gt;&lt;STRONG&gt;certutil -url certificate.cer&lt;/STRONG&gt;&lt;/EM&gt;&lt;BR&gt;&lt;BR&gt;A &lt;STRONG&gt;URL Retrieval Tool&lt;/STRONG&gt; will appear for that certificate. We can select "&lt;EM&gt;CRLs (from CDP)&lt;/EM&gt;" in the "&lt;EM&gt;Retrieve&lt;/EM&gt;" section and press the "&lt;EM&gt;Retrieve&lt;/EM&gt;" button. This tool will check if we can access the CRL or not.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Note: check this post if you need to &lt;STRONG&gt;clear &lt;/STRONG&gt;the &lt;STRONG&gt;CRL cache&lt;/STRONG&gt;: &lt;A href="http://blogs.msdn.com/alejacma/archive/2009/01/30/crl-gets-cached-after-we-do-an-online-verification-with-x509chain.aspx" mce_href="http://blogs.msdn.com/alejacma/archive/2009/01/30/crl-gets-cached-after-we-do-an-online-verification-with-x509chain.aspx"&gt;CRL gets cached after we do an Online verification with X509Chain&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;I hope this helps.&lt;/P&gt;
&lt;P&gt;Regards,&lt;/P&gt;
&lt;P&gt;Alex (Alejandro Campos Magencio)&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9646708" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/alejacma/archive/tags/CertEnroll/default.aspx">CertEnroll</category></item><item><title>CertEnroll::CX509Enrollment::p_CreateRequest returns error 0x800b0112</title><link>http://blogs.msdn.com/alejacma/archive/2009/05/28/certenroll-cx509enrollment-p-createrequest-returns-error-0x800b0112.aspx</link><pubDate>Thu, 28 May 2009 12:44:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9646691</guid><dc:creator>alejacma</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/alejacma/comments/9646691.aspx</comments><wfw:commentRss>http://blogs.msdn.com/alejacma/commentrss.aspx?PostID=9646691</wfw:commentRss><description>&lt;P&gt;Hi all,&lt;/P&gt;
&lt;P&gt;One of the issues we may find when trying the code in my post &lt;A href="http://blogs.msdn.com/alejacma/archive/2009/05/27/how-to-create-a-certificate-request-that-uses-key-archival-with-certenroll-javascript.aspx" mce_href="http://blogs.msdn.com/alejacma/archive/2009/05/27/how-to-create-a-certificate-request-that-uses-key-archival-with-certenroll-javascript.aspx"&gt;&lt;FONT color=#006ff7&gt;How to create a certificate request that uses key archival with CertEnroll (JavaScript)&lt;/FONT&gt;&lt;/A&gt;&amp;nbsp;is the following &lt;STRONG&gt;error&lt;/STRONG&gt; when creating the request:&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&lt;STRONG&gt;CertEnroll::CX509Enrollment::p_CreateRequest: A certification chain processed correctly, but one of the CA certificates is not trusted by the policy provider. 0x800b0112 (-2146762478)&lt;/STRONG&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;This issue can occur if the &lt;STRONG&gt;CA certificate&lt;/STRONG&gt; is not in client's&lt;STRONG&gt; Enterprise NTAuth store&lt;/STRONG&gt;. The local NTAuth store can be manually populated using the utility certutil.exe:&lt;BR&gt;&lt;BR&gt;&lt;EM&gt;&lt;STRONG&gt;Certutil -enterprise -addstore NTAuth CaCertificate.cer&lt;BR&gt;&lt;/STRONG&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;More info here:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://support.microsoft.com/kb/295663" mce_href="http://support.microsoft.com/kb/295663"&gt;How to import third-party certification authority (CA) certificates into the Enterprise NTAuth store&lt;/A&gt;&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;I hope this helps.&lt;/P&gt;
&lt;P&gt;Regards,&lt;/P&gt;
&lt;P&gt;Alex (Alejandro Campos Magencio)&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9646691" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/alejacma/archive/tags/CertEnroll/default.aspx">CertEnroll</category></item><item><title>CertEnroll::CX509Enrollment::p_CreateRequest returns error 0x80070057</title><link>http://blogs.msdn.com/alejacma/archive/2009/05/28/certenroll-cx509enrollment-p-createrequest-returns-error-0x80070057.aspx</link><pubDate>Thu, 28 May 2009 12:22:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9646640</guid><dc:creator>alejacma</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/alejacma/comments/9646640.aspx</comments><wfw:commentRss>http://blogs.msdn.com/alejacma/commentrss.aspx?PostID=9646640</wfw:commentRss><description>&lt;P&gt;Hi all,&lt;/P&gt;
&lt;P&gt;One of the issues we may find when trying the code in my post &lt;A href="http://blogs.msdn.com/alejacma/archive/2009/05/27/how-to-create-a-certificate-request-that-uses-key-archival-with-certenroll-javascript.aspx" mce_href="http://blogs.msdn.com/alejacma/archive/2009/05/27/how-to-create-a-certificate-request-that-uses-key-archival-with-certenroll-javascript.aspx"&gt;&lt;FONT color=#006ff7&gt;How to create a certificate request that uses key archival with CertEnroll (JavaScript)&lt;/FONT&gt;&lt;/A&gt;&amp;nbsp;is the following &lt;STRONG&gt;error&lt;/STRONG&gt; when creating the request:&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&lt;STRONG&gt;CertEnroll::CX509Enrollment::p_CreateRequest: The parameter is incorrect. 0x80070057 (WIN32: 87)&lt;/STRONG&gt;&lt;/EM&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;In my case I was getting this error because I was &lt;STRONG&gt;not using&lt;/STRONG&gt; the &lt;STRONG&gt;right certificate&lt;/STRONG&gt; as&amp;nbsp;&lt;STRONG&gt;KeyArchivalCertificate&lt;/STRONG&gt; property of the &lt;STRONG&gt;CMC request&lt;/STRONG&gt;. When I first tried the code I set that property to the &lt;STRONG&gt;Key Recovery Agent Certificate&lt;/STRONG&gt; that I had configured in my CA, and I got the error. No, that is not the certificate we have to use. We have to set that property to the &lt;STRONG&gt;Exchange Certificate of the CA&lt;/STRONG&gt; itself. &lt;/P&gt;
&lt;P&gt;Additionally, the &lt;STRONG&gt;Subject Name&lt;/STRONG&gt; &lt;STRONG&gt;of the certificate has to&lt;/STRONG&gt; &lt;STRONG&gt;match&lt;/STRONG&gt; &lt;STRONG&gt;Issuer Name + "-Xchg".&lt;/STRONG&gt; For example, if cert issuer is "&lt;EM&gt;MyCAServer&lt;/EM&gt;", the expected subject name is "&lt;EM&gt;MyCAServer-Xchg&lt;/EM&gt;". The subject name of our Key Recovery Agent Certificate won't match that, but the Exchange cert of our CA will.&lt;/P&gt;
&lt;P&gt;We can &lt;STRONG&gt;export &lt;/STRONG&gt;the &lt;STRONG&gt;Exchange Certificate&lt;/STRONG&gt; of a MS CA with the following command:&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&lt;STRONG&gt;certutil -cainfo xchg &amp;gt; xchg.cer&lt;/STRONG&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;And then we can use the &lt;STRONG&gt;Base64&lt;/STRONG&gt; text of that &lt;STRONG&gt;.cer&lt;/STRONG&gt; file in our code. &lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I hope this helps.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Regards,&lt;/P&gt;
&lt;P&gt;Alex (Alejandro Campos Magencio)&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9646640" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/alejacma/archive/tags/CertEnroll/default.aspx">CertEnroll</category></item><item><title>CertEnroll::CX509Enrollment::p_InstallResponse returns error 0x80095002</title><link>http://blogs.msdn.com/alejacma/archive/2009/05/28/certenroll-cx509enrollment-p-installresponse-returns-error-0x80095002.aspx</link><pubDate>Thu, 28 May 2009 11:46:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9646557</guid><dc:creator>alejacma</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/alejacma/comments/9646557.aspx</comments><wfw:commentRss>http://blogs.msdn.com/alejacma/commentrss.aspx?PostID=9646557</wfw:commentRss><description>&lt;P&gt;Hi all,&lt;/P&gt;
&lt;P&gt;One of the issues we may find when trying the code in my post &lt;A href="http://blogs.msdn.com/alejacma/archive/2009/05/27/how-to-create-a-certificate-request-that-uses-key-archival-with-certenroll-javascript.aspx" mce_href="http://blogs.msdn.com/alejacma/archive/2009/05/27/how-to-create-a-certificate-request-that-uses-key-archival-with-certenroll-javascript.aspx"&gt;How to create a certificate request that uses key archival with CertEnroll (JavaScript)&lt;/A&gt;&amp;nbsp;is the following:&lt;/P&gt;
&lt;P&gt;Imagine we could finally &lt;STRONG&gt;create&lt;/STRONG&gt; a &lt;STRONG&gt;request&lt;/STRONG&gt; successfully. We &lt;STRONG&gt;sent&lt;/STRONG&gt; it &lt;STRONG&gt;to&lt;/STRONG&gt; the &lt;STRONG&gt;CA&lt;/STRONG&gt; and then we tried to &lt;STRONG&gt;install&lt;/STRONG&gt; its &lt;STRONG&gt;response &lt;/STRONG&gt;(the &lt;STRONG&gt;.cer&lt;/STRONG&gt;&amp;nbsp;or the&amp;nbsp;&lt;STRONG&gt;.p7b &lt;/STRONG&gt;files that we got from the CA)&amp;nbsp;with i.e.&amp;nbsp;the code in &lt;A href="http://blogs.msdn.com/alejacma/archive/2009/02/20/how-to-create-a-certificate-request-with-certenroll-asp.aspx" mce_href="http://blogs.msdn.com/alejacma/archive/2009/02/20/how-to-create-a-certificate-request-with-certenroll-asp.aspx"&gt;How to create a certificate request with CertEnroll (ASP)&lt;/A&gt;.&amp;nbsp;But we got&amp;nbsp;the following &lt;STRONG&gt;error&lt;/STRONG&gt;:&lt;BR&gt;&lt;BR&gt;&lt;EM&gt;&lt;STRONG&gt;CertEnroll::CX509Enrollment::p_InstallResponse: The key archival hash attribute was not found in the response. 0x80095002 (-2146873342)&lt;BR&gt;&lt;/STRONG&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;We assume that the code we used to create the request works fine, because the CA accepts the request, it enrolls the certificate and give us the response, and we can see the key is archived in the CA. So the issue may have to do with the response of the CA that we try to install. What's going on then?&lt;/P&gt;
&lt;P mce_keep="true"&gt;Well, the issue in my case was that I was getting the &lt;STRONG&gt;response&lt;/STRONG&gt; with the &lt;STRONG&gt;Certificate Services web pages&lt;/STRONG&gt; of my &lt;STRONG&gt;Microsoft CA&lt;/STRONG&gt;, and those pages&amp;nbsp;can &lt;STRONG&gt;only return&lt;/STRONG&gt; as a response the issued &lt;STRONG&gt;raw certificate&lt;/STRONG&gt; (&lt;STRONG&gt;.cer&lt;/STRONG&gt; file) or a &lt;STRONG&gt;pkcs7&lt;/STRONG&gt; package including it (&lt;STRONG&gt;.p7b&lt;/STRONG&gt; file). But neither of them contains the &lt;STRONG&gt;Full Response&lt;/STRONG&gt; of the CA. This is required for key archival because the full response is a&lt;STRONG&gt; pkcs7 signed by the CA with CMC content&lt;/STRONG&gt;. The CMC content contains an attribute that the client uses to verify the CA received the correct encrypted private key in the request (prevents man-in-the-middle key stealing attacks).&lt;/P&gt;
&lt;P&gt;Summing up, .cer or .p7b files won't suffice for key archival enrollment.&lt;/P&gt;
&lt;P&gt;So I used &lt;STRONG&gt;certreq.exe&lt;/STRONG&gt; tool to send the request to my CA and get the full response from it:&lt;BR&gt;&lt;BR&gt;&lt;EM&gt;&lt;STRONG&gt;certreq &lt;/STRONG&gt;-submit -attrib "&lt;STRONG&gt;CertificateTemplate:ArchiveUser&lt;/STRONG&gt;" keyarchival.req keyarchival.cer keyarchival.p7b &lt;STRONG&gt;keyarchival.rsp&lt;BR&gt;&lt;/STRONG&gt;&lt;/EM&gt;&lt;BR&gt;Note: &lt;STRONG&gt;ArchiveUser&lt;/STRONG&gt; is the &lt;STRONG&gt;certificate template&lt;/STRONG&gt; where I enabled &lt;STRONG&gt;key archival&lt;/STRONG&gt; on my CA.&lt;/P&gt;
&lt;P&gt;Then I took keyarchival.rsp and passed it to my sample and it worked just fine. I could install the response successfully.&lt;/P&gt;
&lt;P&gt;More info on certreq.exe here: &lt;A href="http://technet.microsoft.com/en-us/library/cc780371.aspx" mce_href="http://technet.microsoft.com/en-us/library/cc780371.aspx"&gt;Appendix A: Certificate Request Structure&lt;/A&gt;&amp;nbsp;and here: &lt;A href="http://technet.microsoft.com/en-us/library/cc736326.aspx" mce_href="http://technet.microsoft.com/en-us/library/cc736326.aspx"&gt;Appendix 3: Certreq.exe Syntax&lt;/A&gt;.&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;I hope this helps.&lt;/P&gt;
&lt;P&gt;Regards,&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Alex (Alejandro Campos Magencio)&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9646557" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/alejacma/archive/tags/CertEnroll/default.aspx">CertEnroll</category></item><item><title>How to create a certificate request that uses key archival with CertEnroll (JavaScript)</title><link>http://blogs.msdn.com/alejacma/archive/2009/05/27/how-to-create-a-certificate-request-that-uses-key-archival-with-certenroll-javascript.aspx</link><pubDate>Wed, 27 May 2009 18:42:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9644581</guid><dc:creator>alejacma</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/alejacma/comments/9644581.aspx</comments><wfw:commentRss>http://blogs.msdn.com/alejacma/commentrss.aspx?PostID=9644581</wfw:commentRss><description>&lt;P&gt;Hi all,&lt;/P&gt;
&lt;P&gt;If you want to &lt;STRONG&gt;request&lt;/STRONG&gt; &lt;STRONG&gt;certificates&lt;/STRONG&gt; to a &lt;STRONG&gt;CA&lt;/STRONG&gt; and make use of &lt;STRONG&gt;Key Archival&lt;/STRONG&gt; feature, first you need to &lt;STRONG&gt;prepare the environment&lt;/STRONG&gt; to enable this feature on your CA: &lt;A href="http://technet.microsoft.com/en-us/library/cc781351.aspx" mce_href="http://technet.microsoft.com/en-us/library/cc781351.aspx"&gt;Certificate Services example implementation: Key archival and recovery&lt;/A&gt;&amp;nbsp;or &lt;A href="http://technet.microsoft.com/en-us/library/cc738977.aspx" mce_href="http://technet.microsoft.com/en-us/library/cc738977.aspx"&gt;Implementing Key Archival Walkthrough&lt;/A&gt;&amp;nbsp;will be of assistance here.&lt;/P&gt;
&lt;P&gt;After that you could use a code like the following &lt;STRONG&gt;sample&lt;/STRONG&gt;&amp;nbsp;to make the &lt;STRONG&gt;request&lt;/STRONG&gt; with &lt;STRONG&gt;CertEnroll&lt;/STRONG&gt; (based on &lt;A href="http://blogs.msdn.com/alejacma/archive/2009/01/28/how-to-create-a-certificate-request-with-certenroll-javascript.aspx" mce_href="http://blogs.msdn.com/alejacma/archive/2009/01/28/how-to-create-a-certificate-request-with-certenroll-javascript.aspx"&gt;How to create a certificate request with CertEnroll (JavaScript)&lt;/A&gt; sample):&lt;/P&gt;&lt;PRE&gt;&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;Certificate Request test&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt; 
  &amp;lt;object id="objCertEnrollClassFactory" classid="clsid:884e2049-217d-11da-b2a4-000e7bbb2b09"&amp;gt;&amp;lt;/object&amp;gt;    
  &amp;lt;script language="javascript"&amp;gt;

    function CreateRequest() 
    {
      document.write("&amp;lt;br&amp;gt;Create Request...");                      

      try {
        // Variables
        var objCSP = objCertEnrollClassFactory.CreateObject("X509Enrollment.CCspInformation");
        var objCSPs = objCertEnrollClassFactory.CreateObject("X509Enrollment.CCspInformations");
        var objPrivateKey = objCertEnrollClassFactory.CreateObject("X509Enrollment.CX509PrivateKey");
        var objRequest = objCertEnrollClassFactory.CreateObject("X509Enrollment.CX509CertificateRequestPkcs10");
        var objCmcRequest = objCertEnrollClassFactory.CreateObject("&lt;STRONG&gt;X509Enrollment.CX509CertificateRequestCmc&lt;/STRONG&gt;");
        var objObjectIds = objCertEnrollClassFactory.CreateObject("X509Enrollment.CObjectIds");
        var objObjectId = objCertEnrollClassFactory.CreateObject("X509Enrollment.CObjectId");
        var objX509ExtensionEnhancedKeyUsage = objCertEnrollClassFactory.CreateObject("X509Enrollment.CX509ExtensionEnhancedKeyUsage");
        var objExtensionTemplate = objCertEnrollClassFactory.CreateObject("X509Enrollment.CX509ExtensionTemplateName");
        var objDn = objCertEnrollClassFactory.CreateObject("X509Enrollment.CX500DistinguishedName");
        var objEnroll = objCertEnrollClassFactory.CreateObject("X509Enrollment.CX509Enrollment");

        //  Initialize the csp object using the desired Cryptograhic Service Provider (CSP)
        objCSP.InitializeFromName("Microsoft Enhanced Cryptographic Provider v1.0");

        //  Add this CSP object to the CSP collection object
        objCSPs.Add(objCSP);

        //  Provide key container name, key length and key spec to the private key object
        //objPrivateKey.ContainerName = "AlejaCMa";
        objPrivateKey.Length = 1024;
        objPrivateKey.KeySpec = 1; // AT_KEYEXCHANGE = 1
        //objPrivateKey.ExportPolicy = 0; // XCN_NCRYPT_ALLOW_EXPORT_NONE = 0

        //  Provide the CSP collection object (in this case containing only 1 CSP object)
        //  to the private key object
        objPrivateKey.CspInformations = objCSPs;

        // Initialize P10 based on private key
        objRequest.InitializeFromPrivateKey(1, objPrivateKey, ""); // context user = 1

        // 1.3.6.1.5.5.7.3.2 Oid - Extension
        objObjectId.InitializeFromValue("1.3.6.1.5.5.7.3.2");
        objObjectIds.Add(objObjectId);
        objX509ExtensionEnhancedKeyUsage.InitializeEncode(objObjectIds);
        objRequest.X509Extensions.Add(objX509ExtensionEnhancedKeyUsage);

        // 1.3.6.1.5.5.7.3.3 Oid - Extension
        //objExtensionTemplate.InitializeEncode("1.3.6.1.5.5.7.3.3");
        //objRequest.X509Extensions.Add(objExtensionTemplate);

        // DN related stuff
        objDn.Encode("CN=alejacma", 0); // XCN_CERT_NAME_STR_NONE = 0
        objRequest.Subject = objDn;

        // Enroll
        objCmcRequest.&lt;STRONG&gt;InitializeFromInnerRequest&lt;/STRONG&gt;(objRequest);
        objCmcRequest.&lt;STRONG&gt;KeyArchivalCertificate&lt;/STRONG&gt; = 
      "MIIFxDCCBKygAwIBAgIKG2cmPwAAAAAADDANBgkqhkiG9w0BAQUFADBJMRMwEQYK" +
...
      "9Hwz0oPmQfi3VEXw16eBHf6EpmyOC8nBFeYPv9FKfuVHB9W3JNh+ZA=="
      
        objEnroll.InitializeFromRequest(objCmcRequest);
        var pkcs10 = objEnroll.CreateRequest(3); // XCN_CRYPT_STRING_BASE64REQUESTHEADER = 3

        document.write("&amp;lt;br&amp;gt;" + pkcs10);
        document.write("&amp;lt;br&amp;gt;The end!");
      }
      catch (ex) {
        document.write("&amp;lt;br&amp;gt;" + ex.description);
        return false;
      }

      return true;
    }       

    CreateRequest();

  &amp;lt;/script&amp;gt;
    
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/PRE&gt;
&lt;P mce_keep="true"&gt;Note that if we don't set the right certificate to the &lt;STRONG&gt;KeyArchivalCertificate&lt;/STRONG&gt;&amp;nbsp;property, we will get the following issue: &lt;A href="http://blogs.msdn.com/alejacma/archive/2009/05/28/certenroll-cx509enrollment-p-createrequest-returns-error-0x80070057.aspx" mce_href="http://blogs.msdn.com/alejacma/archive/2009/05/28/certenroll-cx509enrollment-p-createrequest-returns-error-0x80070057.aspx"&gt;CertEnroll::CX509Enrollment::p_CreateRequest returns error 0x80070057&lt;/A&gt;.&lt;/P&gt;
&lt;P mce_keep="true"&gt;Other issues we may get when creating the request:&lt;/P&gt;
&lt;P mce_keep="true"&gt;- &lt;A href="http://blogs.msdn.com/alejacma/archive/2009/05/28/certenroll-cx509enrollment-p-createrequest-returns-error-0x800b0112.aspx" mce_href="http://blogs.msdn.com/alejacma/archive/2009/05/28/certenroll-cx509enrollment-p-createrequest-returns-error-0x800b0112.aspx"&gt;CertEnroll::CX509Enrollment::p_CreateRequest returns error 0x800b0112&lt;/A&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;- &lt;A href="http://blogs.msdn.com/alejacma/archive/2009/05/28/certenroll-cx509enrollment-p-createrequest-returns-error-0x80092012.aspx" mce_href="http://blogs.msdn.com/alejacma/archive/2009/05/28/certenroll-cx509enrollment-p-createrequest-returns-error-0x80092012.aspx"&gt;CertEnroll::CX509Enrollment::p_CreateRequest returns error 0x80092012&lt;/A&gt;&lt;BR&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;- &lt;A href="http://blogs.msdn.com/alejacma/archive/2009/05/28/certenroll-cx509enrollment-p-createrequest-returns-error-0x8009000b.aspx" mce_href="http://blogs.msdn.com/alejacma/archive/2009/05/28/certenroll-cx509enrollment-p-createrequest-returns-error-0x8009000b.aspx"&gt;CertEnroll::CX509Enrollment::p_CreateRequest returns error 0x8009000b&lt;/A&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;If we want to install the response from the CA, we may use the same code that we used here:&amp;nbsp;&lt;A href="http://blogs.msdn.com/alejacma/archive/2009/02/20/how-to-create-a-certificate-request-with-certenroll-asp.aspx" mce_href="http://blogs.msdn.com/alejacma/archive/2009/02/20/how-to-create-a-certificate-request-with-certenroll-asp.aspx"&gt;How to create a certificate request with CertEnroll (ASP)&lt;/A&gt;&amp;nbsp;or here: &lt;A href="http://blogs.msdn.com/alejacma/archive/2009/01/28/how-to-create-a-certificate-request-with-certenroll-javascript.aspx" mce_href="http://blogs.msdn.com/alejacma/archive/2009/01/28/how-to-create-a-certificate-request-with-certenroll-javascript.aspx"&gt;&lt;FONT color=#006ff7&gt;How to create a certificate request with CertEnroll (JavaScript)&lt;/FONT&gt;&lt;/A&gt;. But instead of using&amp;nbsp;the .cer or&amp;nbsp;the .p7b file containing the response, we have to use an .rsp file. What is an .rsp file? What happens if I don't use it? Please, check this post for details: &lt;A href="http://blogs.msdn.com/alejacma/archive/2009/05/28/certenroll-cx509enrollment-p-installresponse-returns-error-0x80095002.aspx" mce_href="http://blogs.msdn.com/alejacma/archive/2009/05/28/certenroll-cx509enrollment-p-installresponse-returns-error-0x80095002.aspx"&gt;CertEnroll::CX509Enrollment::p_InstallResponse returns error 0x80095002&lt;/A&gt;.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I hope this helps.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Regards,&lt;/P&gt;
&lt;P&gt;Alex (Alejandro Campos Magencio)&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9644581" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/alejacma/archive/tags/CertEnroll/default.aspx">CertEnroll</category></item><item><title>How to create a certificate request with CertEnroll (ASP)</title><link>http://blogs.msdn.com/alejacma/archive/2009/02/20/how-to-create-a-certificate-request-with-certenroll-asp.aspx</link><pubDate>Fri, 20 Feb 2009 15:05:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9435923</guid><dc:creator>alejacma</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/alejacma/comments/9435923.aspx</comments><wfw:commentRss>http://blogs.msdn.com/alejacma/commentrss.aspx?PostID=9435923</wfw:commentRss><description>&lt;P&gt;Hi all,&lt;/P&gt;
&lt;P&gt;The other day I posted a &lt;STRONG&gt;Javascript sample&lt;/STRONG&gt; which shows how to use &lt;A class="" href="http://msdn.microsoft.com/en-us/library/aa374863(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/aa374863(VS.85).aspx"&gt;&lt;FONT color=#006ff7&gt;CertEnroll&lt;/FONT&gt;&lt;/A&gt; COM component to &lt;STRONG&gt;create a certificate request&lt;/STRONG&gt; and &lt;STRONG&gt;install the response from the CA&lt;/STRONG&gt; (Certificate Authority): &lt;A class="" href="http://blogs.msdn.com/alejacma/archive/2009/01/28/how-to-create-a-certificate-request-with-certenroll-javascript.aspx" mce_href="http://blogs.msdn.com/alejacma/archive/2009/01/28/how-to-create-a-certificate-request-with-certenroll-javascript.aspx"&gt;How to create a certificate request with CertEnroll (JavaScript)&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;The installation part of that sample assumed that we got a Base64 text&amp;nbsp;with the response from the CA. But what if we i.e. send the request to a server, the server gets a .p7b or .cer binary file with the response from the CA, and we want to install the response on the client who requested the cert on the first place? &lt;/P&gt;
&lt;P&gt;The following &lt;STRONG&gt;ASP sample&lt;/STRONG&gt; shows how to &lt;STRONG&gt;install on the client the .p7b/.cer binary file&lt;/STRONG&gt; that the server got with the &lt;STRONG&gt;response&lt;/STRONG&gt; from the &lt;STRONG&gt;CA&lt;/STRONG&gt;:&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&amp;lt;%
  ' Convert binary to Base64
  '
  Function &lt;STRONG&gt;BinaryToBase64&lt;/STRONG&gt;(binary)
      ' Create temporary node with Base64 data type  
      Set oXmlDom = CreateObject("&lt;STRONG&gt;microsoft.xmldom&lt;/STRONG&gt;")
      Set oElement = oXmlDom.createElement("tmp")
      oElement.dataType = "bin.base64"
      ' Set bytes, get encoded String 
      oElement.nodeTypedValue = binary
      BinaryToBase64 = oElement.text
  End Function 

  ' Read file into buffer
  '
  Function &lt;STRONG&gt;ReadBinaryFile&lt;/STRONG&gt;(FileName)
      Const adTypeBinary = 1
      'Create Stream object
      Dim BinaryStream
      Set BinaryStream = CreateObject("&lt;STRONG&gt;ADODB.Stream&lt;/STRONG&gt;")
      'Specify stream type - we want To get binary data.
      BinaryStream.Type = adTypeBinary
      'Open the stream
      BinaryStream.Open
      'Load the file data from disk To stream object
      BinaryStream.LoadFromFile FileName
      'Open the stream And get binary data from the object
      ReadBinaryFile = BinaryStream.Read
  End Function 

  ' Read binary file as Base64
  '
  FileName = "C:\temp\certnew.&lt;STRONG&gt;p7b&lt;/STRONG&gt;"
  'FileName = "C:\temp\certnew.&lt;STRONG&gt;cer&lt;/STRONG&gt;"
  sPKCS7 = &lt;STRONG&gt;BinaryToBase64&lt;/STRONG&gt;(&lt;STRONG&gt;ReadBinaryFile&lt;/STRONG&gt;(FileName))
  
  ' Be careful with &lt;STRONG&gt;line feeds&lt;/STRONG&gt; in Base64 string
  '
  strings = split(sPKCS7, chr(10))
  sPKCS7 = """"
  for i = 0 to ubound(strings) - 1
    sPKCS7 = sPKCS7 + strings(i) + """ + """
  next
  sPKCS7 = sPKCS7 + strings(i) + """"

%&amp;gt;

&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;Certificate Request test&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt; 
    &amp;lt;object id="objCertEnrollClassFactory" classid="clsid:884e2049-217d-11da-b2a4-000e7bbb2b09"&amp;gt;&amp;lt;/object&amp;gt;    
    &amp;lt;script language="javascript"&amp;gt;
        
      function InstallCert() 
      {        
        document.write("&amp;lt;br&amp;gt;Installing certificate...");                      

        try {
          // Variables
          var objEnroll = objCertEnrollClassFactory.CreateObject("&lt;STRONG&gt;X509Enrollment.CX509Enrollment&lt;/STRONG&gt;")

          objEnroll.&lt;STRONG&gt;Initialize&lt;/STRONG&gt;(1); // ContextUser
          objEnroll.&lt;STRONG&gt;InstallResponse&lt;/STRONG&gt;(4, &amp;lt;%=sPKCS7%&amp;gt;, 1, ""); // AllowUntrustedRoot = 4, XCN_CRYPT_STRING_BASE64 = 1
        }
        catch (ex) {
          document.write("&amp;lt;br&amp;gt;" + ex.description);
          return false;
        }

        document.write("&amp;lt;br&amp;gt;Done!");                      

        return true;
      }

      InstallCert();
    
    &amp;lt;/script&amp;gt;
    
    
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/PRE&gt;
&lt;P&gt;I hope this helps.&lt;/P&gt;
&lt;P&gt;Regards,&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Alex (Alejandro Campos Magencio)&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9435923" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/alejacma/archive/tags/Windows+Vista/default.aspx">Windows Vista</category><category domain="http://blogs.msdn.com/alejacma/archive/tags/Windows+Server+2008/default.aspx">Windows Server 2008</category><category domain="http://blogs.msdn.com/alejacma/archive/tags/CertEnroll/default.aspx">CertEnroll</category></item><item><title>How to create a certificate request with CertEnroll (JavaScript)</title><link>http://blogs.msdn.com/alejacma/archive/2009/01/28/how-to-create-a-certificate-request-with-certenroll-javascript.aspx</link><pubDate>Wed, 28 Jan 2009 14:08:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9380745</guid><dc:creator>alejacma</dc:creator><slash:comments>9</slash:comments><comments>http://blogs.msdn.com/alejacma/comments/9380745.aspx</comments><wfw:commentRss>http://blogs.msdn.com/alejacma/commentrss.aspx?PostID=9380745</wfw:commentRss><description>&lt;P&gt;Hi all,&lt;/P&gt;
&lt;P mce_keep="true"&gt;The following &lt;STRONG&gt;Javascript sample&lt;/STRONG&gt; shows how to use &lt;A class="" href="http://msdn.microsoft.com/en-us/library/aa374863(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/aa374863(VS.85).aspx"&gt;&lt;FONT color=#006ff7&gt;CertEnroll&lt;/FONT&gt;&lt;/A&gt; COM component to &lt;STRONG&gt;create a certificate request:&lt;/STRONG&gt;&lt;/P&gt;&lt;PRE&gt;&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;Certificate Request test&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt; 
  &amp;lt;object id="&lt;STRONG&gt;objCertEnrollClassFactory&lt;/STRONG&gt;" classid="&lt;STRONG&gt;clsid:884e2049-217d-11da-b2a4-000e7bbb2b09&lt;/STRONG&gt;"&amp;gt;&amp;lt;/object&amp;gt;    
  &amp;lt;script language="javascript"&amp;gt;

    function &lt;STRONG&gt;CreateRequest&lt;/STRONG&gt;() 
    {
      document.write("&amp;lt;br&amp;gt;Create Request...");                      

      try {
        // Variables
        var objCSP = objCertEnrollClassFactory.CreateObject("&lt;STRONG&gt;X509Enrollment.CCspInformation&lt;/STRONG&gt;");
        var objCSPs = objCertEnrollClassFactory.CreateObject("&lt;STRONG&gt;X509Enrollment.CCspInformations&lt;/STRONG&gt;");
        var objPrivateKey = objCertEnrollClassFactory.CreateObject("&lt;STRONG&gt;X509Enrollment.CX509PrivateKey&lt;/STRONG&gt;");
        var objRequest = objCertEnrollClassFactory.CreateObject("&lt;STRONG&gt;X509Enrollment.CX509CertificateRequestPkcs10&lt;/STRONG&gt;")
        var objObjectIds = objCertEnrollClassFactory.CreateObject("&lt;STRONG&gt;X509Enrollment.CObjectIds&lt;/STRONG&gt;");
        var objObjectId = objCertEnrollClassFactory.CreateObject("&lt;STRONG&gt;X509Enrollment.CObjectId&lt;/STRONG&gt;");
        var objX509ExtensionEnhancedKeyUsage = objCertEnrollClassFactory.CreateObject("&lt;STRONG&gt;X509Enrollment.CX509ExtensionEnhancedKeyUsage&lt;/STRONG&gt;");
        var objExtensionTemplate = objCertEnrollClassFactory.CreateObject("&lt;STRONG&gt;X509Enrollment.CX509ExtensionTemplateName&lt;/STRONG&gt;")
        var objDn = objCertEnrollClassFactory.CreateObject("&lt;STRONG&gt;X509Enrollment.CX500DistinguishedName&lt;/STRONG&gt;")
        var objEnroll = objCertEnrollClassFactory.CreateObject("&lt;STRONG&gt;X509Enrollment.CX509Enrollment&lt;/STRONG&gt;")

        //  Initialize the csp object using the desired Cryptograhic Service Provider (CSP)
        objCSP.&lt;STRONG&gt;InitializeFromName&lt;/STRONG&gt;("Microsoft Enhanced Cryptographic Provider v1.0");

        //  Add this CSP object to the CSP collection object
        objCSPs.&lt;STRONG&gt;Add&lt;/STRONG&gt;(objCSP);

        //  Provide key container name, key length and key spec to the private key object
        //objPrivateKey.&lt;STRONG&gt;ContainerName&lt;/STRONG&gt; = "AlejaCMa";
        objPrivateKey.&lt;STRONG&gt;Length&lt;/STRONG&gt; = 1024;
        objPrivateKey.&lt;STRONG&gt;KeySpec&lt;/STRONG&gt; = 1; // AT_KEYEXCHANGE = 1

        //  Provide the CSP collection object (in this case containing only 1 CSP object)
        //  to the private key object
        objPrivateKey.&lt;STRONG&gt;CspInformations&lt;/STRONG&gt; = objCSPs;

        // Initialize P10 based on private key
        objRequest.&lt;STRONG&gt;InitializeFromPrivateKey&lt;/STRONG&gt;(1, objPrivateKey, ""); // context user = 1

        // 1.3.6.1.5.5.7.3.2 Oid - Extension
        objObjectId.&lt;STRONG&gt;InitializeFromValue&lt;/STRONG&gt;("1.3.6.1.5.5.7.3.2");
        objObjectIds.&lt;STRONG&gt;Add&lt;/STRONG&gt;(objObjectId);
        objX509ExtensionEnhancedKeyUsage.&lt;STRONG&gt;InitializeEncode&lt;/STRONG&gt;(objObjectIds);
        objRequest.X509Extensions.&lt;STRONG&gt;Add&lt;/STRONG&gt;(objX509ExtensionEnhancedKeyUsage);

        // 1.3.6.1.5.5.7.3.3 Oid - Extension
        //objExtensionTemplate.&lt;STRONG&gt;InitializeEncode&lt;/STRONG&gt;("1.3.6.1.5.5.7.3.3");
        //objRequest.X509Extensions.&lt;STRONG&gt;Add&lt;/STRONG&gt;(objExtensionTemplate);

        // DN related stuff
        objDn.&lt;STRONG&gt;Encode&lt;/STRONG&gt;("CN=alejacma", 0); // XCN_CERT_NAME_STR_NONE = 0
        objRequest.&lt;STRONG&gt;Subject&lt;/STRONG&gt; = objDn;

        // Enroll
        objEnroll.&lt;STRONG&gt;InitializeFromRequest&lt;/STRONG&gt;(objRequest);
        var pkcs10 = objEnroll.&lt;STRONG&gt;CreateRequest&lt;/STRONG&gt;(3); // XCN_CRYPT_STRING_BASE64REQUESTHEADER = 3

        document.write("&amp;lt;br&amp;gt;" + pkcs10);
        document.write("&amp;lt;br&amp;gt;The end!");
      }
      catch (ex) {
        document.write("&amp;lt;br&amp;gt;" + ex.description);
        return false;
      }

      return true;
    }       

    CreateRequest();

  &amp;lt;/script&amp;gt;
    
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/PRE&gt;
&lt;P mce_keep="true"&gt;And the following &lt;STRONG&gt;Javascript sample&lt;/STRONG&gt; shows how to &lt;STRONG&gt;install the response from the CA&lt;/STRONG&gt; (Certificate Authority):&lt;/P&gt;&lt;PRE&gt;&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;Certificate Request test&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt; 
  &amp;lt;object id="&lt;STRONG&gt;objCertEnrollClassFactory&lt;/STRONG&gt;" classid="&lt;STRONG&gt;clsid:884e2049-217d-11da-b2a4-000e7bbb2b09&lt;/STRONG&gt;"&amp;gt;&amp;lt;/object&amp;gt;    
  &amp;lt;script language="javascript"&amp;gt;

  function &lt;STRONG&gt;InstallCert&lt;/STRONG&gt;() 
  {        
    document.write("&amp;lt;br&amp;gt;Installing certificate...");                      

    try {
    // Variables
    var objEnroll = objCertEnrollClassFactory.CreateObject("&lt;STRONG&gt;X509Enrollment.CX509Enrollment&lt;/STRONG&gt;")
    var sPKCS7 = "-----BEGIN CERTIFICATE-----" +
    "MIIKFQYJKoZIhvcNAQcCoIIKBjCCCgICAQExADALBgkqhkiG9w0BBwGgggnqMIIF" +
    "QjCCBCqgAwIBAgIKYbzdPwAAAAAAVzANBgkqhkiG9w0BAQUFADBJMRMwEQYKCZIm" +
...
    "h25CSWewZhpgbZkKPATLzidc0EjrWLl74RU32HEqkl2+R7yAdBQjMQA=" +
    "-----END CERTIFICATE-----"

    objEnroll.&lt;STRONG&gt;Initialize&lt;/STRONG&gt;(1); // ContextUser
    objEnroll.&lt;STRONG&gt;InstallResponse&lt;/STRONG&gt;(0, sPKCS7, 6, ""); // AllowNone = 0, XCN_CRYPT_STRING_BASE64_ANY = 6
    }
    catch (ex) {
      document.write("&amp;lt;br&amp;gt;" + ex.description);
      return false;
    }

    return true;
  }

  InstallCert(); 
     
  &amp;lt;/script&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/PRE&gt;
&lt;P mce_keep="true"&gt;Note: this code must be run&amp;nbsp;in the same machine where we made the request.&lt;/P&gt;
&lt;P mce_keep="true"&gt;Note: these samples just create the request and install the response from the CA. If we need to &lt;STRONG&gt;send the request to the CA&lt;/STRONG&gt; &lt;STRONG&gt;and get its response&lt;/STRONG&gt; programmatically, the following &lt;STRONG&gt;C# sample&lt;/STRONG&gt; may help with the objects and methods we can use to achieve this: &lt;A class="" href="http://blogs.msdn.com/alejacma/archive/2008/09/05/how-to-create-a-certificate-request-with-certenroll-and-net-c.aspx" mce_href="http://blogs.msdn.com/alejacma/archive/2008/09/05/how-to-create-a-certificate-request-with-certenroll-and-net-c.aspx"&gt;How to create a certificate request with CertEnroll and .NET (C#)&lt;/A&gt;.&lt;/P&gt;
&lt;P mce_keep="true"&gt;I hope this helps.&lt;/P&gt;
&lt;P mce_keep="true"&gt;Regards,&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P mce_keep="true"&gt;Alex (Alejandro Campos Magencio)&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9380745" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/alejacma/archive/tags/CertEnroll/default.aspx">CertEnroll</category></item><item><title>How to create a certificate request with CertEnroll and .NET (C#)</title><link>http://blogs.msdn.com/alejacma/archive/2008/09/05/how-to-create-a-certificate-request-with-certenroll-and-net-c.aspx</link><pubDate>Fri, 05 Sep 2008 15:18:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8926226</guid><dc:creator>alejacma</dc:creator><slash:comments>24</slash:comments><comments>http://blogs.msdn.com/alejacma/comments/8926226.aspx</comments><wfw:commentRss>http://blogs.msdn.com/alejacma/commentrss.aspx?PostID=8926226</wfw:commentRss><description>&lt;P&gt;Hi all,&lt;/P&gt;
&lt;P mce_keep="true"&gt;The following &lt;STRONG&gt;C#&lt;/STRONG&gt; sample shows how to use &lt;A class="" href="http://msdn.microsoft.com/en-us/library/aa374863(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/aa374863(VS.85).aspx"&gt;CertEnroll&lt;/A&gt; COM component to &lt;STRONG&gt;create a certificate request&lt;/STRONG&gt;, &lt;STRONG&gt;send the request to the CA&lt;/STRONG&gt;, &lt;STRONG&gt;get the response from the CA&lt;/STRONG&gt;, and &lt;STRONG&gt;install the new certificate in the machine:&lt;/STRONG&gt; &lt;/P&gt;
&lt;P mce_keep="true"&gt;(Note that this sample is a WinForms app with 3 buttons -createRequestButton, sendRequestButton, acceptPKCS7Button-&amp;nbsp;and 2 textboxes -requestText &amp;amp; responseText-)&lt;/P&gt;&lt;PRE&gt;using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

//  Add the CertEnroll namespace
using &lt;STRONG&gt;CERTENROLLLib&lt;/STRONG&gt;;
using &lt;STRONG&gt;CERTCLIENTLib&lt;/STRONG&gt;;

namespace CATest
{
    public partial class Form1 : Form
    {
        private const int CC_DEFAULTCONFIG = 0;
        private const int CC_UIPICKCONFIG = 0x1;
        private const int CR_IN_BASE64 = 0x1;
        private const int CR_IN_FORMATANY = 0;
        private const int CR_IN_PKCS10 = 0x100;
        private const int CR_DISP_ISSUED = 0x3;
        private const int CR_DISP_UNDER_SUBMISSION = 0x5;
        private const int CR_OUT_BASE64 = 0x1;
        private const int CR_OUT_CHAIN = 0x100;

        public Form1()
        {
            InitializeComponent();
        }

        // &lt;STRONG&gt;Create request&lt;/STRONG&gt;
        private void createRequestButton_Click(object sender, EventArgs e)
        {
            //  Create all the objects that will be required
            CX509CertificateRequestPkcs10 objPkcs10 = new CX509CertificateRequestPkcs10Class();
            CX509PrivateKey objPrivateKey = new CX509PrivateKeyClass();
            CCspInformation objCSP = new CCspInformationClass();
            CCspInformations objCSPs = new CCspInformationsClass();
            CX500DistinguishedName objDN = new CX500DistinguishedNameClass();
            CX509Enrollment objEnroll = new CX509EnrollmentClass();
            CObjectIds objObjectIds = new CObjectIdsClass();
            CObjectId objObjectId = new CObjectIdClass();
            CX509ExtensionKeyUsage objExtensionKeyUsage = new CX509ExtensionKeyUsageClass(); 
            CX509ExtensionEnhancedKeyUsage objX509ExtensionEnhancedKeyUsage = new CX509ExtensionEnhancedKeyUsageClass();
            string strRequest;

            try
            {
                requestText.Text = "";

                //  Initialize the csp object using the desired Cryptograhic Service Provider (CSP)
                objCSP.InitializeFromName(
                    "Microsoft Enhanced Cryptographic Provider v1.0"
                );

                //  Add this CSP object to the CSP collection object
                objCSPs.Add(
                    objCSP
                );

                //  Provide key container name, key length and key spec to the private key object
                //objPrivateKey.ContainerName = "AlejaCMa";
                objPrivateKey.Length = 1024;
                objPrivateKey.KeySpec = X509KeySpec.XCN_AT_SIGNATURE;
                objPrivateKey.KeyUsage = X509PrivateKeyUsageFlags.XCN_NCRYPT_ALLOW_ALL_USAGES; 
                objPrivateKey.MachineContext = false;

                //  Provide the CSP collection object (in this case containing only 1 CSP object)
                //  to the private key object
                objPrivateKey.CspInformations = objCSPs;

                //  Create the actual key pair
                objPrivateKey.Create();

                //  Initialize the PKCS#10 certificate request object based on the private key.
                //  Using the context, indicate that this is a user certificate request and don't
                //  provide a template name
                objPkcs10.InitializeFromPrivateKey(
                    X509CertificateEnrollmentContext.ContextUser, 
                    objPrivateKey, 
                    ""
                );

                // Key Usage Extension 
                objExtensionKeyUsage.InitializeEncode(
                    X509KeyUsageFlags.XCN_CERT_DIGITAL_SIGNATURE_KEY_USAGE | 
                    X509KeyUsageFlags.XCN_CERT_NON_REPUDIATION_KEY_USAGE | 
                    X509KeyUsageFlags.XCN_CERT_KEY_ENCIPHERMENT_KEY_USAGE | 
                    X509KeyUsageFlags.XCN_CERT_DATA_ENCIPHERMENT_KEY_USAGE
                );
                objPkcs10.X509Extensions.Add((CX509Extension)objExtensionKeyUsage);

                // Enhanced Key Usage Extension
                objObjectId.InitializeFromValue("1.3.6.1.5.5.7.3.2"); // OID for Client Authentication usage
                objObjectIds.Add(objObjectId);
                objX509ExtensionEnhancedKeyUsage.InitializeEncode(objObjectIds);
                objPkcs10.X509Extensions.Add((CX509Extension)objX509ExtensionEnhancedKeyUsage);

                //  Encode the name in using the Distinguished Name object
                objDN.Encode(
                    "CN=AlejaCMa",
                    X500NameFlags.XCN_CERT_NAME_STR_NONE
                );

                //  Assing the subject name by using the Distinguished Name object initialized above
                objPkcs10.Subject = objDN;

                // Create enrollment request
                objEnroll.InitializeFromRequest(objPkcs10);
                strRequest = objEnroll.&lt;STRONG&gt;CreateRequest&lt;/STRONG&gt;(
                    EncodingType.XCN_CRYPT_STRING_BASE64
                );

                requestText.Text = strRequest;

            } catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        // &lt;STRONG&gt;Submit request to CA and get response&lt;/STRONG&gt; 
        private void sendRequestButton_Click(object sender, EventArgs e)
        {
            //  Create all the objects that will be required
            CCertConfig objCertConfig = new CCertConfigClass();
            CCertRequest objCertRequest = new CCertRequestClass();
            string strCAConfig;
            string strRequest;
            int iDisposition;
            string strDisposition;
            string strCert;

            try
            {
                strRequest = requestText.Text;

                // Get CA config from UI
                //strCAConfig = objCertConfig.GetConfig(CC_DEFAULTCONFIG);
                strCAConfig = objCertConfig.GetConfig(CC_UIPICKCONFIG);                

                // Submit the request
                iDisposition = objCertRequest.&lt;STRONG&gt;Submit&lt;/STRONG&gt;(
                    CR_IN_BASE64 | CR_IN_FORMATANY,
                    strRequest,
                    null,
                    strCAConfig
                );

                // Check the submission status
                if (CR_DISP_ISSUED != iDisposition) // Not enrolled
                {
                    strDisposition = objCertRequest.GetDispositionMessage();

                    if (CR_DISP_UNDER_SUBMISSION == iDisposition) // Pending
                    {
                        MessageBox.Show("The submission is pending: " + strDisposition);
                        return;
                    }
                    else // Failed
                    {
                        MessageBox.Show("The submission failed: " + strDisposition);
                        MessageBox.Show("Last status: " + objCertRequest.GetLastStatus().ToString());
                        return;
                    }
                }

                // Get the certificate
                strCert = objCertRequest.&lt;STRONG&gt;GetCertificate&lt;/STRONG&gt;(
                    CR_OUT_BASE64 | CR_OUT_CHAIN
                );

                responseText.Text = strCert;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        // &lt;STRONG&gt;Install response from CA&lt;/STRONG&gt;
        private void acceptPKCS7Button_Click(object sender, EventArgs e)
        {
            //  Create all the objects that will be required
            CX509Enrollment objEnroll = new CX509EnrollmentClass();
            string strCert;
            
            try
            {
                strCert = responseText.Text;

                // Install the certificate
                objEnroll.Initialize(X509CertificateEnrollmentContext.ContextUser);
                objEnroll.&lt;STRONG&gt;InstallResponse&lt;/STRONG&gt;(
                    InstallResponseRestrictionFlags.AllowUntrustedRoot,
                    strCert,
                    EncodingType.XCN_CRYPT_STRING_BASE64,
                    null
                );

                MessageBox.Show("Certificate installed!");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }      
    }
}
&lt;/PRE&gt;
&lt;P&gt;I hope this helps.&lt;/P&gt;
&lt;P&gt;Cheers,&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Alex (Alejandro Campos Magencio)&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8926226" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/alejacma/archive/tags/CertEnroll/default.aspx">CertEnroll</category></item></channel></rss>