2016-01-15 2 views
0

Я разрабатываю собственное приложение .NET для частного предприятия, которое распространяется через ClickOnce через HTTP. Одна из проблем, которые у меня были, - SmartScreenFilter (встроенный в Win 8/10), мешающий обновлениям. После каждого обновления для запуска обновленного приложения впервые потребуются права администратора (пароль).ClickOnce обходит SmartScreenFilter во время обновлений с самозаверяющими сертификатами

Ссылаясь на эти ссылки - Link1, Link2 - и немного проб и ошибок я смог обойти SmartScreenFilter.

Essentialy Мне нужно было создать самозаверяющие доверенные сертификаты для подписи моего приложения, а затем установить эти сертификаты при первом запуске. Теперь от него не обойтись, но из-за самоподписанных сертификатов новым машинам потребуются права администратора (вам нужно ввести пароль 3 раза на самом деле). Но для корпоративного использования, где «вы» сами настраиваете машины и устанавливаете приложения, это нормально.

Подробности в ответ:

ответ

0

Шаг 1: создать собственные сертификаты

1) Нам нужны два из них. Первым будет Центр сертификации, а второй будет фактическим сертификатом, используемым для подписания приложения. Обратитесь к Link2 за дополнительной информацией. Я использовал следующие команды:

(открыть Visual Studio Developer командной строки с правами администратора)

makecert -sv c:\users\Marko\Desktop\CA.pvk -pe -r -n "CN=My Certificate Authority" -sky signature -a sha512 -e 12/31/2099 -cy authority -ss My -sr LocalMachine c:\users\Marko\Desktop\CA.cer 

makecert -sv c:\users\Marko\Desktop\cert.pvk -ss My -sr Localmachine -pe -n "CN=MyPublisherName" -eku "1.3.6.1.5.5.7.3.3,1.3.6.1.4.1.311.10.3.13" -sky signature -a sha512 -e 12/31/2099 -in "My Certificate Authority" -is My -ir LocalMachine c:\users\Marko\Desktop\cert.cer 

cert2spc c:\Users\Marko\Desktop\cert.cer c:\Users\Marko\Desktop\cert.spc 

pvk2pfx -pvk c:\Users\Marko\Desktop\cert.pvk -pi mypassword -spc c:\users\Marko\Desktop\cert.spc -pfx c:\users\Marko\Desktop\cert.pfx -po mypassword 

Убедитесь, что вы используете один и тот же mypassword для всех запросов пароля. Также изменяйте свои пути папок в этих командах.

Шаг 2: подписывать сборки приложений, манифестов и .exe

В Visual Studio, импорт/добавить cert.pfx файл к вашему решению. Перейти к категории Проект объектов недвижимости ->Подписание tab. Установите флажок Sign the ClickOnce manifests и используйте файл cert.pfx для подписания (Select from file). Затем отметьте галочкой Sign the assembly и выберите файл cert.pfx из выпадающего списка.

Ссылаясь на Link1, добавьте задачу Post-Build для подписания .exe. Я выбираю вариант Post-Build, потому что он был самым простым, также у меня не было проблем с «хешем подписи, не соответствующим манифесту», как описано here. Я использовал следующую команду в Visual Studio Project свойства ->Строительные события вкладка ->после создания раздел:

"C:\Program Files (x86)\Windows Kits\10\bin\x64\signtool.exe" sign /f "$(ProjectDir)cert.pfx" /p mypassword /v "$(ProjectDir)obj\$(ConfigurationName)\$(TargetFileName)" 

Шаг 3: шунтирование SmartScreenFilter путем импорта сертификатов при первом запуске

Это ключевая часть. Нам необходимо импортировать наши сертификаты в магазины Local Machine\Root и Local Machine\TrustedPublisher. Прежде всего, добавьте CA.cer и cert.cer файлов к решению.Установите их Build Action на Content и Скопируйте в выходной каталог до Copy if newer. Тогда под Project свойства ->Pulish вкладки ->файлов приложения кнопки -> (отметьте Show all files) установить файлы .CER в Publish Status = Data File.

Для фактического импорта, я вызывается PowerShell в обработчик событий Window_Loaded():

if (MyApp.Properties.Settings.Default.FirstRun) // I used a custom project setting called 'FirstRun' 
{ 
    try 
    { 
     using (System.Diagnostics.Process prcs = new System.Diagnostics.Process()) // import certificates 
     { 
      var dir = (ApplicationDeployment.IsNetworkDeployed ? ApplicationDeployment.CurrentDeployment.DataDirectory : 
       System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location)); 

      var filePath = System.IO.Path.Combine(dir, "CA.cer"); 
      var filePath2 = System.IO.Path.Combine(dir, "cert.cer"); 

      prcs.StartInfo.Verb = "runas"; 
      prcs.StartInfo.FileName = "powershell.exe"; 
      prcs.StartInfo.Arguments = "Import-Certificate -Filepath '" + filePath + "' -CertStoreLocation cert:\\LocalMachine\\Root;" + 
       "Import-Certificate -Filepath '" + filePath + "' -CertStoreLocation cert:\\LocalMachine\\TrustedPublisher;" + 
       "Import-Certificate -Filepath '" + filePath2 + "' -CertStoreLocation cert:\\LocalMachine\\Root;" + 
       "Import-Certificate -Filepath '" + filePath2 + "' -CertStoreLocation cert:\\LocalMachine\\TrustedPublisher"; 
      prcs.Start(); 
      prcs.WaitForExit(); 
     } 

     MyApp.Properties.Settings.Default.FirstRun = false; 
     MyApp.Properties.Settings.Default.Save(); 
    } 
    catch (Exception ex) // if you cancel the UAC dialog for instance 
    { 
     MessageBox.Show(ex.ToString()); 
     this.Close(); 
    } 
} 

Конечный результат:

Под Win 10, стандартный локальной учетной записи пользователя.
Если я выйду из опубликованного URL-адреса своего приложения (http://somedomain.com/MyApp), нажмите кнопку «Установить», программа Setup.exe будет загружена. Edge, конечно, предупредит, что этот файл обычно не загружается = Run в любом случае.

Первый запрос на ввод пароля = запуск setup.exe (SmartScreenFilter мешает)
Второй запрос пароля = работает установленное приложение (SmartScreenFilter мешает)
Третий запрос на ввод пароля = работает PowerShell в качестве АДМИНИСТРАТОРА.

Но, если я теперь опубликовать новую версию своего приложения, то не больше паролей подсказки, приложение не обновляется и побежал без SmartScreenFilter вмешательства :)

Конечная нота:

Просто импортировать CA .cer не помог, несмотря на то, что cert.cer теперь доверяют. Но импорт обоих CA.cer и cert.cer сделал.

Смежные вопросы