用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>
知識點總結落實: