//客户端
function certLogin()
{
var pwd = document.getElementById("certPwd").value; //获取页面用户输入的证书密码
if(pwd.replace(/[ ]/g,"")==""){
alert("证书密码不能为空,请输入有效的密码!");
return false;
}
try{
NJCA.ClearPasswd();//清除证书缓存密码
rs = NJCA.setPasswd('P11', pwd, 1); //除pwd为用户输入,其它参数固定不变
}catch(e){
//上面函数执行异常,原因都是没有加载到安徽CA证书驱动导致
alert('控件初始化失败,请确认CA驱动是否安装正确!');
return false;
}
if(!rs)
{
//未插KEY或证书密码不对会有如下提示
var errorMsg = NJCA.GetLastErrorInfo(0);//获取错误详情
errorMsg += '\n请确认CA的UKEY是否正确插入,或密码是否正确!';
alert(errorMsg);
return false;
}
//获取证书PEM值
var strClientCert = NJCA.GetCertEx(2); //参数请默认为2
if('' == strClientCert ||strClientCert==null)
{
alert("证书获取异常!\n请确认CA的UKEY是否正确插入,或证书是否存在!");
NJCA.GetLastErrorInfo(0);
return false;
}
var yxqts = NJCA.GetCertInfo(strClientCert, 3043, ''); //证书有效期剩余天数
if(yxqts<=30){
if(yxqts<=0){
alert("证书已过期!\n请联系CA延期证书再使用:400-880-4959");
return false;
}
alert("证书有效期还剩"+yxqts+"天!\n请尽快联系CA延期证书:400-880-4959");
}
var certcn = NJCA.GetCertInfo(strClientCert, 3007, ''); //证书名称,一般为企业名称或个人姓名,根据业务系统需要获取
var certSn = NJCA.GetCertInfo(strClientCert, 3031, ''); //证书序列号,每个证书都不一样,根据业务系统需要获取
//获取证书O项信息
var userOrg = NJCA.GetCertInfo(strClientCert, 3005, '');
var sjs = Math.random();//产生随机数
var bRet = NJCA.Sign(sjs); //客户端对随机数签名 返回true/false 即签名成功/签名失败
var signData = "";
if (bRet){
signData = NJCA.SignedData;//签名成功,NJCA.SignedData为签名结果
}else{
alert("执行签名失败!请确认密码是否正确,或UKEY是否正确插入!");
return false;
}
console.log("扩展域信息:"+NJCA.GetExtensionInfo("1.2.156.10260.4.1.1"));
}
//服务器端
String signData = request.getParameter("signData"); //来自客户端:证书签名结果
String certPem = request.getParameter("certPem");//来自客户端:证书PEM值
String certCn = request.getParameter("certCn");//企业中文名称或个人姓名
String certSn = request.getParameter("certSn"); //证书唯一标识,所有CA证书这一项是百分百确认是肯定不一样的
String userOrg = request.getParameter("userOrg");//证书O项
out.print("企业名称/个人姓名:"+certCn+","+"证书O项:"+userOrg+",证书唯一标识:"+certSn+"<br/><br/><br/>");
String strSOAPServer = "http://192.168.1.78:8080/soap"; //服务端地址,该地址为公网地址,测试时连接公网可用,正式使用可能需要更换为正式服务器地址
if (certPem != null && signData != null)
{
try{
//调用签名服务器接口,验证客户端证书有效性
String[] verifycert = new ahcapkiservers().ServerVClient( strSOAPServer , certPem , signData );
//返回结果为1表示验证成功,返回其它均表示失败;verifycert[1]为相应的说明,错误时为错误原因
if( verifycert[0].equals("1") )
out.print("<font color='blue'>"+verifycert[1]+",登陆成功!</font>");
else
out.print("<font color='red'>登陆失败:"+verifycert[1]+"</font>");
}catch (Exception e) {
out.print("调用服务器验证证书异常!");
}
}