CA服务器开开发(二)---UsbKey认证 服务端

认证过程为,服务端生成一个随机数(认证原文),CA服务器中使用用户的证书里面的公钥进行加密这个随机数,然后用户收到这个加密后的随机数后使用usbkey里面的私钥来解密出认证原文,然后将原文发送到服务端进行比对,如果和开始生成的原文一致,则用户的身份是合法的。

这里我写了一个WebService来生成原文并保存到数据库。然后通过插件来提取用户证书公钥加密。

  public class CALogic : WebService
    {
        protected static NLog.Logger Log
        {
            get { return NLog.LogManager.GetCurrentClassLogger(); }
        }

        /// <summary>
        /// 证书验证,如果origncode为空 则返回认证原文
        /// 否则对比origncode和数据库中的原文,
        /// 客户端 验证需要调用两次Verify
        /// 1.获取认证原文   原文= Verify(编号,NULL)
        /// 2.客户端解密第一步得到的 原文
        ///    认证结果=Verify(编号,原文)
        /// </summary>
        [WebMethod]
        public string Verify(string username, string origncode)
        {
            var session = CASessionFactory.CurrentSession();
            try
            {
                var user = session.QueryOver<Users>()
                    .Where(o => o.UserName == username).Take(1)
                    .SingleOrDefault();

                if (null == user)
                {
                    return "用户不存在!";
                }
                var cert = session.QueryOver<CaCertificate>()
                                    .Where(o => o.UID == user.UID)
                                    .Take(1).SingleOrDefault();
                if (cert == null) 
                {
                    return "未找到用户证书";
                }
                if (cert.EndTime < DateTime.Now)
                {
                    return "用户证书已过期!";
                }
                switch (cert.State)
                {
                    case CertState.Freeze:
                        return "用户证书已冻结";
                    case CertState.Abort:
                        return "用户证书已吊销";
                    case CertState.Approving:
                        return "用户证书待审批";
                }
                //返回认证原文
                if (string.IsNullOrEmpty(origncode))
                {
                    var result= CaOperator.NewOriginalCode(session, cert);
                    return result;
                }

                //验证认证原文
                return CaOperator.VerifyOriginalCode(session, cert.UID, origncode) ? "认证成功" : "认证失败";
            }
            catch (Exception e)
            {
                Log.Error(e);
                return "认证异常";
            }
            finally
            {
                session.Close();
            }

        }
    }


======================================================= 目录 & 说明 ======================================================= ECCdemo 通过PKCS#11接口创建ECC密钥对,并进行签名和验签操作; ------------------------------------------------------- EnumObj 通过PKCS#11接口列举出Token中的各种对象,如证书,公钥,私钥,秘密密钥; ------------------------------------------------------- exportcert 通过PKCS#11接口输出Token中的证书的一些属性; ------------------------------------------------------- FormatKey 格式化Token,并重新划分公私有区大小,设置PIN码重试次数和密钥对数量。 ------------------------------------------------------- GetUSBInfos 通过PKCS#11接口获得slot, cryptoki, token的属性信息; ------------------------------------------------------- GuoMiTest 通过PKCS#11接口产生ssf33和scb2密钥,并进行加解密运算; ------------------------------------------------------- HMACTest 通过PKCS#11接口产生GENERIC SECRET密钥,并进行HMAC-SHA1功能验证; ------------------------------------------------------- InitToken 通过PKCS#11接口实现初始化操作,并进行Ansi和Utf8字符转换; ------------------------------------------------------- OTPDemo 通过PKCS#11接口产生HOTP密钥,并产生OTP结果; ------------------------------------------------------- PKCSDemo 通过PKCS#11接口创建RSA密钥对,并进行签名、加密、签名验证和解密的运算; ------------------------------------------------------- PKCStest 通过PKCS#11接口产生多种类型的密钥,如DES/3DES/RC2/RC4/RSA,并进行加解密运算; ------------------------------------------------------- 注:除Microsoft Visual C++外,你需要另外安装 Microsoft Platform SDK,并把SDK安装目录中的 include目录和lib目录分别放置在VC开发环境选项 (对于VC6来说,是菜单中Tools->Options...弹出的 对话框中的Directories页)中的目录(include) 和库(lib)中VC++的路径之前才能够正确编译链接运 行。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值