签署用作ActiveX控件的.NET DLL

时间:2011-03-09 14:46:38

标签: c# .net internet-explorer activex code-signing

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

当通过网页上的JavaScript代码调用时,控件本身可以正常工作(虽然有一些注意事项)。

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

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

2 个答案:

答案 0 :(得分:5)

似乎原始问题与文件的签名无关,而是在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';
        }
    }
}

答案 1 :(得分:0)

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

如果您希望在任何地方都能使用此功能,则需要从预先安装的受信任根源(例如Verisign)购买证书。

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

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

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