Шаг 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 сделал.