Добавление SSL-сертификата через «netsh.exe» не продолжается после перезагрузки компьютера - PullRequest
3 голосов
/ 15 марта 2012

В настоящее время я создаю приложение ASP.Net MVC 3 eccomerce, которое использует IIS Express для моего сервера разработки.

Поскольку мы принимаем платежи через приложение, нам необходимо принудительно установить SSL-соединения для процесса проверки.

После прочтения хорошо написанной статьи Скотта Хансельмана о том, как настроить самозаверяющие SSL-сертификаты для использования с IIS Express, я могу получить доступ к своему сайту через оба:

Это все соус, пока я не перезапущу.Кажется, что каждый раз, когда я перезагружаюсь (по какой-либо причине), мне нужно снова запускать следующие команды:

netsh http delete sslcert ipport=0.0.0.0:443
netsh http add sslcert ipport=0.0.0.0:443 appid={214124cd-d05b-4309-9af9-9caa44b2b74a} certhash=<thumbprint from Certificate Manager>

Я пытался экспортировать и импортировать сгенерированный сертификат, а также перетащить сертификат из личного хранилища.доверенным корневым центрам сертификации.Оба безрезультатно.

У кого-нибудь есть идеи?

Ответы [ 4 ]

1 голос
/ 30 сентября 2013

Эта проблема упоминается несколькими людьми в комментариях к http://www.hanselman.com/blog/WorkingWithSSLAtDevelopmentTimeIsEasierWithIISExpress.aspx

Последний комментарий:

Я думаю, переместив самоподписанный сертификат с Личного на ДоверенныйКорневой каталог CA вызывает проблему, из-за которой перестает работать SSL после того, как разработчики перезагрузят свои машины.(Не знаю, как это происходит, но это происходит последовательно.) Я наконец-то обошел эту проблему, экспортировав и повторно импортировав самоподписанный сертификат в доверенный корневой каталог (вместо того, чтобы просто перетаскивать его).Теперь мой самоподписанный сертификат считается, и мне не нужно переустанавливать / ремонтировать IIS Express каждый раз, когда я перезагружаю машину.

0 голосов
/ 09 октября 2015

Ниже приведен сценарий PowerShell, который может удалить существующий сертификат, а затем создать и привязать новый самозаверяющий сертификат к IIS 8.0 Express. PowerShell, который вы запускаете для запуска, должен использовать Запуск от имени администратора. Я использую его для увеличения размера ключа по умолчанию с 1024-битного до 4096-битного.

# NOTE: This script MUST use Run as Administrator to work correctly.
# This script works with IIS 8.0 Express.
$currentIdentity=[System.Security.Principal.WindowsIdentity]::GetCurrent()
$currentPrincipal=new-object System.Security.Principal.WindowsPrincipal($currentIdentity)
$adminRole = [System.Security.Principal.WindowsBuiltInRole]::Administrator

if (($currentPrincipal -eq $null) -or ($currentPrincipal.IsInRole($adminRole) -eq $false))
{
    Write-Error "This script must be run with Admnistrator privileges."
    exit
}

$iisExpressAppId = "{214124cd-d05b-4309-9af9-9caa44b2b74a}"
$iisExpressCertFriendlyName = "IIS Express Development Certificate"

# Get the current IIS Express certificate and remove it if it exists
$iisExpressCert = Get-ChildItem Cert:\LocalMachine\My | ? { $_.FriendlyName -eq $iisExpressCertFriendlyName }

if ($iisExpressCert -ne $null)
{
    Remove-Item $iisExpressCert.PSPath
}

# Create a new self-signed server certificate with a 4096-bit key
& "C:\Program Files (x86)\Windows Kits\8.1\bin\x86\makecert.exe" -r -pe -n "CN=localhost" -m 60 -ss My -sr LocalMachine -sky Exchange -eku 1.3.6.1.5.5.7.3.1 -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12 -a sha512 -len 4096

# Get the newly generated server certificate
$iisExpressCert = Get-ChildItem Cert:\LocalMachine\My | ? { $_.Subject -eq "CN=localhost" -and [DateTime]::Parse($_.GetEffectiveDateString()).Date -eq [DateTime]::Today }

if ($iisExpressCert -ne $null)
{
    # Change the friendly name of the new certificate.
    $iisExpressCert.FriendlyName = $iisExpressCertFriendlyName

    # Iterate through the IIS Express ports removing the old certificate
    # and adding the new one.
    44300..44399 | foreach {
        & "C:\Windows\System32\netsh.exe" http delete sslcert ipport=0.0.0.0:$($_)
        & "C:\Windows\System32\netsh.exe" http add sslcert ipport=0.0.0.0:$($_) certhash=$($iisExpressCert.Thumbprint) appid=$($iisExpressAppId)
    }
}

<# Remove comment tags only if you intend to trust the self-signed cert.
# Adds the Public Certificate to the Trusted Root Certification Authorities.
$iisExpressPublicCert = Get-ChildItem Cert:\LocalMachine\AuthRoot | ? { $_.FriendlyName -eq $iisExpressCertFriendlyName }

if ($iisExpressPublicCert -ne $null)
{
    Remove-Item $iisExpressPublicCert.PSPath
}

$iisExpressPublicCert = New-Object "System.Security.Cryptography.X509Certificates.X509Certificate2" @(,$iisExpressCert.Export("Cert"))
$iisExpressPublicCert.FriendlyName = $iisExpressCertFriendlyName

$trustedCertStore = Get-Item Cert:\LocalMachine\AuthRoot
$trustedCertStore.Open("ReadWrite")
$trustedCertStore.Add($iisExpressPublicCert)
$trustedCertStore.Close()
#>
0 голосов
/ 12 июня 2014

Несколько комментариев.

Сначала вы можете получить отпечаток IIS Express, не используя MMC, с помощью следующей команды:

powershell -command "& {get-childitem -path cert: \ localmachine \ my | where-object {$ .FriendlyName -match 'Сертификат разработки IIS Express'} |% {$ .Thumbprint}} "

Как объяснено в http://msdn.microsoft.com/en-us/library/ms733791.aspx, вы используете отпечаток большого пальца в команде для netsh. Вы можете использовать вышеупомянутую технику powershell для создания правильной команды netsh для вашей конкретной установки IIS Express.

Давайте добавим к вышеприведенной команде и выведем правильную команду netsh для порта 443:

powershell -command "& {get-childitem -path cert: \ localmachine \ my | where-object {$ .FriendlyName -match 'Сертификат разработки IIS Express'} |% {'netsh http add sslcert ipport = 0.0.0.0: 443 appid = {214124cd-d05b-4309-9af9-9caa44b2b74a} certhash = '+ $ .Thumbprint}} "

Это отобразит полную команду netsh, которую вы должны использовать. Вы можете скопировать / вставить его и вызвать его самостоятельно. Вы также можете добавить ** | cmd.exe ** для вышеуказанной команды, чтобы вызвать его автоматически. Давайте сделаем это. Ниже приведенная выше команда PowerShell готова для копирования / вставки в командную строку администратора для установки привязки локального порта 443 к локальному сертификату IIS Express:

powershell -command "& {get-childitem -path cert: \ localmachine \ my | where-object {$ .FriendlyName -match 'Сертификат разработки IIS Express'} |% {'netsh http add sslcert ipport = 0.0.0.0: 443 appid = {214124cd-d05b-4309-9af9-9caa44b2b74a} certhash = '+ $ .Thumbprint}} "| cmd.exe

0 голосов
/ 16 марта 2012

Вы импортировали сертификат в магазин currentuser или LocalMachine? Похоже, если вы импортируете сертификат в хранилище CurrentUser, эта проблема возникнет. Взгляните на следующую ветку http://social.msdn.microsoft.com/Forums/en/wcf/thread/9e560c64-c53a-4de5-80d5-d2231ba8bcb1

...