2

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

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

    • Request.ClientCertificate("Certificate")的文档说它是代表 ASN.1 格式证书的二进制数据字符串。我的 .NET 方法接收这个参数有一个字符串类型。我尝试使用Encoding.UTF8.GetBytesEncoding.Unicode.GetBytesEncoding.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")。

4

3 回答 3

1

我终于弄清楚了这个问题,这很简单。我必须使用 ASP 端的 CAPICOM Utilities 类对 Request.ClientCertificate("Certificate") 进行 base 64 编码。一旦我这样做了,调用我的 .NET COM 方法并将 ASCII 转换为 byte[] 并且 X509Certificate2 类在解码证书时没有问题。

于 2011-07-15T16:03:06.330 回答
1

我怀疑问题与证书数据通过您创建的 COM 接口传输时的封送处理有关。请注意,ASP 证书大小 (647) 几乎是 .NET 证书大小 (1295) 的一半。您是否可能无意中将 ASP 端的 8 位字节数组转换为 16 位 Unicode 字符串?这将有助于查看您为解码证书而创建的 COM 服务器的接口定义。

于 2011-07-14T19:45:56.513 回答
0

查看此页面似乎可以获取证书并将其放入 base64 编码的 X509 中。如果将该字符串传递给 .NET 端,则可以从中创建一个字节数组,然后使用X509Certificate2 构造函数创建证书实例。

尽管使用 ASP中证书类的属性来提取您想要的信息,然后将其传递,您可能会更好。

于 2011-07-14T13:47:51.707 回答