IE中自动安装用户数字证书
在基于ejbca搭建数字证书时候,需要实现用户自助申请数字证书(Certificate signing request)并自动安装到IE浏览器中的功能(Certificate enrollment)。
相关的资料极其缺少,好在ejbca中有相关的例子可以参考,尽管不是很完整。整理一下研究的大致成果。
1、基本思路:
1)、Certificate signing request(CSR)
证书签发请求(CSR),也叫做证书请求,是从请求者浏览器发送到证书中心来申请一个数字身份证书的一条信息,在公共密钥基础架构系统中。在创建一个 CSR 之前,这个请求者首先产生一个密钥对,为这个私有密钥保密。CSR 包括鉴别请求者一条的信息,和由这个请求者选择的公共密钥。相应的私有密钥不包含在 CSR 中,但是被用于数位签名整个请求。
在XP、Windows 2003的IE上,通过XEnroll.dll控件的createPKCS10方法来生成CSR(Certificate signing request)。
在Vista,Windows 2008,Windows 7 的IE上,需要使用CertEnroll.dll的X509Enrollment.CX509CertificateRequestPkcs10方法来生成CSR(Certificate signing request)。
2)、用户数字证书的自动安装
要实现用户数字证书在IE浏览器中自动安装,首先要客户端浏览器提交CSR到证书中心服务器,证书中心服务器端根据CSR对用户私钥和公钥进行签名并将签名后的证书返回给客户端。
在XP、Windows 2003的IE上,通过XEnroll.dll控件的acceptPKCS7方法实现证书自动安装到客户端浏览器,大致步骤如下:
XEnroll.acceptPKCS7
在Vista,Windows 2008,Windows 7 的IE上,需要使用CertEnroll.dll控件的InstallResponse方法来实现自动安装到客户端浏览器,大致过程如下:
var objEnroll = CertEnroll.CreateObject(“X509Enrollment.CX509Enrollment”)
Call objEnroll.Initialize(1)
objEnroll.InstallResponse
此处安装用户数字证书时候并没有自动安装根证书,根证书自动安装的实现方式可以参考:IE中自动安装根数字证书
3)、服务器端的处理逻辑
在ejbca中src\java\org\ejbca\ui\web\pub\DemoCertReqServlet.java、src\publicweb\publicweb\templates\certInstTemplate.jsp可以作为例子来理解服务器端对CSR请求处理及服务器响应客户端实现证书自动安装的实现机制。
以上思路其实应用于openssl的方案也可以。
2、测试页面
<HTML>
<HEAD><meta http-equiv="Content-Type" content="text/html; charset=GBK" /><TITLE>VBScript Certificate Enrollment Control Request 例子(使用XEnroll)TITLE><OBJECT classid="clsid:127698E4-E730-4E5C-A2b1-21490A70C8A1"codebase="xenroll.dll"id=XEnroll >
OBJECT><form name="form1" id="form1" action="http://192.168.1.16/ejbca/democertreq" method="post" onsubmit="cert()"><center>Certificate Enrollment Control Request 例子<br/><br/>
这里只演示使用XEnroll.dll(XP、Windows 2003的IE)来生成CSR的例子<br/>
在Vista,Windows 2008,Windows 7 的IE上需要使用CertEnroll.dll,与此类似<br/><input name="certificateprofile" value="liang" type="hidden"><input name="entityprofile" value="liang" type="hidden"><br><input name="pkcs10req" id="pkcs10req" type="hidden"><br><br><input name="user" value="C=CN,O=yeeach.com,OU=yeeach.com,CN=liang" type="hidden"><table><tr><td align="right">用户DN之Canonical Name(CN):td><td><input name="canonical_name" value="liang" type="text">td>tr><tr><td align="right">用户DN之Organization(O):td><td><input name="organization" value="yeeach.com" type="text">td>tr><tr><td align="right">用户DN之Organization Unit(C):td><td><input name="organization_unit" value="R&D" type="text">td>tr><tr><td align="right">用户DN之County(C):td><td><input name="country" value="CN" type="text">td>tr><tr><td align="right">用户密码:td><td><input name="password" value="liang" type="password">td>tr><tr><td align="right">邮箱:td><td><input name="email" type="text" value="chuanliang@gmail.com">td>tr><tr><td>td><td>td>tr><tr><td>td><td>td>tr><tr><td align="center" colspan="2"><input value="申请证书" name="submit" type="submit" >td>tr>table><input name="includeemail" value="true" type="hidden">form><SCRIPT language="VBScript">Sub cert
SCRIPT>
body>
html>
3、certInstTemplate.jsp
DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /><title>EJBCA Certification Authoritytitle><link rel="stylesheet" href="styles.css" type="text/css" /><script type="text/javascript" src="scripts/functions.js">script>class="main">class="content">
<object classid="$CLASSID" id="g_objClassFactory">object>
