使用签名证书时为什么ActiveX“Unknown Publisher”出错?

时间:2010-10-10 03:38:15

标签: asp.net com dll activex authenticode

尽管已经在网上找到了几篇关于这个主题的文章,但我一直在努力争取一个简单的ActiveX DLL工作,但没有成功。

我怀疑我有几件事情编码不正确,因为我对此并不熟悉,而且关于这个主题的大部分文章已经过时了。我正在使用Visual Studio 2008并一直使用Windows SDK v7.1进行数字签名。

我要做的是将客户端machineName从环境类返回到网页(最终返回到Web服务器)。

这是我的C#课程:

using System;
using System.Reflection;
using System.Runtime.InteropServices;
using System.ComponentModel;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using Microsoft.Win32;

namespace GetClientInfo101
{
    [Guid("121C3E0E-DC6E-45dc-952B-A6617F0FAA32")]
    [InterfaceType(ComInterfaceType.InterfaceIsDual)]
    [ComVisible(true)]
    public interface IGetClient
    {
        [DispId(1)]
        string GetClient();
    }
    [Guid("5085C918-0236-4828-BDFA-063FEE57C69B")]
    [ProgId("getClientInfoAx.CGetClient")]
    [ClassInterface(ClassInterfaceType.None)]
    [ComDefaultInterface(typeof(IGetClient))]
    [System.ComponentModel.ToolboxItem(true)]
    [ComVisible(true)]
    public class CGetClient : IGetClient
    {
        public string GetClient()
        {
           return Environment.MachineName;
        }
    }
}

这是我的集会:

using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("GetClientInfo101")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("GetClientInfo101")]
[assembly: AssemblyCopyright("Copyright © N/A 2010")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

// Setting ComVisible to false makes the types in this assembly not visible
// to COM components.  If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]

// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("1bf2a0bc-f9cb-4f68-8990-5caaf3ab525d")]

// Version information for an assembly consists of the following four values:
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")

这是我的网站母版页上的对象标记和脚本。 **注意:我收到错误

  

Microsoft JScript运行时错误:自动化服务器无法创建对象

关于“var”执行**:

<object id="getClientInfo" name="GetClientInfo101" classid="clsid:5085C918-0236-4828-BDFA-063FEE57C69B"
        codebase="GetClientInfo/GetClientInfoAX.cab#version=1,0,0,0">
</object>

<script type="text/javascript">
    function OpenActiveX()
    {
        var objGetClientInfo = new ActiveXObject("GetClientInfoAx.CGetClient");
        if(objGetClientInfo != null)
         {
             //For testing only
             alert(objGetClientInfo.GetClient());
         }
     }
</script>

然后我手动创建了一个.inf文件,如下所示:

[version]
    signature="$CHICAGO$"
    AdvancedINF=2.0
[Add.Code]
    GetClientInfo101.dll=GetClientInfo101.dll
    GetClientInfo101.inf=GetClientInfo101.inf
[GetClientInfo101.dll]
    file-win32-x86=thiscab
    clsid={5085C918-0236-4828-BDFA-063FEE57C69B}
    FileVersion=1,0,0,0
    RegisterServer=yes
[GetClientInfo101.inf]
    file=thiscab

但是,当我构建我的.cab文件时,我还会向.OSD收到.cab个文件输出,如下所示(我担心同时存在.inf和同一.OSD文件中的.cab文件。这是正确的,是否会导致问题?我不知道如何告诉Visual Studio不构建.OSD文件。

<?XML version="1.0" ENCODING='UTF-8'?>
<!DOCTYPE SOFTPKG SYSTEM "http://www.microsoft.com/standards/osd/osd.dtd">
<?XML::namespace href="http://www.microsoft.com/standards/osd/msicd.dtd" as="MSICD"?>
<SOFTPKG NAME="GetClientInfoAX" VERSION="1,0,0,0">
    <TITLE> GetClientInfoAX </TITLE>
    <MSICD::NATIVECODE>
        <CODE NAME="GetClientInfo101">
            <IMPLEMENTATION>
                <CODEBASE FILENAME="GetClientInfo101.dll">
                </CODEBASE>
            </IMPLEMENTATION>
        </CODE>
    </MSICD::NATIVECODE>
</SOFTPKG>

无论如何,这是一场噩梦,试图将所有细节拼凑在一起。我将非常感谢任何帮助解决这个问题。

好的,代码项目文章 A Complete Scriptable ActiveX Web Control Tutorial Using ATL 就是我用来签署.cab文件的指南。请参阅“签署cab文件”一节。

以下是我使用的命令。请注意,我使用Visual Studio来创建cab文件而不是CABARC。另请注意,我只使用测试证书:

makecert -sv "getclientinfocert.pvk" -n "CN=My Company" getclientinfocert.cer

cert2spc getclientinfocert.cer getclientinfocert.spc

pvk2pfx -pvk getclientinfocert.pvk -pi AOTC20467cert -spc getclientinfocert.spc -pfx getclientinfocert.pfx -po AOTC81396pass –f

signtool sign /f getclientinfocert.pfx /p AOTC81396pass /t http://timestamp.verisign.com/scripts/timstamp.dll /v GetClientInfo101.dll

signtool sign /f getclientinfocert.pfx /p AOTC81396pass /t http://timestamp.verisign.com/scripts/timstamp.dll /v GetClientInfoAX.cab

使用certmgr将“Root Agency”证书导出​​并导入受信任的根证书:

signtool verify /v /a GetClientInfoAX.cab

请注意,我将我的DLL复制到我的Windows SDK文件夹,签名,然后将其复制回我的cab文件,然后将其复制到我的SDK文件,签署cab文件。最后,我将cab文件复制到我的网站项目中。

注意:请参阅第一个答案末尾的注释。我已经从Comodo购买了签名证书,并且已经安装了该证书,即使证书状态为“OK”,我现在也会收到“Unknown Publisher”错误。 DLL和CAB文件都已签名。

我认为我现在的问题是需要将控件标记为脚本安全。我发现了最近的一篇文章 Creating an ActiveX control in .NET using C# ,它看起来非常有用。

1 个答案:

答案 0 :(得分:0)

ComVisible co类中与版本无关的progid设置为

  [ProgId("getClientInfoAx.CGetClient")] 

而在JScript代码中,实例化代码为

  var objGetClientInfo = new ActiveXObject("GetClientInfoAx.CGetClient");

请先验证区分大小写并确认行为?