为了进一步完善我的问题,这是第三次重写。简而言之,这是一个场景。
- 旧版 ASP/VBscript 网站
- .NET / C# COM 库,用于 ASP 站点
我想将原始形式的 Request.ClientCertificate("Certificate") 发送到我的 .NET COM 库并对其进行解码,以便我可以根据 Active Directory 中的客户端证书验证字段。
- Request.ClientCertificate("Certificate")的文档说它是代表 ASN.1 格式证书的二进制数据字符串。我的 .NET 方法接收这个参数有一个字符串类型。我尝试使用Encoding.UTF8.GetBytes、Encoding.Unicode.GetBytes和Encoding.ASCII.GetBytes将其转换为X509Certificate2构造函数期望的字节[] 。
我尝试在 Google 上搜索我能找到的关于如何以原始形式对 ASP Request.ClientCertificate 做一些有用的事情(即解码)的每一条信息,但结果都是空的。我还将这些数据保存到一个文件中,并尝试使用 CertUtil 对其进行解码,但它仍然无法解码数据并且只是出错。
当我继续玩这个时,我决定查看 ASP 和 ASP.NET 返回的客户端证书的大小,发现大小不匹配。我来自 ASP 的证书在 ASP.NET 中是 647 字节和 1295 字节。我不知道为什么两个环境之间的大小会出现偏差。因此,无论使用 X509Certicate2 类解码 ASP.NET 返回的客户端证书,我都没有任何问题。
我也尝试过使用以下 p/invoked 函数:
[DllImport("crypt32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern uint CertCreateCertificateContext(uint dwCertEncodingType,
byte[] pbCertEncoded, uint cbCertEncoded);
因此,在使用 X509Certificate、X509Certificate2 和上面的函数的任何一种情况下,我都会得到一致的结果,来自 ASP 的证书不能被这些函数使用。当我尝试使用代表证书的 byte[] 构造它时,X509Certificate 类只会引发异常。
我尝试使用 CAPICOM 库导入证书,但得到的异常与 X509Certificate2 类给我的异常完全相同。
找不到请求的对象
所以总而言之,我想要做的是,利用 X509Certificate 类集从 .NET / C# COM 库中解码 ASP Request.ClientCertificate("Certificate")。