Почему ActiveX «Неизвестный издатель» ошибка при использовании подписанного сертификата? - PullRequest
1 голос
/ 10 октября 2010

Я несколько дней пытался заставить простую DLL-библиотеку ActiveX работать безуспешно, несмотря на изучение нескольких статей на эту тему, которые я нашел в Интернете.

Я подозреваю, что имеюнекоторые вещи закодированы неправильно, так как я просто не знаком с этим, и большинство статей на эту тему устарели.Я использую Visual Studio 2008 и использую Windows SDK v7.1 для цифровой подписи.

Я пытаюсь вернуть клиентское имя машины изкласс среды возвращается на веб-страницу (и в конечном итоге обратно на веб-сервер).

Это мой класс 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>

В любом случае, это был кошмар, пытаясь собрать воедино все детали этого. Я был бы очень признателен за любую помощь в решении этого вопроса.

OK, Код проекта статья Полное учебное руководство по веб-элементам управления ActiveX с использованием сценариев с использованием 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» в Trusted Root Certs:

signtool verify /v /a GetClientInfoAX.cab

Обратите внимание, что я скопировалмоя DLL в моей папке Windows SDK, подписала это, скопировала его обратно в мой файл cab, который я затем скопировал в мой файл SDK, подписала файл cab.Затем, наконец, я скопировал файл cab в свой проект веб-сайта.

ПРИМЕЧАНИЕ. См. Комментарии в конце первого ответа.Я приобрел подписанный сертификат у Comodo и, установив его, теперь получаю сообщение об ошибке «Неизвестный издатель», даже если статус сертификата «ОК».И DLL, и CAB-файл были подписаны.

Я считаю, что моя проблема сейчас заключается в том, что элемент управления должен быть помечен как безопасный для сценариев.Я нашел недавнюю статью, Создание элемента управления ActiveX в .NET с использованием C # , которая выглядит очень полезной.

1 Ответ

0 голосов
/ 11 октября 2010

Ваш независимый от версии progid в классе ComVisible co установлен как

  [ProgId("getClientInfoAx.CGetClient")] 

В то время как в коде JScript код экземпляра имеет вид

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

Сначала проверьте чувствительность к регистру и подтвердитеповедение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...