4

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

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

在阅读了Scott Hanselman关于如何设置用于 IIS Express 的自签名 SSL 证书的文章后,我可以通过以下两种方式访问​​我的网站:

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

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

4 回答 4

1

这个问题有几个人在 http://www.hanselman.com/blog/WorkingWithSSLAtDevelopmentTimeIsEasierWithIISExpress.aspx的评论中提到

最后的评论是:

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

于 2013-09-30T15:00:10.867 回答
0

几点评论。

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

powershell -command "& {get-childitem -path cert:\localmachine\my | where-object {$ .FriendlyName -match 'IIS Express Development Certificate'} | % { $ .Thumbprint}}"

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

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

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} certash='+$ .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} certash='+$ .Thumbprint}}" | 命令文件

于 2014-06-11T20:20:13.830 回答
0

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

于 2012-03-16T03:16:49.337 回答
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()
#>
于 2015-10-08T21:37:10.007 回答