从.NET COM库解码ASP Request.ClientCertificate(“Certificate”)

时间:2011-07-12 17:14:46

标签: c# asp.net com ssl x509certificate2

为了进一步完善我的问题,这是第三次重写。简而言之就是这个场景。

  1. 旧版ASP / VBscript网站
  2. ASP站点中使用的.NET / C#COM库
  3. 我想将原始格式的Request.ClientCertificate(“Certificate”)发送到我的.NET COM库并对其进行解码,以便根据Active Directory中的客户端证书验证字段。

    • Request.ClientCertificate(“Certificate”)的documentation表示它是二进制数据的字符串,表示ASN.1格式的证书。我接收到它的.NET方法有一个参数的字符串类型。我尝试使用 Encoding.UTF8.GetBytes Encoding.Unicode.GetBytes Encoding.ASCII.GetBytes 将其转换为字节[ ] X509Certificate2 构造函数需要。
  4. 我已经尝试在谷歌搜索我可以找到的关于如何做一些有用的(即解码)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”)。

3 个答案:

答案 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来提取所需的信息然后传递它,你可能会更好。