使用CAPICOM实现证书管理.docx

上传人:b****8 文档编号:10223889 上传时间:2023-02-09 格式:DOCX 页数:26 大小:26.95KB
下载 相关 举报
使用CAPICOM实现证书管理.docx_第1页
第1页 / 共26页
使用CAPICOM实现证书管理.docx_第2页
第2页 / 共26页
使用CAPICOM实现证书管理.docx_第3页
第3页 / 共26页
使用CAPICOM实现证书管理.docx_第4页
第4页 / 共26页
使用CAPICOM实现证书管理.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

使用CAPICOM实现证书管理.docx

《使用CAPICOM实现证书管理.docx》由会员分享,可在线阅读,更多相关《使用CAPICOM实现证书管理.docx(26页珍藏版)》请在冰豆网上搜索。

使用CAPICOM实现证书管理.docx

使用CAPICOM实现证书管理

使用CAPICOM实现证书管理

Posted二月16,2010

Comments

(1)

   在基于ejbca搭建CA时候,需要实现如下功能:

   1)、在客户端实现对页面关键数据(例如订单金额等)采用签名、数字信封等方式进行加密

   2)、能够较好支持USBKEY集成

   3)、用户申请数字证书导入浏览器后,能够通过Web页面对浏览器证书进行重新申请(renewal)、删除、显示、查询、验证等功能

   单独依靠XEnroll.dll或CertEnroll.dll控件已经无法满足以上要求。

微软的CAPICOM组件封装了WindowsCryptAPI的各种操作,可以在Windows环境下各种语言中使用。

而且CAPICOM中的大多数接口都是“脚本安全”的,可以直接在网页脚本中安全使用CAPICOM接口所提供的功能。

   需求1)、2)的实现思路:

在前台利用CAPICOM组件读取浏览器或USB盘中的用户证书,对页面表单的关键数据进行SHA1签名。

将签名后的密文与页面表单中的明文提交到服务器端。

服务器从用户请求密文解密得到用户证书及页面关键数据的摘要(利用Bouncycastle、ApacheCommonsCodec),验证证书的合法性及有效性。

然后对提交的页面明文计算SHA1,把得到的结果与从密文是解出摘要进行对比,从而实现数据完整性的校验。

   需求3)的实现思路:

关键是要实现证书的删除、查询、验证功能,结合IE中自动安装用户数字证书、IE中自动安装根数字证书,可以很容易实现相关功能。

 CAPICOM中常用的类主要包括:

Store、Certificates、Certificate 

 基本操作步骤为:

创建Store对象->打开Store对象->查找需要操作的证书集合(Certificates)->对单个证书(Certificate)进行操作

 

1、一个简单例子:

A996E48C-D3DC-4244-89F7-AFA33EC60679"VIEWASTEXT>

varCAPICOM_CURRENT_USER_STORE=2

varCAPICOM_MY_STORE="My"

varCAPICOM_CERTIFICATE_FIND_SUBJECT_NAME=1

varCAPICOM_STORE_OPEN_READ_WRITE=1

varmyStore=newActiveXObject("CAPICOM.Store");

myStore.Open(CAPICOM_CURRENT_USER_STORE,CAPICOM_MY_STORE,CAPICOM_STORE_OPEN_READ_WRITE);

varmyStoreCerts=myStore.Certificates;

varinfo="";

for(i=1;i<=myStoreCerts.Count;i++)

{info+="SubjectName:

"+myStoreCerts.Item(i).SubjectName+"
";

}

document.write(info);

.csharpcode,.csharpcodepre{font-size:

small;color:

black;font-family:

consolas,"CourierNew",courier,monospace;background-color:

#ffffff;/*white-space:

pre;*/}.csharpcodepre{margin:

0em;}.csharpcode.rem{color:

#008000;}.csharpcode.kwrd{color:

#0000ff;}.csharpcode.str{color:

#006080;}.csharpcode.op{color:

#0000c0;}.csharpcode.preproc{color:

#cc6633;}.csharpcode.asp{background-color:

#ffff00;}.csharpcode.html{color:

#800000;}.csharpcode.attr{color:

#ff0000;}.csharpcode.alt{background-color:

#f4f4f4;width:

100%;margin:

0em;}.csharpcode.lnum{color:

#606060;}

 

2、一个更复杂的例子:

2.1)、capicomtest.html

CAPICOM使用DEMO

A996E48C-D3DC-4244-89F7-AFA33EC60679"VIEWASTEXT>

1.读取用户证书



证书类型:

Personal

Root

AddressBook

CA

选择一个证书:



.csharpcode,.csharpcodepre{font-size:

small;color:

black;font-family:

consolas,"CourierNew",courier,monospace;background-color:

#ffffff;/*white-space:

pre;*/}.csharpcodepre{margin:

0em;}.csharpcode.rem{color:

#008000;}.csharpcode.kwrd{color:

#0000ff;}.csharpcode.str{color:

#006080;}.csharpcode.op{color:

#0000c0;}.csharpcode.preproc{color:

#cc6633;}.csharpcode.asp{background-color:

#ffff00;}.csharpcode.html{color:

#800000;}.csharpcode.attr{color:

#ff0000;}.csharpcode.alt{background-color:

#f4f4f4;width:

100%;margin:

0em;}.csharpcode.lnum{color:

#606060;}

   

 

2.2)、capicom.js

varCAPICOM_CURRENT_USER_STORE=2

varCAPICOM_MY_STORE="My"

varCAPICOM_CERTIFICATE_FIND_SUBJECT_NAME=1

varCAPICOM_STORE_OPEN_READ_WRITE=1

varmyStore=newActiveXObject("CAPICOM.Store");

myStore.Open(CAPICOM_CURRENT_USER_STORE,CAPICOM_MY_STORE,CAPICOM_STORE_OPEN_READ_WRITE);

functiondeleteCert()

{

varmyStore=newActiveXObject("CAPICOM.Store");

try{

varstoreName=frmStore.storeName.options(frmStore.storeName.selectedIndex).value;

myStore.Open(CAPICOM_CURRENT_USER_STORE,storeName,CAPICOM_STORE_OPEN_READ_WRITE);

varindex=frmStore.allCerts.options.selectedIndex;

varcert=frmStore.allCerts.options[index].value;

subjectName=getCertCN(cert);

varmyStoreCerts=myStore.Certificates.Find(CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME,subjectName,true);

for(i=1;i<=myStoreCerts.Count;i++)

{

if(myStoreCerts.Item(i).HasPrivateKey()){

//要删除用户证书,首先要删除私钥,才能够调用Certificates.Remove方法删除证书

myStoreCerts.Item(i).PrivateKey.Delete();

}

myStore.Remove(myStoreCerts.Item(i));

}

alert("删除证书成功");

myStoreCerts=null;

myStore.Close();

myStore=null;

}catch(e){

alert("删除证书失败,错误码为:

"+e.number);

}

window.location.reload();

}

functionverifyCertValidDate(){

varmyStore=newActiveXObject("CAPICOM.Store");

try{

varstoreName=frmStore.storeName.options(frmStore.storeName.selectedIndex).value;

myStore.Open(CAPICOM_CURRENT_USER_STORE,storeName,CAPICOM_STORE_OPEN_READ_WRITE);

}

catch(e)

{

alert("打开证书库失败");

return;

}

varindex=frmStore.allCerts.options.selectedIndex;

varcert=frmStore.allCerts.options[index].value;

subjectName=getCertCN(cert);

varmyStoreCerts=myStore.Certificates.Find(CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME,subjectName,true);

varresult="";

for(i=1;i<=myStoreCerts.Count;i++)

{

varvalidToDate=newDate(myStoreCerts.Item(i).ValidToDate+"");

varcurrentDate=newDate();

vardiff=(validToDate-currentDate)/(3600*24*1000);

if(diff>31){

result="证书"+myStoreCerts.Item(i).subjectName+"有效期为:

"+formatDate(validToDate);

}

elseif(diff<=31&&diff>0){

result="证书"+myStoreCerts.Item(i).subjectName+""+diff+"后即将过期,请更新证书";

alert(result);

returnresult;

}

else{

result="证书"+myStoreCerts.Item(i).subjectName+"已经过期,请更新证书";

alert(result);

returnresult;

}

}

if(result=="")

return"没有有效期";

returnresult;

}

functionlistCert()

{

varmyStore=newActiveXObject("CAPICOM.Store");

try

{

varstoreName=frmStore.storeName.options(frmStore.storeName.selectedIndex).value;

myStore.Open(CAPICOM_CURRENT_USER_STORE,storeName,CAPICOM_STORE_OPEN_READ_WRITE);

}

catch(e)

{

alert("打开证书库失败");

returnfalse;

}

varcount=frmStore.allCerts.options.length;

for(i=1;i<=count;i++)

{

frmStore.allCerts.options.remove(count-i);

}

while(frmStore.allCerts.options.length)frmStore.allCerts.options[0]=null;

//只列出DN中有的证书

varmyStoreCerts=myStore.Certificates.Find(CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME,"",true);

for(i=1;i<=myStoreCerts.Count;i++)

{

varcertInfo=newOption("cert:

"+myStoreCerts.Item(i).subjectName);

certInfo.value=myStoreCerts.Item(i).subjectName;

frmStore.allCerts.options.add(certInfo,i);

}

}

functiongetCertCN(dn){

//对于CAPICOM_CA_STORE、CAPICOM_OTHER_STORE、CAPICOM_ROOT_STORE不适用,需要调整

i=dn.indexOf('CN=');

if(i==-1){

return"没有CN";

}else{

cn=dn.substr(i+3);

returncn;

}

}

functionformatDate(inputDate){

if(null==inputDate){

return"";

}

//varyear=1900+date.getYear();

varyear=inputDate.getYear();

varmonth=inputDate.getMonth()+1;

if(month<10)month="0"+month;

varday=inputDate.getDate();

if(day<10)day="0"+day;

varhour=inputDate.getHours();

if(hour<10)hour="0"+hour;

varminute=inputDate.getMinutes();

if(minute<10)minute="0"+minute;

varsecond=inputDate.getSeconds();

if(second<10)second="0"+second;

returnyear+"-"+month+"-"+day;

}

.csharpcode,.csharpcodepre{font-size:

small;color:

black;font-family:

consolas,"CourierNew",courier,monospace;background-color:

#ffffff;/*white-space:

pre;*/}.csharpcodepre{margin:

0em;}.csharpcode.rem{color:

#008000;}.csharpcode.kwrd{color:

#0000ff;}.csharpcode.str{color:

#006080;}.csharpcode.op{color:

#0000c0;}.csharpcode.preproc{color:

#cc6633;}.csharpcode.asp{background-color:

#ffff00;}.csharpcode.html{color:

#800000;}.csharpcode.attr{color:

#ff0000;}.csharpcode.alt{background-color:

#f4f4f4;width:

100%;margin:

0em;}.csharpcode.lnum{color:

#606060;}

 

测试代码打包下载

 

3、参考文档:

CAPICOMReference

HowtouseJavaproduceSignaturebyUSBKeyunderCryptoAPI/CSP

HowtocreateadigitalsigningsolutionwithonlyJavaScript

Howtoobtainsigner’sdetailsfromaJavaScriptsigneddata

AutomaticsignofatextinwithawebscriptusingCAPICOMwithanActiveX

数字证书在WEB应用中登录

 

IE中自动安装用户数字证书

Posted二月14,2010

Comments(3)

   在基于ejbca搭建数字证书时候,需要实现用户自助申请数字证书(Certificatesigningrequest)并自动安装到IE浏览器中的功能(Certificateenrollment)。

   相关的资料极其缺少,好在ejbca中有相关的例子可以参考,尽管不是很完整。

整理一下研究的大致成果。

1、基本思路:

   1)、Certificatesigningrequest(CSR)

    证书签发请求(CSR),也叫做证书请求,是从请求者浏览器发送到证书中心来申请一个数字身份证书的一条信息,在公共密钥基础架构系统中。

在创建一个CSR之前,这个请求者首先产生一个密钥对,为这个私有密钥保密。

CSR包括鉴别请求者一条的信息,和由这个请求者选择的公共密钥。

相应的私有密钥不包含在CSR中,但是被用于数位签名整个请求。

   在XP、Windows2003的IE上,通过XEnroll.dll控件的createPKCS10方法来生成CSR(Certificatesigningrequest)。

  在Vista,Windows2008,Windows7的IE上,需要使用CertEnroll.dll的X509Enrollment.CX509CertificateRequestPkcs10方法来生成CSR(Certificatesigningrequest)。

 2)、用户数字证书的自动安装

   要实现用户数字证书在IE浏览器中自动安装,首先要客户端浏览器提交CSR到证书中心服务器,证书中心服务器端根据CSR对用户私钥和公钥进行签名并将签名后的证书返回给客户端。

  在XP、Windows2003的IE上,通过XEnroll.dll控件的acceptPKCS7方法实现证书自动安装到客户端浏览器,大致步骤如下:

      

127698e4-e730-4e5c-a2b1-21490a70c8a1″codebase=”xenroll.dll”>

       XEnroll.acceptPKCS7

  在Vista,Win

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1