c# - 从 .NET COM 库解码 ASP Request.ClientCertificate ("Certificate")

标签 c# asp.net com ssl x509certificate2

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

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

    • documentation for 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 字节。我不知道为什么大小在两种环境之间存在偏差。因此,我没有任何问题解码 ASP.NET 使用 X509Certicate2 类返回的客户端证书。

我也试过使用下面的 p/invoked 函数:

[DllImport("crypt32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern uint CertCreateCertificateContext(uint dwCertEncodingType, 
  byte[] pbCertEncoded, uint cbCertEncoded);

因此,在使用 X509Certificate、X509Certificate2 和上述函数的任何一种情况下,我都会得到一致的结果,这些函数无法使用来自 ASP 的证书。 X509Certificate 类在我尝试使用代表证书的 byte[] 构造它时抛出异常。

我已经尝试使用 CAPICOM 库导入证书,但我得到了 X509Certificate2 类给我的完全相同的异常。

找不到请求的对象

总而言之,我想做的是,利用 X509Certificate 类集从 .NET/C# COM 库中解码 ASP Request.ClientCertificate("Certificate")。

最佳答案

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

关于c# - 从 .NET COM 库解码 ASP Request.ClientCertificate ("Certificate"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6668232/

相关文章:

c# - .NET 中的异常处理和日志记录策略

c# - 从 Python 运行 .NET COM 程序集。程序集 dll 的 Python 路径?

c - 如何在纯 C 中使用 IDispatch 调用 COM 对象

C# Visual Studio 单元测试,模拟客户端 IP 地址

c# - 2 个项目上的 Webapi 2 Controller

javascript - 为什么模型和 Controller 的概念混合在 Angular.JS 中?

asp.net - 如何使用 Visual Studio 2017 分析 ASP.NET IIS Web 应用程序的性能?

c# - 在 .NET 中接收 SENS 事件

c# - 排除包含另一个列表中的值的列表项

c# - 如何在 TFS 自定义构建事件中获取构建项目