在WEB应用程序中如何正确使用数字证书?

来源:互联网 发布:cnc雕刻机采用什么编程 编辑:程序博客网 时间:2024/05/27 20:20

数字证书就是标志网络用户身份信息的一系列数据,用来在网络通讯中识别通讯各方的身份,即要在Internet上解决"我是谁"的问题,就如同现实中我们每一个人都要拥有一张证明个人身份的身份证或驾驶执照一样,以表明我们的身份或某种资格。

数字证书是由权威公正的第三方机构即CA中心签发,以数字证书为核心的加密技术,可以对网络上传输的信息进行加密和解密、数字签名和签名验证,确保网上传递信息的机密性、完整性,以及交易实体身份真实性,签名信息不可否认性,从而保障网络应用的安全性。

证书是应用程序和第三方系统间进行交互的凭证,所以证书应该防范被盗用,系统在部署时,证书可以采用以下两种方式来保存和使用证书:

1、      通过计算机证书管理机制来管理用户证书:直接导入计算机并限定证书不能被导出。这种方式限定了计算机只能在服务运行的帐号下使用以及证书不能导出,具有较高的安全性,但如果服务器安全策略规定,使用用户数字证书时,用户必须输入密码或必须用户确认,作为Service程序,系统将运行不正常。通常情况下PCI要求范围内的服务器都会有这样的限定。

 

  IntPtr storeHandle;

            storeHandle = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, 0, CERT_SYSTEM_STORE_CURRENT_USER, "MY");

            IntPtr currentCertContext;

            currentCertContext = CertEnumCertificatesInStore(storeHandle, (IntPtr)0);

            int i = 0;

            while (currentCertContext != (IntPtr)0)

            {

                m_certs.Insert(i++, new X509Certificate(currentCertContext));

                currentCertContext = CertEnumCertificatesInStore(storeHandle, currentCertContext);

            }

            CertCloseStore(storeHandle, 0);

 

            return m_certs.Count;

2、      采用文件的形式保存证书,应用程序直接使用证书文件。这种方式最大的风险是证书被非法用户访问,系统管理员需要对证书文件进行访问控制或采用基于帐户的文件加密(System.IO.File.Encrypt(strCertFilePath))。

X509Certificate2 cert = new X509Certificate2(strCertFilePath,strCertPassword);

这种方式同时支持证书密码,在生成证书时,可以设定证书的密码。

3、      采用文件的方式使用证书可以演化出把证书转换成Byte数组存放在注册表中并通过ACL控制,以及把证书文件存放在Isolated Storage中等其他形式。

在使用证书通讯中,服务器需要对彼此的证书进行认证,判定该证书是否有效。.Net 1.1开发人员通常会实现一个定制的CertificatePolicy,来响应证书异常的情况。

.Net 1.1以后,采用委托的方式来解决证书异常

      ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult);

 

证书出现异常,说明双方认证环节出现错误,原因可能是:证书过期(如果服务器本身的时间异常也会引起证书过期);证书所有人和证书使用人不一致,以及证书签名无效等。原则上讲,证书无效的情况下,系统都不应该和对方进行通讯,但是开发人员可能会为了系统稳定性,完全忽略证书异常的问题。

   //for 2.0

        public bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain,System.Net.Security. SslPolicyErrors errors)

        { // Always accept

            return true;

        }

        //for 1.1

        internal class AcceptAllCertificatePolicy : ICertificatePolicy

        {

            public AcceptAllCertificatePolicy()

            {

               

            }

            public bool CheckValidationResult(ServicePoint sPoint, System.Security.Cryptography.X509Certificates.X509Certificate cert, WebRequest wRequest, int certProb)

            {

                // Always accept

                return true;

            }

        }

这样就关闭了系统间的认证机制,使系统在受到假冒身份、中间人等攻击方式时,没有任何防范,这将给系统带来很大的隐患。当证书认证出现问题时,应该根据错误的类型以及系统安全性要求不同进行甄别处理,同时做相应的日志和警报,通知维护人员处理异常。

原创粉丝点击