連接到啟用了 2 路 SSL 的 Web 伺服器不會在任何瀏覽器中提示輸入證書並返回 403.7 錯誤
我一直在嘗試在 IIS 10 中建立一個具有 2 路 SSL 的網站。它並不是那麼好。
我已經通過 NameCheap 獲得了一個域,並通過 CloudFlare 獲得了 DNS(僅限 DNS,無代理)。
伺服器具有該域的證書,我通過 Certify with Let’s Encrypt 獲得了該證書。
在該伺服器上,我設置了 AD CS 並使用它來創建證書頒發機構。
CA Web Enrollment 處於活動狀態,僅接受來自通過 RRAS 設置的 VPN 連接的請求(我不希望它向 Internet 開放,順便說一句,VPN 連接使用我之前獲得的證書,因此可以正常工作)。
客戶端 PC 啟動證書並使用 CA Web Enrollment 通過 VPN 將其發送到伺服器。然後發出該請求,然後將生成的證書和 CA 分別導入 CurrentUser\My、LocalMachine\TrustedRoot 儲存。我還檢查了客戶端證書是否有私鑰。
到目前為止,證書的情況是:
-伺服器:CA(LocalMachine\TrustedRoot(無密鑰)和LocalMachine\My(密鑰)),伺服器證書(LocalMachine\My(密鑰))。
-客戶端:CA(LocalMachine\TrustedRoot(無密鑰)),客戶端證書(CurrentUser\My(密鑰))。
然後是 IIS 配置:伺服器上有三個站點。第一個是 certsrv 應用程序的預設應用程序,它只偵聽 VPN ip 和 localhost,並且只有帶有伺服器證書的 HTTPS 處於活動狀態(埠均為 443)。第二個是 FTP 站點,它只偵聽 VPN IP 和埠 21。這些無關緊要,我之所以提到它們只是因為我不想遺漏任何內容。
第三個是我們關心的。它偵聽域名、任何 ip,並同時啟動 HTTP 和 HTTPS(分別使用埠 80 和 443)。HTTP 僅處於活動狀態,因此 URL Rewrite 可以將其重定向到 HTTPS,並且 HTTPS 使用伺服器證書。
此站點已啟用 SSL 要求並根據需要啟用客戶端證書。
在身份驗證中,所有方法都被禁用。
在 system.webServer/security/authentication/iisClientCertificateMappingAuthentication 中,我將 Enabled 設置為 true,並且將 manyToOneCertificateMappingsEnabled 設置為 true。在 manyToOneMappings 中,我有一項映射到伺服器上的使用者,而在規則中,我有一項帶有 certificateField=Issuer、certificateSubField=CN 和 matchCriteria=“我創建的 CA 的名稱”。
在 Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL 中創建了一個名為 SendTrustedIssuerList 且值為 1 的系統資料庫項。
伺服器證書已被刪除並重新添加到域中使用 clientcertnegotiation=enabled 在 powershell 中使用 netsh 綁定到站點上的域:443。
最後,我使用https://www.nartac.com/Products/IISCrypto/中的 IISCrypto 在 Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols 中設置協議。
這就是我到目前為止所做的一切,它應該涵蓋整個網際網路上對類似問題的所有響應,但它所做的只是給我一個 403.7 錯誤。我在連接嘗試期間使用wireshark檢查TLS流量,伺服器似乎確實發送了帶有受信任CA列表(我的CA包含在列表中)的請求證書,但我無法讓任何瀏覽器提示我輸入客戶端證書. 哦忘了提到我確實通過瀏覽器添加了 CA 和客戶端證書,並且 IE 11 有 de 不要提示當您只有一個證書選項被禁用時,但仍然沒有。
有任何想法嗎?
最後讓它工作。IIS 設置正確,問題出在證書上,不知道為什麼,但瀏覽器不喜歡它們。因此,我從伺服器中刪除了 AD CS,並使用 powershell 重新製作了 CA 和客戶端證書。這個新證書執行良好,所有瀏覽器都會在將它們放在必須去的地方後提示我使用它們。
順便說一句,powershell 命令如下:
$params = @{ DnsName = "CA Name" KeyLength = 2048 KeyAlgorithm = 'RSA' HashAlgorithm = 'SHA256' KeyExportPolicy = 'Exportable' NotAfter = (Get-Date).AddYears(5) CertStoreLocation = 'Cert:\LocalMachine\My' KeyUsage = 'CertSign','CRLSign' } $rootCA = New-SelfSignedCertificate @params Export-Certificate -Cert $rootCA -FilePath "C:\path\to\file\ca-public.crt" Import-Certificate -CertStoreLocation 'Cert:\LocalMachine\Root' -FilePath "C:\path\to\file\ca-public.crt" $params = @{ Subject = "Client Name" Signer = $rootCA KeyLength = 2048 KeyAlgorithm = 'RSA' HashAlgorithm = 'SHA256' KeyExportPolicy = 'Exportable' NotAfter = (Get-date).AddYears(5) CertStoreLocation = 'Cert:\LocalMachine\My' } $clientCert = New-SelfSignedCertificate @params Export-PfxCertificate -Cert $clientCert -FilePath "C:\path\to\file\client-private.pfx" -Password (ConvertTo-SecureString -AsPlainText 'password' -Force)
然後,您只需將證書導入客戶端電腦上的適當儲存。
不知道使用 AD CS 創建的證書中缺少什麼,但我很高興有一個可行的解決方案。