求救!!
本人在作PKI的项目,需要读取数字证书扩展域内的内容,不知道怎么做才行?(VC /.net都可以)

解决方案 »

  1.   

    客户端数字证书与基本身份验证(Basic)、域服务器的摘要式身份验证、集成 Windows 身份认证或自定义的 Form 认证等方式相比,虽然部署和管理方面稍微复杂一些,但安全性也更好一些,应用上也较为灵活。  在 ASP 和 ASP.NET 中处理和识别客户端数字证书是非常容易的,代码如下: ASP (VBScript)语法:     Dim subject
       subject=Request.ServerVariables("CERT_SUBJECT") 

       subject=Request.ClientCertifate("Subject")  '--适用于 Subject 没有中文的证书  ASP.NET(C#) 语法:    string subject ;
       HttpClientCertificate hcc = Request.ClientCertificate;
       if(hcc.IsValid) = hcc.Subject; 得到的 subject 字符串是以逗号分隔的子字段列表。例如,C=CN,O=BOC,CN=moslem ,然后将字符串分隔处理,取最后的 CN 值(可能不止一个 CN),这个值是用户的 Common Name ,即“常规名称”,一般就是用户的姓名或 ID。 拿到数字证书中的 CN 后,就可以做进一步的处理了,如对用户进行授权等。我认为比较有效的一种做法是在客户端同时启用数字证书和 Form 认证,可以通过比较 CN 和 Form 中输入的用户名的值是否匹配来做到多因子身份认证。  相对来说,ASP.NET 中提供了专门的处理客户端数字证书的 HttpClientCertificate 类,因而在程序中处理也更为方便一些。
    现在大家基本上都装了 JDK 了吧,Java 中生成数字证书也很简单的。 1、创建证书 Java 中的 keytool.exe (位于 JDK\Bin 目录下)可以用来创建数字证书,所有的数字证书是以一条一条(采用别名区别)的形式存入证书库的中,证书库中的一条证书包含该条证书的私钥,公钥和对应的数字证书的信息。证书库中的一条证书可以导出数字证书文件,数字证书文件只包括主体信息和对应的公钥。 每一个证书库是一个文件组成,它有访问密码,在首次创建时,它会自动生成证书库,并要求指定访问证书库的密码。 在创建证书的的时候,需要填写证书的一些信息和证书对应的私钥密码。这些信息包括 CN=xx,OU=xx,O=xx,L=xx,ST=xx,C=xx,它们的意思是: CN(Common Name - 名字与姓氏) 
    OU(Organization Unit - 组织单位名称) 
    O(Organization - 组织名称) 
    L(Locality - 城市或区域名称) 
    ST(State - 州或省份名称) 
    C(Country - 国家名称) 可以采用交互式让工具提示输入以上信息,也可以采用参数,如:-dname “CN=xx,OU=xx,O=xx,L=xx,ST=xx,C=xx”来自动创建。 如下所示一句采用交互式创建一个证书,指定证书库为 BocsoftKeyLib,创建别名为 TestCertification 的一条证书,它指定用 RSA 算法生成,且指定密钥长度为 1024,证书有效期为 1 年: C:\JDK1.4\Bin\KeyStore>keytool -genkey -alias TestCertification -keyalg RSA -keysize 1024 -keystore BocsoftKeyLib -validity 365 
    2.证书的操作 1)证书的显示 使用如下命令: keytool –list –keystore BocsoftKeyLib 将显示 BocsoftKeyLib 证书库的的所有证书列表: 将证书导出到证书文件 使用命令:keytool -export -alias TestCertification -file TC.cer -keystore BocsoftKeyLib 将把证书库 BocsoftKeyLib 中的别名为 TestCertification 的证书导出到 TC.cer 证书文件中,它包含证书主体的信息及证书的公钥,不包括私钥,可以公开。 导出的证书文件是以二进制编码文件,无法用文本编辑器正确显示,可以加上 -rfc参数以一种可打印的编者编码输出。 如: keytool -export -alias TestCertification -file TC.cer -keystore BocsoftKeyLib -storepass 123456 –rfc 这个命令在命令行中指定了证书库的访问密码,同时指定以可查看编码的方式输出。 2)通过证书文件查看证书的信息 通过命令: keytool –printcert –file TC.cer 可以查看证书文件的信息。 也可以在 Windows 资源管理器中双击产生的证书文件直接查看。 3)证书条目的删除 keytool的命令行参数 -delete 可以删除密钥库中的条目,如: keytool -delete -alias TestCertification -keystore BocsoftKeyLib,这条命令将 BocsoftKeyLib 库中的 TestCertification 这一条证书删除了。 4)证书条目口令的修改 使用 -keypasswd 参数,如:keytool –keypasswd –alias TestCertification –keystore BocsoftKeyLib,可以以交互的方式修改 BocsoftKeyLib 证书库中的条目为 TestCertification 的证书。 Keytool –keypasswd –alias TestCertification –keypass 654321 –new 123456 –storepass 888888 –keystore BocsoftKeyLib 这一行命令以非交互式的方式修改库中别名为 TestCertification 的证书的密码为新密码 654321,行中的 123456 是指该条证书的原密码, 888888 是指证书库的密码。 
      

  2.   

    更细致的可以看下MSDN中关于HttpRequest.ClientCertificate的介绍
      

  3.   

    努力中,问题依然没有解决,现在知道了
    typedef struct _CERT_EXTENSION {  LPSTR pszObjId;  BOOL fCritical;  CRYPT_OBJID_BLOB Value;
    } CERT_EXTENSION
    但是却不知道怎么CRYPT_OBJID_BLOB value 可识别。
    依然郁闷中