用js模拟证书签名和验签过程
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>证书数据格式Demo</title>
<script type="text/javascript">
var PkiCom;
/**对象初始化**/
window.onload = function init() {
try {
PkiCom = new ActiveXObject('PSIAtv.PSIAPP');//自解:生成一个相关的Active对象
} catch (e) {
alert('未检测到本机上的数字证书客户端,请确保数字证书客户端正常运行。');
if (confirm('您电脑上未安装数字证书客户端?\n是否下载并安装数字证书客户端?')) {
//document.getElementById('seal_submit_btn').disabled = "true";
btn_Controlle(0); /*! 禁用submit控件 */
alert('开始下载数字证书客户端中......');
return false;
}
}
}
function btn_Controlle(NO_OFF) {//★为0是禁用控件、为1是开启控件
var btn_array = document.getElementsByName("seal_submit_btn");//得到页面的三个提交按钮
switch(NO_OFF){
case 0:
for (var int = 0; int < btn_array.length; int++) {
var btn = btn_array[int];
btn.disabled = "true"; //三个提交按钮都关闭
}
break;
case 1:
for (var int = 0; int < btn_array.length; int++) {
var btn = btn_array[int];
btn.disabled = ""; //三个提交按钮都开启
}
break;
}
}
function PKIServer(obj) {
if (typeof (PkiCom) != "undefined") {
btn_Controlle(0); /*! 禁用submit控件 */
PkiCom.AtvInit(); //hw:初始化
/*! 证书实体 */
var CertEntity = PkiCom.GetCert(2);//hw:得到证书
if (CertEntity == '') {
alert('请插入数字证书。');
btn_Controlle(1); /*! 开启submit控件 */
return false; //阻止表单提交
}
/*! 签名原文 */
var StrServerRan = 'SH="1";SN="您正在进行";IN="0";SI="经办人注册";|SH="0";SN="RandomNum";'
+'IN="0";SI="q6Y7h7ABghQktoVkQ21t+UEIrDqGB4yG";|';
/*! 签名结果 */
var StrClientSignedData = PkiCom.SignData(StrServerRan, 32772, 0);
document.getElementById(obj+'CertEntity').value = CertEntity;
document.getElementById(obj+'StrServerRan').value = StrServerRan;
document.getElementById(obj+'StrClientSignedData').value = StrClientSignedData;
return true; //允许表单提交
}
}
</script>
</head>
<body>
<div>
<strong>身份认证交易 - 补充身份信息</strong>
<form action="./seal" method="post" οnsubmit="return PKIServer('00001');">
<table>
<tr>
<td colspan="2">
<!-- 交易请求类型 -->
<input type="hidden" name="busitype" value="00001" />
<!-- 证书实体 -->
<input type="hidden" id="00001CertEntity" name="certentity" />
<!-- 签名原文 -->
<input type="hidden" id="00001StrServerRan" name="strserverran" />
<!-- 签名结果 -->
<input type="hidden" id="00001StrClientSignedData" name="strcilentsigneddata" />
</td>
</tr>
<tr>
<td>客户姓名:</td>
<td><input type="text" name="username" value="张三" /></td>
</tr>
<tr>
<td>证件类型:</td>
<td><select name="idtype">
<option value="A">身份证</option>
<option value="B">军官证</option>
<option value="C">解放军文职干部证</option>
<option value="D">警官证</option>
<option value="E">解放军士兵证</option>
<option value="F">户口簿</option>
<option value="G">(港澳)回乡证-通行证</option>
<option value="H">台通行证-其他有效旅行证</option>
<option value="I">(外国)护照</option>
<option value="J">(中国)护照</option>
<option value="K">武警文职干部证</option>
<option value="L">武警士兵证</option>
<option value="P">全国组织机构代码</option>
<option value="Q">海外客户编号</option>
<option value="R">营业执照号码</option>
<option value="r">对公营业执照号码</option>
<option value="Z">其他</option>
</select></td>
</tr>
<tr>
<td>证件号码:</td>
<td><input type="text" name="idnumber" value="440306201306289999" /></td>
</tr>
<tr>
<td colspan="2"><input name="seal_submit_btn" type="submit" value="提交" /></td>
</tr>
</table>
</form>
</div>
<div>
<strong>签名认证交易 - 补充身份信息</strong>
<!-- ★★★onsubmit属性值:规定该事件发生时执行的 JavaScript
return PKIServer('00002'); 利用到了它的返回值,达到了预期效果
作用:当PKIServer函数return false的时候,此表单是不会提交请求的,为true的时候才会跳转页面
-->
<form action="./seal" method="post" οnsubmit="return PKIServer('00002');">
<table>
<tr>
<td colspan="2">
<!-- 交易请求类型 -->
<input type="hidden" name="busitype" value="00002" />
<!-- 证书实体 -->
<input type="hidden" id="00002CertEntity" name="certentity" />
<!-- 签名原文 --> <input type="hidden" id="00002StrClientSignedData" name="StrClientSignedData" />
</td>
</tr>
<tr>
<td>客户姓名:</td>
<td><input type="text" name="username" value="张三" /></td>
</tr>
<tr>
<td>证件号码:</td>
<td><input type="text" name="idnumber"
value="440306201306289999" /></td>
</tr>
<tr>
<td>文档编号:</td>
<td><input type="number" name="docsn" value="1234567890123456" /></td>
</tr>
<tr>
<td colspan="2"><input name="seal_submit_btn" type="submit" value="提交" /></td>
</tr>
</table>
</form>
</div>
<div>
<strong>签名认证交易 - 文档验签</strong>
<form action="./seal" method="post">
<table>
<tr>
<td colspan="2">
<!-- 交易请求类型 --> <input type="hidden" name="busitype" value="00003" />
</td>
</tr>
<tr>
<td>文档编号:</td>
<td><input type="number" name="docsn" value="1234567890123456" /></td>
</tr>
<tr>
<td>签名域数量:</td>
<td><input type="number" name="signnum" value="4" /></td>
</tr>
<tr>
<td>文档验证结果:</td>
<td>成功<input type="radio" name="docsignresult"
value="0" checked="checked" />
失败<input type="radio" name="docsignresult"
value="1" /></td>
</tr>
<tr>
<td colspan="2"><input name="seal_submit_btn" type="submit" value="提交" /></td>
</tr>
</table>
</form>
</div>
</body>
</html>
知识点总结落实: