Подписать манифест ClickOnce через TFS Build 2008? - PullRequest
6 голосов
/ 19 мая 2011

У меня проблема с выяснением, как "Подписать манифесты ClickOnce" моего приложения из TFS Build.

Я настроил свою страницу подписи в VS 2010, установив флажок «Подписывать манифесты ClickOnce» и выбрав ключ подписи кода из файла, как показано на снимке экрана ниже:

Signing page in VS 2010

Теперь, когда я публикую приложение из VS 2010, манифест, кажется, успешно подписан:

security warning showing good certificate

Однако, когда я пытаюсь собрать приложение из TFS Build, оно не пытается подписать манифест. На самом деле, даже нет сообщения об ошибке, указывающего, что что-то не удалось.

Я попытался настроить файл TFSBuild.proj , чтобы мой сервер сборки знал о сертификате и чтобы я хотел подписать свои манифесты, но я не знал, как это сделать.

Я пробовал следующее:

<CustomPropertiesForBuild>SignManifests=true;ManifestCertificateThumbprint=<thumbprint goes here></CustomPropertiesForBuild>

Но, похоже, это ничего не меняет. (Ошибки также не генерируются).

Примечание: Я не заинтересован в строгом именовании моих сборок; просто подписываю мой код .

Кто-нибудь знает, как это сделать? Кто-нибудь успешно развернул приложения ClickOnce из TFS Build?

Ответы [ 2 ]

6 голосов
/ 19 мая 2011

Пока что единственный способ, которым я смог подписать свой код через TFSBuild, - это запустить инструмент для подписи кода в командной строке. Это в основном включает три шага:

  1. Импортируйте сертификат на компьютер сборки, войдя в систему под учетной записью TFSService, которую вы используете для запуска TFSBuild. После того, как вы получили импортированный сертификат, вам нужно зайти в Cert Manager, чтобы получить его отпечаток (я думаю, он называется «хэш» в пользовательском интерфейсе диспетчера сертификатов).

  2. Добавьте цель к вашему .csproj / .wixproj / .wheverproj, который находит signtool.exe и запускает его:

    <Target Name="SignOutput">
      <PropertyGroup>
        <WindowsSdkDir>$(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\@CurrentInstallFolder)</WindowsSdkDir>
        <WindowsSdkDir Condition="'$(WindowsSdkDir)' != '' and !HasTrailingSlash('$(WindowsSdkDir)')">$(WindowsSdkDir)\</WindowsSdkDir>
        <SignToolPath>$(WindowsSdkDir)bin\signtool.exe</SignToolPath>
        <Hash>...</Hash>
        <TsUrl>http://timestamp.verisign.com/scripts/timstamp.dll</TsUrl>
      </PropertyGroup>
      <ItemGroup>
        <SignableFiles Include="$(TargetDir)\Setup.msi" />
        <SignableFiles Include="$(TargetDir)\Data.cab" />
      </ItemGroup>
      <ResolveKeySource CertificateThumbprint="$(Hash)">
          <Output TaskParameter="ResolvedThumbprint" PropertyName="LocatedThumbprint"/>
      </ResolveKeySource>
      <Exec Condition="'$(LocatedThumbprint)' != '' and Exists('$(SignToolPath)')" ContinueOnError="true" Command="'$(SignToolPath)' sign /q /sha1 $(LocatedThumbprint) /t $(TsUrl) '%(SignableFiles.Identity)'" />
    </Target>
    
  3. Позвоните вашей новой цели в соответствующее время; мы подписываем только релизные сборки, поэтому делаем это:

    <Target Name="AfterBuild">
      <CallTarget Targets="SignOutput" Condition="'$(ConfigurationName)' == 'Release'" />
    </Target>
    

Этот метод также работает на машинах разработчика, если на них установлены надлежащие инструменты SDK. Если они этого не сделают, он просто пропустит шаг подписания, который для нас работал нормально.

0 голосов
/ 15 декабря 2011

Я сделал это для нескольких клиентов, где создал общую задачу MSBuild «Execute Powershell», а затем проделал тяжелую работу для таких вещей с помощью скриптов Powershell, вызываемых TFS Build 2008.

...