为了进一步完善我的问题,这是第三次重写。简而言之就是这个场景。
我想将原始格式的Request.ClientCertificate(“Certificate”)发送到我的.NET COM库并对其进行解码,以便根据Active Directory中的客户端证书验证字段。
我已经尝试在谷歌搜索我可以找到的关于如何做一些有用的(即解码)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”)。
答案 0 :(得分:1)
我怀疑问题与通过您创建的COM接口传输的证书数据的编组有关。请注意,ASP证书大小(647)几乎是.NET证书大小的一半(1295)。您是否可能无意中将ASP端的8位字节数组转换为16位Unicode字符串?查看已创建的用于解码证书的COM服务器的接口定义将有所帮助。
答案 1 :(得分:1)
我终于找到了问题并且非常简单。我必须使用ASP端的CAPICOM Utilities类对64位编码Request.ClientCertificate(“Certificate”)进行编码。一旦我这样做,称为我的.NET COM方法,ASCII转换为byte [],X509Certificate2类没有解码证书的麻烦。
答案 2 :(得分:0)
查看this page,似乎可以获取证书并将其放入base64编码的X509中。如果将该字符串传递给.NET端,则可以从中创建一个字节数组,然后使用X509Certificate2 constructor创建证书实例。
尽管在ASP中使用properties of the certificate class来提取所需的信息然后传递它,你可能会更好。