通过“netsh.exe”添加SSL证书在计算机重新启动后不会持续

时间:2012-03-14 22:00:02

标签: ssl-certificate iis-express netsh

我目前正在构建一个ASP.Net MVC 3 eccomerce应用程序,它将IIS Express用于我的开发服务器。

由于我们通过应用程序接受付款,因此我们需要为结帐流程强制执行SSL连接。

关于如何设置用于IIS Express的自签名SSL证书的Scott Hanselman's well written article后,我可以通过以下两种方式访问​​我的网站:

这一切都很重要,直到我重新开始。 似乎每次重启(无论出于何种原因)我都需要再次运行以下命令:

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 个答案:

答案 0 :(得分:1)

有些人在http://www.hanselman.com/blog/WorkingWithSSLAtDevelopmentTimeIsEasierWithIISExpress.aspx

的评论中提到了这个问题

最终评论是:

  

我认为通过将自签名证书从Personal迁移到Trusted Root CA目录会导致SSL在开发人员重新启动计算机后停止工作的问题。 (不知道它是如何发生的,但它确实一直发生。)我终于通过导出解决了这个问题,并将自签名证书重新导入到受信任的根目录(而不是简单地将其拖过)。现在我的自签名证书被考虑了,每次重新启动机器时我都不需要重新安装/修复IIS Express。

答案 1 :(得分:0)

您是否将证书导入currentuser或LocalMachine商店?看起来如果您将证书导入CurrentUser商店会出现此问题。看看以下主题 http://social.msdn.microsoft.com/Forums/en/wcf/thread/9e560c64-c53a-4de5-80d5-d2231ba8bcb1

答案 2 :(得分:0)

一些评论。

首先,您可以使用以下命令在不使用MMC的情况下访问IIS Express指纹:

powershell -command&#34;&amp; {get-childitem -path cert:\ localmachine \ my | where-object {$ .FriendlyName -match&#39; IIS Express开发证书&#39;} | %{$ .Thumbprint}}&#34;

http://msdn.microsoft.com/en-us/library/ms733791.aspx中所述,您可以使用命令中的指纹进行netsh。您可以使用上述powershell技术为特定的IIS Express安装构建正确的netsh命令。

让我们添加上面的命令,让它为端口443输出正确的netsh命令:

powershell -command&#34;&amp; {get-childitem -path cert:\ localmachine \ my | where-object {$ .FriendlyName -match&#39; IIS Express开发证书&#39;} | %{&#39; netsh http add sslcert ipport = 0.0.0.0:443 appid = {214124cd-d05b-4309-9af9-9caa44b2b74a} certhash =&#39; + $ .Thumbprint}}&#34;

这将显示您应该使用的完整netsh命令。您可以复制/粘贴它并自己调用它。你也可以添加** | cmd.exe **以上命令自动调用它。我们这样做吧。下面是上面的PowerShell命令,您可以将其复制/粘贴到Admin命令提示符中,以将本地443端口绑定到本地IIS Express证书:

powershell -command&#34;&amp; {get-childitem -path cert:\ localmachine \ my | where-object {$ .FriendlyName -match&#39; IIS Express开发证书&#39;} | %{&#39; netsh http add sslcert ipport = 0.0.0.0:443 appid = {214124cd-d05b-4309-9af9-9caa44b2b74a} certhash =&#39; + $ .Thumbprint}}&#34; | cmd.exe

答案 3 :(得分:0)

以下是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()
#>