通过CertEnroll在CA上(1创建证书请求2得到证书3安装证书)

原文网址:http://www.cnblogs.com/rippleyong/archive/2008/12/15/1355417.html

绝顶好文章,非常棒的代码!!!

0.代码下载

CAtest20081215164652.rar

1.简要说明

证书注册API(CertificateEnrollment API)的功能是用于在客户端程序请求一个证书,请求批准后得到一个证书,然后安装证书。从vista开始使用的市CertEnroll.dll,之前使用的都是Xenroll.dll

我门的CA是Widows Certificate Services

CA即证书管理机构,受委托发放数字证书的第三方组织或公司。数字证书是用来建立数字签名和公-私(public-private)密钥对的。CA在这个过程中所起的作用就是保证获得这一独特证书的人就是被授权者本人。在数据安全和电子商务中,CA是一个非常重要的组成部分,因为它们确保信息交换各方的身份。

2.添加引用

using CERTENROLLLib; 
using CERTCLIENTLib;

私有变量定义

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;
        private string sOK = "";

3.创建证书请求

        public string createRequest(string name, ref string strRequest)
        {
            //  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();

try
            {

//  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);

objDN.Encode(
                    name,
                    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.CreateRequest(
                    EncodingType.XCN_CRYPT_STRING_BASE64
                );
                return sOK;

}
            catch (Exception ex)
            {
                return ex.Message;
            }
        }

4.发送证书请求到CA,证书请求批准后的到一个证书

 public string sendRequest(string strRequest, ref  string strCert)
        {
            //  Create all the objects that will be required
            CCertConfig objCertConfig = new CCertConfigClass();
            CCertRequest objCertRequest = new CCertRequestClass();
            string strCAConfig;

int iDisposition;
            string strDisposition;

try
            {
                // Get CA config from UI
                //strCAConfig = objCertConfig.GetConfig(CC_DEFAULTCONFIG);
                strCAConfig = objCertConfig.GetConfig(CC_UIPICKCONFIG);

// Submit the request
                iDisposition = objCertRequest.Submit(
                    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
                    {

return "The submission is pending: " + strDisposition;
                    }
                    else // Failed
                    {
                        string sError;
                        sError = "The submission failed: " + strDisposition;
                        sError += "Last status: " + objCertRequest.GetLastStatus().ToString();
                        return sError;
                    }
                }

// Get the certificate
                strCert = objCertRequest.GetCertificate(
                    CR_OUT_BASE64 | CR_OUT_CHAIN
                );
                return sOK;

}
            catch (Exception ex)
            {
                return ex.Message;
            }
        }

 

5.在客户端机器上安装证书

        public string acceptPKCS7(string strCert)
        {
            //  Create all the objects that will be required
            CX509Enrollment objEnroll = new CX509EnrollmentClass();

try
            {

// Install the certificate
                objEnroll.Initialize(X509CertificateEnrollmentContext.ContextUser);
                objEnroll.InstallResponse(
                    InstallResponseRestrictionFlags.AllowUntrustedRoot,
                    strCert,
                    EncodingType.XCN_CRYPT_STRING_BASE64,//如果使用UKEY,用ANY类型 -2013.7.31
                    null
                );

return sOK;
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }

6.参考

通过CertEnroll在CA上(1创建证书请求2得到证书3安装证书)相关推荐

  1. 鸿蒙OS 生成密钥和证书请求文件

    HarmonyOS 应用通过数字证书和授权文件来保证应用的完整性,在申请数字证书和 Profile 文件前,需要通过 DevEco Studio 来生成私钥(存放在 .p12 文件中)和证书请求文件( ...

  2. IIS/IIS Express中遇到的证书问题,此网站的安全证书存在问题。

    上面这幅图大家应该不陌生(觉得陌生的话就不用看下面的内容了,呵呵),再放上中英两段关键字: 根据验证过程,远程证书无效. The remote certificate is invalid accor ...

  3. Confluence 6 通过 SSL 或 HTTPS 运行 - 创建或请求一个 SSL 证书

    在启用 HTTPS 之前,你需要一个有效的证书,如果你已经有了一个有效的证书,你可以直接跳过这个步骤,进入 step 2. 你可以创建一个自签名的证书,或者从信任的 Certificate Autho ...

  4. C#创建https请求并使用pfx证书

    常规情况下创建Web请求,并获取请求数据的代码如下: WebRequest req = WebRequest.Create(url); req.Timeout = 15000; WebResponse ...

  5. 先安装证书服务(CA),再安装IIS,导致默认certsrv站点不能访问

    在2003系统中,有时候安装证书服务以后,才发现我们没有安装IIS,从而导致证书服务的默认站点certsrv虚拟目录无法访问,因为在安装证书的时候,会默认创建该虚拟目录,如果没有安装IIS的话,就无法 ...

  6. mitmproxy安装证书_在 macOS 上使用 mitmproxy 透明代理进行网络抓包

    什么是透明代理 透明代理的意思是客户端根本不需要知道有代理服务器的存在,它改变你的报文,并会传送真实 IP,多用于路由器的 NAT 转发中. 为什么要用透明代理 普通代理需要在手机或其他客户端网络中进 ...

  7. SSL应用系列之三:CA证书颁发机构(中心)安装图文详解

    tag: windows server 2003 ca ssl 原文传送门     其实,本节讨论的内容应该归属于CA系列的,但其中涉及到的内容和SSL应用系列之二比较紧密,在之二一文中未能详细描述, ...

  8. 在阿里云IIS服务器上安装证书

    在IIS服务器上安装证书 您可将下载的阿里云SSL证书安装到IIS服务器上,使您的IIS服务器支持HTTPS安全访问. 一.前提条件 申请证书时需要选择 系统自动创建CSR. 申请证书时如果选择手动创 ...

  9. [投稿]通过Web界面在多台服务器上批量创建文件

    最近在EDAS产品上发现了一个有意思的功能,能够在Web界面上向多台服务批量下发命令执行,觉得这个功能能够极大的提升效率,因此想分享给其他小伙伴. 这里我以"通过Web界面在多台服务器上批量 ...

最新文章

  1. 陕西信息计算机学校,陕西计算机信息专业学校
  2. 常用工具之zabbix
  3. 不仅仅是世界500强--华为经典教程大集合
  4. 用形态学的方法实现图像的角点检测
  5. 栏目图片 栏目描述_网站描述怎么写?对网站优化有什么作用?
  6. Mysql学习积累之一[网摘收藏 个人学习参考]
  7. 阿里云ECS服务器挂载磁盘
  8. java启动scrapy爬虫,爬虫入门之Scrapy 框架基础功能(九)详解
  9. 牛客网 【每日一题】5月20日题目 简单瞎搞题
  10. 与大家分享一下2010我的找工作历程!真累啊!不过都已经结束了!
  11. 强化学习DQN算法实战之CartPole
  12. 网络编程-TCP/IP各层介绍(5层模型讲解)
  13. 使用Ueditor点击上传图片时显示延迟的问题
  14. 数模美赛备赛-MATLAB基操勿六
  15. 弱监督学习总结(1)
  16. 基本社会里模型的源码分析
  17. 垃圾分类催生创业公司
  18. windows应用商店打不开,错误代码0x80131500
  19. 1192: 删除记录(结构体专题)
  20. python键盘记录工具开发_多功能Python键盘记录工具:Radium

热门文章

  1. 【KVM系列05】Libvirt 介绍
  2. Spring常见的十八中异常Exception
  3. tcs标准编写软件_【通知】关于举办2019年第一期“标准编写、案例分析、TCS工具使用”培训班的通知...
  4. chrome自动调节窗口大小插件_高效使用Chrome浏览器,教你10个小技巧!
  5. (Java多线程)线程安全问题
  6. (Java集合框架)集合框架概述和Collection常用功能及遍历
  7. grouping Function
  8. 数据结构 递归讲解
  9. 微信遇到特殊服务器,解决微信网页授权,出现errcode:40163,errmsg:codebeenused,看似微信访问了2次这个回调接口的问题...
  10. 无聊的python课程_无聊的钢镚的python学习之路