对用作 ActiveX 控件的 .NET DLL 进行签名

Posted

技术标签:

【中文标题】对用作 ActiveX 控件的 .NET DLL 进行签名【英文标题】:Signing .NET DLL used as ActiveX Control 【发布时间】:2011-03-09 14:46:37 【问题描述】:

我有一个 COM 可见的 .NET DLL 文件,它在 Internet Explorer 中显示的网页中用作 ActiveX 控件。

当通过网页中的 javascript 代码调用时,控件本身运行良好(尽管有一些警告)。

问题在于对 DLL 进行签名并使其可靠地访问。我(据我所知)在 Visual Studio 中签署项目。在项目的“签名”属性中,我创建了一个 .pfx 文件并使用它来签署 DLL。

在 Internet Explorer 中,无论我做什么,我都无法让 Internet Explorer 让 ActiveX 控件加载,而无需手动进入安全设置并更改“下载未签名的 ActiveX 控件”和“初始化和脚本 ActiveX 控件不标记为启用/提示的脚本安全选项。

【问题讨论】:

请明确提出您的问题 【参考方案1】:

似乎最初的问题与文件的签名无关,而是在 IObjectSafety 的实现中。为了让 IE 能够加载它,我需要正确实现该接口,并且它工作正常(即使没有有效的签名)。

简单示例:

[ComImport()]
[Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IObjectSafety

    [PreserveSig()]
    int GetInterfaceSafetyOptions(ref Guid riid, out int pdwSupportedOptions, out int pdwEnabledOptions);

    [PreserveSig()]
    int SetInterfaceSafetyOptions(ref Guid riid, int dwOptionSetMask, int dwEnabledOptions);

还有课程本身:

[ProgId("Testing.Test")]
[ClassInterface(ClassInterfaceType.AutoDispatch)]
[ComVisible(true)]
public sealed class Test : IObjectSafety

    #region Saftey Interface
    private const int INTERFACESAFE_FOR_UNTRUSTED_CALLER = 0x00000001;
    private const int INTERFACESAFE_FOR_UNTRUSTED_DATA = 0x00000002;
    private const int S_OK = 0;

    [ComVisible(true)]
    public int GetInterfaceSafetyOptions(ref Guid riid, out int pdwSupportedOptions, out int pdwEnabledOptions)
    
        pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;
        pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;
        return S_OK;
    

    [ComVisible(true)]
    public int SetInterfaceSafetyOptions(ref Guid riid, int dwOptionSetMask, int dwEnabledOptions)
    
        return S_OK;
    
    #endregion

    [ComVisible(true)]
    public string TestString
    
        get
        
            return 'A Test';
        
    

【讨论】:

【参考方案2】:

要让 IE 下载签名的 ActiveX 控件,它必须信任签名,即证书必须是由 Internet Explorer 中列出的受信任的根证书颁发机构之一颁发的代码签名证书。 (请参阅工具 | Internet 选项 | 内容 | 证书。)

如果您希望它在任何地方都能正常工作,您需要从预安装的 Trusted Roots(例如 Verisign)购买证书。

如果打算在 Intranet 上工作,您的公司可以创建自己的自签名证书并将其推送到所有浏览器。

如果您只是测试,您可以创建自己的自签名根并自己安装在 IE 中。

(即使签名正确,我也不确定最新版本的 IE 是否会在不先询问用户的情况下自动安装任何 ActiveX 控件。)

【讨论】:

好的 - 我不介意它是否询问用户 - 我只需要不修改该步骤的安全设置。我有一个付费证书,但它很旧(可能是 2005 年?)并且在使用它签名时遇到问题。我将研究为什么会失败,然后像你提到的那样添加我的自签名证书。谢谢。 它们通常只持续一两年。如果您右键单击已签名的 DLL 并选择属性,然后选择数字签名,您可以看到您所拥有的。 如果它没有数字签名选项卡,是否意味着它没有正确签名?我拥有的当前 DLL(由临时密钥签名)在其属性中没有类似的东西。 可能。如果您没有签名,signtool 会确定告诉您:msdn.microsoft.com/en-us/library/aa388171%28VS.85%29.aspx 好的。我运行了您指向我的工具,但验证它时出错。 “WinVerifyTrust 返回错误:0x00000057 参数不正确。”。我将假设这意味着它没有被正确签名并沿着这条路走下去。我按照您的建议将证书添加到了受信任的部分,并且遇到了同样的问题。这些证书似乎有些不对劲。

以上是关于对用作 ActiveX 控件的 .NET DLL 进行签名的主要内容,如果未能解决你的问题,请参考以下文章

如何在asp.net用户控件(ascx)中插入activex

盗墓笔记—阿里旺旺ActiveX控件imageMan.dll栈溢出漏洞研究

C++基于ATL工程编写ActiveX控件步骤

阿里旺旺ActiveX控件ImageMan溢出

阿里旺旺ActiveX控件ImageMan溢出

关于activex控件问题