Piezīme. Šajā lapā informācija attiecas uz AD FS 2012 R2 un jaunākām versijām.
Izvietošanas tīmekļa lietojumprogrammas starpniekserveris (WAP), ja jānosaka starpniekservera uzticamības relācija starp WAP servera un AD FS serveri. Pārbaudiet starpniekservera uzticamības relācija tiek izveidots vai startēšanas laikā neizdodas brīdī.
Pamatinformācija
Starpniekservera uzticamības relācija ir klienta sertifikāts. Palaižot Web lietojumprogrammas starpniekserveris pēc instalēšanas vedni, vednis izveido pašparakstīts klienta sertifikātu, izmantojot akreditācijas datus, kuru norādījāt vednī. Pēc tam vednis sertifikātu ievieto AD FS konfigurācijas datu bāzes un pievieno AdfsTrustedDevices sertifikātu krātuvē AD FS serverī.
Visas SSL saziņas http. sys izmanto SSL sertifikāts saistījumus prioritātes secībā atbilstoši sertifikātu:
Prioritāte |
vārds |
Parametri |
Apraksts |
1. |
IP |
IP:port |
Precīzu IP un ports atbilstība |
2. |
SNI |
Hostname:port |
Precīzu resursdatora spēles (savienojuma jānorāda SNI) |
3. |
CCS |
Ports |
Izsaukt centrālā sertifikātu krātuvē |
4. |
Aizstājējzīmju IPv6 |
Ports |
IPv6 aizstājējzīmju atbilstības (savienojumam jābūt IPv6) |
5. |
Aizstājējzīmju IP |
Ports |
Aizstājējzīmju atbilstības IP (savienojums var būt IPv4 vai IPv6) |
AD FS 2012 R2 un vēlāk neatkarīgi no interneta informācijas pakalpojumi (IIS) un darbojas kā pakalpojums uz http. sys. AD FS izmanto hostname:port SSL sertifikāts saites. Klienta sertifikāta autentifikācija laikā AD FS nosūta sertifikātu uzticamības saraksts (CTL), pamatojoties uz sertifikātu krātuvē AdfsTrustedDevices. SSL sertifikāts saistīšana AD FS Server izmanto IP:port vai CTL veikals nav AdfsTrustedDevices, starpniekservera uzticamības relācija nav reģistrēts.
Iegūstiet AD FS saistījumus SSL sertifikāts
AD FS serverī Windows PowerShell, izpildiet šādu komandu:
netsh http show sslcert
Saistījumu atgriezts sarakstā meklējiet ar 5d89a20c beab-4389-9447 324788eb944a lietojumprogrammas ID. Šeit ir piemērs veseli saistīšana. Ņemiet vērā navigatorā daļas.
Hostname:port : adfs.contoso.com:443
Certificate Hash : 3638de9b03a488341dfe32fc3ae5c480ee687793
Application ID : {5d89a20c-beab-4389-9447-324788eb944a}
Certificate Store Name : MY
Verify Client Certificate Revocation : Enabled
Verify Revocation Using Cached Client Certificate Only : Disabled
Usage Check : Enabled
Revocation Freshness Time : 0
URL Retrieval Timeout : 0
Ctl Identifier : (null)
Ctl Store Name : AdfsTrustedDevices
DS Mapper Usage : Disabled
Negotiate Client Certificate : Disabled
Problēmu novēršana
Automātiski noteikt starpniekservera uzticamības relācija problēmas, palaidiet šo skriptu. Pamatojoties uz noteiktas problēmas, rīkoties atbilstoši lappuses beigās.
param
(
[switch]$syncproxytrustcerts
)
function checkhttpsyscertbindings()
{
Write-Host; Write-Host("1 – Checking http.sys certificate bindings for potential issues")
$httpsslcertoutput = netsh http show sslcert
$adfsservicefqdn = (Get-AdfsProperties).HostName
$i = 1
$certbindingissuedetected = $false
While($i -lt $httpsslcertoutput.count)
{
$ipport = $false
$hostnameport = $false
if ( ( $httpsslcertoutput[$i] -match "IP:port" ) ) { $ipport = $true }
elseif ( ( $httpsslcertoutput[$i] -match "Hostname:port" ) ) { $hostnameport = $true }
# Check for IP specific certificate bindings
if ( ( $ipport -eq $true ) )
{
$httpsslcertoutput[$i]
$ipbindingparsed = $httpsslcertoutput[$i].split(":")
if ( ( $ipbindingparsed[2].trim() -ne "0.0.0.0" ) -and ( $ipbindingparsed[3].trim() -eq "443") )
{
$warning = "There is an IP specific binding on IP " + $ipbindingparsed[2].trim() + " which may conflict with the AD FS port 443 cert binding." | Write-Warning
$certbindingissuedetected = $true
}
$i = $i + 14
continue
}
# check that CTL Store is set for ADFS service binding
elseif ( $hostnameport -eq $true )
{
$httpsslcertoutput[$i]
$ipbindingparsed = $httpsslcertoutput[$i].split(":")
If ( ( $ipbindingparsed[2].trim() -eq $adfsservicefqdn ) -and ( $ipbindingparsed[3].trim() -eq "443") -and ( $httpsslcertoutput[$i+10].split(":")[1].trim() -ne "AdfsTrustedDevices" ) )
{
Write-Warning "ADFS Service binding does not have CTL Store Name set to AdfsTrustedDevices"
$certbindingissuedetected = $true
}
$i = $i + 14
continue
}
$i++
}
If ( $certbindingissuedetected -eq $false ) { Write-Host "Check Passed: No certificate binding issues detected" }
}
function checkadfstrusteddevicesstore()
{
# check for CA issued (non-self signed) certs in the AdfsTrustedDevices cert store
Write-Host; Write-Host "2 – Checking AdfsTrustedDevices cert store for non-self signed certificates"
$certlist = Get-Childitem cert:\LocalMachine\AdfsTrustedDevices -recurse | Where-Object {$_.Issuer -ne $_.Subject}
If ( $certlist.count -gt 0 )
{
Write-Warning "The following non-self signed certificates are present in the AdfsTrustedDevices store and should be removed"
$certlist | Format-List Subject
}
Else { Write-Host "Check Passed: No non-self signed certs present in AdfsTrustedDevices cert store" }
}
function checkproxytrustcerts
{
Param ([bool]$repair=$false)
Write-Host; Write-Host("3 – Checking AdfsTrustedDevices cert store is in sync with ADFS Proxy Trust config")
$doc = new-object Xml
$doc.Load("$env:windir\ADFS\Microsoft.IdentityServer.Servicehost.exe.config")
$connString = $doc.configuration.'microsoft.identityServer.service'.policystore.connectionString
$command = "Select ServiceSettingsData from [IdentityServerPolicy].[ServiceSettings]"
$cli = new-object System.Data.SqlClient.SqlConnection
$cli.ConnectionString = $connString
$cmd = new-object System.Data.SqlClient.SqlCommand
$cmd.CommandText = $command
$cmd.Connection = $cli
$cli.Open()
$configString = $cmd.ExecuteScalar()
$configXml = new-object XML
$configXml.LoadXml($configString)
$rawCerts = $configXml.ServiceSettingsData.SecurityTokenService.ProxyTrustConfiguration._subjectNameIndex.KeyValueOfstringArrayOfX509Certificate29zVOn6VQ.Value.X509Certificate2
#$ctl = dir cert:\LocalMachine\ADFSTrustedDevices
$store = new-object System.Security.Cryptography.X509Certificates.X509Store("ADFSTrustedDevices","LocalMachine")
$store.open("MaxAllowed")
$atLeastOneMismatch = $false
$badCerts = @()
foreach($rawCert in $rawCerts)
{
$rawCertBytes = [System.Convert]::FromBase64String($rawCert.RawData.'#text')
$cert=New-Object System.Security.Cryptography.X509Certificates.X509Certificate2(,$rawCertBytes)
$now = Get-Date
if ( ($cert.NotBefore -lt $now) -and ($cert.NotAfter -gt $now))
{
$certThumbprint = $cert.Thumbprint
$certSubject = $cert.Subject
$ctlMatch = dir cert:\localmachine\ADFSTrustedDevices\$certThumbprint -ErrorAction SilentlyContinue
if ($ctlMatch -eq $null)
{
$atLeastOneMismatch = $true
Write-Warning "This cert is NOT in the CTL: $certThumbprint – $certSubject"
if ($repair -eq $true)
{
write-Warning "Attempting to repair"
$store.Add($cert)
Write-Warning "Repair successful"
}
else
{
Write-Warning ("Please install KB.2964735 or re-run script with -syncproxytrustcerts switch to add missing Proxy Trust certs to AdfsTrustedDevices cert store")
}
}
}
}
$store.Close()
if ($atLeastOneMismatch -eq $false)
{
Write-Host("Check Passed: No mismatched certs found. CTL is in sync with DB content")
}
}
checkhttpsyscertbindings
checkadfstrusteddevicesstore
checkproxytrustcerts($syncproxytrustcerts)
Write-Host; Write-Host("All checks completed.")
Kas ir noteicis problēmu?