最近一个项目中有关于PKI体系的搭建的内容,由于以前没有做过这部分,所以一开始一头雾水。慢慢摸索有了一丁点成果,拿出来和大家分享。说的不对的地方望能指正。

PKI体系目前成了一个企业中信息化安全方面的关键点,是信息化安全的支柱。我所在的项目是以微软技术为基础的项目,CA的证书服务器是windows 2003 server自带的证书组件。
    
    废话就不说太多了啊,说一下在CA搭建好以后如何申请和导出证书的事情啊。

一、区分企业CA和独立CA
    企业CA和独立CA的目标不一样,企业CA主要是用在以域为基础局域网内,适合搭建各种企业级别的CA平台,而独立CA主要用于专门的CA颁发机构,具有权威性。两种不同类型的CA决定了他们的安装和使用都有些差别。安装的时候系统会让你选择企业CA还是独立CA。
    企业CA在安装的时候默认会安装一些证书模板,以方便CA的管理。而独立CA则没有模板。企业CA可以申请多种类型的证书,比如域身份验证,客户端身份验证,web服务器身份验证,智能卡登陆,无线身份验证等等。而独立CA就比较少了。

那么如何区分你是安装了企业CA还是独立CA呢(如果服务器不是你装的):
    1、是否有模板
    2、通过web方式申请证书的时候是否提示你填写公司,部门,地区,省,国家等信息

独立CA是可以转化成企业CA的,微软有一篇文章说明如何操作 Windows Server 2003 PKI 操作指南

二、申请数字证书的三种方式(主要针对企业CA)
    1、通过web的方式来申请
     安装完CA后,系统会自动在IIS的默认站点下创建一个虚拟目录叫Certsrv。这个虚拟目录用来申请证书的申请方式很简单的。
这个目录下面有好多个asp和inc文件,里面的代码就显示了系统如何通过CA的组件编程接口来创建证书申请的,在里面可以看到主要用到了哪些组件以及那些方法。
这很关键,因为通过web的方式申请,效率太低了,我们需要通过自己的程序来申请证书。

2、通过命令行的方式来申请
    CA自带了多个非常有用的证书工具,主要有CertReg.exe ,CertUtil.exe。这两个工具的功能都非常的强大,拥有丰富的参数,可以在命令行模式下查看帮助。

使用CertReg.exe可以以命令行的方式添加一个数字证书申请,这种方式需要创建一个inf文件,再通过这个inf文件生成一个req文件,inf文件中定义了申请信息。
inf文件的制作可以在命令行模式下使用certreq -new -? 看到一些帮助信息,重点查看[NewRequest]部门

通过下面的命令生成
    req文件 certreq -new <文件名>.inf <文件名>.req

通过下面的命令提交req申请文件,并同时导出cer证书文件:
    certreq -submit <文件名>.req <文件名>.cer

对于CertUtil.exe工具,我们可以用它来查询CA的很多信息。
    使用CertUtil -view RequestID号 来查询证书的信息
    CertUtil -view 不加参数可以查询所有的证书的信息
    小技巧:由于证书的信息太多,在dos模式下无法看全,因此使用dos下的输出重定向符将证书信息全部输出到一个文本文件中,非常适合查阅了。如
    certUtil -view > c:/view.txt

3、通过程序调用对象模型来申请
    通过程序调用对象模型生成证书是最有用的功能了,因为很多时候我们要提供非常友好的界面给用户申请证书,而不是像IIS那个CertSrv虚拟目录那样子的。另外还可以批量生成证书,然后把证书保存到智能卡当中。对象模型主要是用COM对象,不知道.Net框架里面的对象是否能做到生成证书。 下面是部分代码,可作参考。

引用COM对象CERTCLIENTLib,XENROLLLib

常量定义
const int AT_KEYEXCHANGE = 1 ;
const int CRYPT_EXPORTABLE = 1 ;
const int CR_IN_ENCODEANY = 0xff ;
const int CR_IN_FORMATANY = 0 ;
const int XECR_CMC = 3 ;

public string CreateClientCertificate(string a_sName, string a_sEmail, string a_sCompany, string a_sDepartment, string a_sCity, string a_sState, string a_sCountry, string a_sCA)
{
 CERTCLIENTLib.ICertRequest CertRequest = new CERTCLIENTLib.CCertRequestClass();
 XENROLLLib.ICEnroll4 CertEnroll = new XENROLLLib.CEnroll2Class();
 try
 {
  string RequestStr ;
  int Disposition, ID ;
  string dNName = (((((("CN=" + a_sName) + ",O=" + a_sCompany) + ",OU=" + a_sDepartment) + ",L=" + a_sCity) + ",S=" + a_sState) + ",C=" + a_sCountry) + ",E=" + a_sEmail;
    
  CertEnroll.ProviderName = "Microsoft Enhanced Cryptographic Provider v1.0" ;
  CertEnroll.KeySpec = AT_KEYEXCHANGE ;
  CertEnroll.GenKeyFlags = CRYPT_EXPORTABLE ;
  CertEnroll.addCertTypeToRequest("User"); ///证书模板信息
  RequestStr = CertEnroll.createRequest( XECR_CMC, dNName , "1.3.6.1.5.5.7.3.2" ) ; 
  Disposition = CertRequest.Submit(CR_IN_ENCODEANY | CR_IN_FORMATANY, RequestStr, "", a_sCA) ;

ID = CertRequest.GetRequestId();

return ID.ToString() ;
    
 }

catch(Exception e)
 {
  return "";
 }
}

在独立ca模式下的申请数字证书的代码,主要是不要这一句:CertEnroll.addCertTypeToRequest("User");  其他一样。

/// <summary>
  /// 导出数字证书
  /// </summary>
  /// <param name="_RequestID"></param>
  public void ExportCertification(string _UserName ,string _RequestID)
  {
   CERTCLIENTLib.ICertRequest2 CertRequest = new CERTCLIENTLib.CCertRequestClass();

XENROLLLib.ICEnroll4 CertEnroll = new XENROLLLib.CEnroll2Class();
   int Disposition ;
   string ErrText = "" ;

Disposition = CertRequest.GetIssuedCertificate(CAServer,int.Parse(_RequestID) ,"") ;

if(Disposition == CR_DISP_ISSUED )
   {
    string Cert ;
    string sCert  ;

try
    {
     Cert = CertRequest.GetFullResponseProperty(FR_PROP_FULLRESPONSE, 0, PROPTYPE_BINARY, CR_OUT_BASE64 ) as string ;

sCert = CertEnroll.getCertFromResponse(Cert)  ;

CertEnroll.createFilePFX("password", CertificationFileName); ///创建pfx文件(包含密钥)

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

4、企业CA和独立CA面对设置申请人信息时的不同反应
    申请证书后,用户的注册信息在企业CA管理单元的颁发的证书那里默认情况是看不到的,因为那里显示的列中主要有申请人姓名,证书的有效时间信息,以及颁发者的信息,包括国家,公司,省、市等。而我们通过程序自动申请的证书,它的申请人姓名都是一样的,比如我在CA服务器用程序申请的所有证书的申请人姓名都是 域名/Administrator,如此一来区分某个证书是谁的就非常困难了(可以通过CertUtil -view RequestID ,但很麻烦) 。我摸索了一阵子后,发现我们在申请的时候填的那些信息其实是在申请人信息部分,默认情况下,这些列是没有显示的。因此我们可以在“查看”菜单的添加/删除列中将那些列显示出来并调整显示顺序,可以将申请公用名放到前面,这样就可以方面的区分该证书是为谁申请的了。

通过代码来申请CA证书 -- cnblog相关推荐

  1. 通过代码来申请CA证书

    最近一个项目中有关于PKI体系的搭建的内容,由于以前没有做过这部分,所以一开始一头雾水.慢慢摸索有了一丁点成果,拿出来和大家分享.说的不对的地方望能指正. PKI体系目前成了一个企业中信息化安全方面的 ...

  2. 数据加密类型及创建和申请CA证书

    数据加密类型及创建和申请CA证书 1.数据在互联网上传输必须保证以下3点特性: 私密性:  数据加密 完整性:   数据传输过程没有被人修改 身份验证: 确认对方的身份,防止中间人伪装*** 2.私密 ...

  3. java证书过期时间_我想用代码方式查看ca证书到期时间,以下是我的代码,可以显示日期,但是和实际的截止日期不一致...

    我想用代码方式查看ca证书到期时间,以下是我的代码,可以显示日期,但是和实际的截止日期不一致 希望各位大牛帮忙看一下问题出在哪,多谢啦 import java.io.*; import java.se ...

  4. 申请CA证书的费用大概是多少

    申请CA证书的费用大概是多少?在了解这个问题之前,我们先来了解一下什么是CA证书以及它有哪些作用.CA是数字证书签发机构的简称,主要负责签发证书.认证证书以及管理已经颁发的证书,SSL证书就是由CA机 ...

  5. 新申请CA证书的有效期问题

    现在在很多服务器的部署中,为了安全,都建议我们在部署的时候采用加密的方式进行.这就需要我们使用证书服务. 在使用证书服务的时候,自带的证书有时无法满足我们的需求,如证书的有效期太短等. 管理员经常做的 ...

  6. ca证书 linux 导入_CA搭建与证书申请

    一:创建私有CA openssl的配置文件:/etc/pki/tls/openssl.cnf 根据此配置文件创建CA dir:CA相关文件存放路径 /etc/pki/CA certs:证书存放目录 / ...

  7. 实现CA证书创建及客户端申请证书

    author:JevonWei 版权声明:原创作品 CA证书的相关文件路径 openssl配置文件/etc/pki/tls/openssl.cnf /etc/pki/tls/openssl.cnf C ...

  8. 记一次CA证书的申请、服务器上的部署过程

    1.简介 最近用docker在liberity服务器上部署了一个应用.由于安全方面的考虑,服务器管理员需要我们启用https连接.这就需要我们去给liberity配置ssl证书. 2.步骤 1.申请C ...

  9. HTTP HTTPS 创建CA证书

    目录 http 1.安装apache环境依赖 2.基本设置 3.配置主文件 4.配置完重启HTTP生效 https的实现 1.安装专门的mod_ssl模块 2.申请CA证书 3.编辑.conf配置文件 ...

最新文章

  1. mysql/mariadb命令如何获取帮助
  2. python3.6安装scrapy-win7安装python3.6.1及scrapy
  3. sublime重装后碰到Unable to read Packages
  4. Android之解决布局文件图片太大同步放缩后挤掉其它布局的问题
  5. 爬虫文档学习 xpath bs4 selenium scrapy...
  6. MySQL与Oracle主键冲突解决方式
  7. shell的执行顺序问题
  8. 腾讯回应封杀质疑;王思聪评社交软件;董明珠连任格力董事长;| 极客头条...
  9. python多重继承_Python多重继承
  10. 看了这么多代码,谈一谈代码风格!
  11. CF 61E 树状数组+离散化 求逆序数加强版 三个数逆序
  12. 阿里云何勉:如何定义团队的研发效能?
  13. 翻译:使用 AWS Deep Racer 的日志分析工具
  14. 企业计算机仿真技术应用,基于计算机仿真技术的企业生产物流系统优化研究
  15. JS随手记——三目表达式
  16. CCS之最少拍控制器设计
  17. python基础入门
  18. 3dmax 管子动画_3DMax水管里流水的动画怎么做呢?
  19. win32 012 数据结构
  20. 4.1nbsp;需求定律分析

热门文章

  1. js随着浏览器窗口变化动态调整表格高度
  2. c++对拍程序(bat文件版)
  3. 【Vijos】1431 守望者的逃离
  4. Franka Emika新款机器人FP3震撼发布,带来全新生态,重新定义协作机器人
  5. Java建造者模式(生成器模式)
  6. WIA-PA标准:中国工业无线技术新突破
  7. 用jsp给图片添加文字(图片水印)
  8. 自建ca根证书_如何创建私有 CA 并签发证书
  9. 数据湖浅析(以hudi为例)
  10. Excel没有设置边框线,打印却有边框线