Fout 'Kan SSPI-context niet genereren' bij het gebruik van Windows-verificatie om verbinding te maken met SQL Server
Van toepassing op: SQL Server
Origineel KB-nummer: 811889
Opmerking
Voordat u begint met het oplossen van problemen, raden we u aan de vereisten te controleren en de controlelijst te doorlopen.
Wanneer u Windows-verificatie gebruikt om op afstand verbinding te maken met een SQL Server-exemplaar, wordt het volgende foutbericht weergegeven:
De naam van het doelaccount is onjuist. Kan geen SSPI-context genereren.
Veelgestelde vragen
Wat is SSPI?
Security Support Provider Interface (SSPI) is een set Windows-API's waarmee delegatie en wederzijdse verificatie via een algemene gegevenstransportlaag, zoals TCP/IP-sockets, mogelijk is. Een of meer softwaremodules bieden de werkelijke verificatiemogelijkheden. Elke module wordt een SSP (Security Support Provider) genoemd en wordt geïmplementeerd als een DLL (Dynamic Link Library).
Wat is Kerberos?
Het Kerberos v5-protocol is een industriestandaard beveiligingspakket en is een van de drie beveiligingspakketten in Windows-besturingssystemen. Zie SSP's (Security Support Providers) voor meer informatie.
Wat betekent de fout 'Kan geen SSPI-context genereren'?
Deze fout betekent dat SSPI probeert, maar geen Kerberos-verificatie kan gebruiken om clientreferenties te delegeren via TCP/IP of Named Pipes voor SQL Server. In de meeste gevallen veroorzaakt een onjuist geconfigureerde SPN (Service Principal Name) deze fout.
Wat is SPN?
Een SPN (Service Principal Names) is een unieke id van een service-exemplaar. SPN's worden door Kerberos-verificatie gebruikt om een service-exemplaar te koppelen aan een service-aanmeldingsaccount. Met dit koppelingsproces kan een clienttoepassing de service aanvragen om een account te verifiëren, zelfs als de client geen accountnaam heeft.
Een typische SPN voor een server waarop een exemplaar van SQL Server wordt uitgevoerd, is bijvoorbeeld als volgt:
MSSQLSvc/SQLSERVER1.northamerica.corp.mycompany.com:1433
De indeling van een SPN voor een standaardexemplaar is hetzelfde als een SPN voor een benoemd exemplaar. Het poortnummer verbindt de SPN met een bepaald exemplaar. Zie Een service-principalnaam registreren voor Kerberos-verbindingen voor meer informatie over het registreren van SQL Server service-SPN's.
Waarom gebruikt SSPI NTLM- of Kerberos-verificatie?
Windows-verificatie is de voorkeursmethode voor gebruikers om te verifiëren bij SQL Server. Clients die gebruikmaken van Windows-verificatie, worden geverifieerd met behulp van NTLM of Kerberos.
Wanneer een SQL Server-client gebruikmaakt van geïntegreerde beveiliging via TCP/IP-sockets naar een externe server waarop SQL Server wordt uitgevoerd, gebruikt de SQL Server clientnetwerkbibliotheek de SSPI-API om beveiligingsdelegering uit te voeren. De SQL Server netwerkclient roept de functie AcquireCredentialsHandle aan en geeft 'onderhandelen' door voor de pszPackage
parameter. Dit proces waarschuwt de onderliggende beveiligingsprovider om te onderhandelen over delegatie. In deze context betekent 'onderhandelen' Kerberos- of NTLM-verificatie op Windows-computers. Met andere woorden, Windows gebruikt Kerberos-delegatie als de doelcomputer met SQL Server een gekoppelde en correct geconfigureerde SPN heeft. Anders gebruikt Windows NTLM-delegatie. Als de SQL Server-client lokaal verbinding maakt op dezelfde computer waarop SQL Server zich bevindt, wordt NTLM altijd gebruikt.
Waarom wordt er geen failover van de verbinding naar NTLM uitgevoerd nadat er problemen zijn met Kerberos?
De SQL Server stuurprogrammacode op de client maakt gebruik van de WinSock-netwerk-API om de volledig gekwalificeerde DNS van de server om te zetten wanneer het stuurprogramma Windows-verificatie gebruikt om verbinding te maken met SQL Server. Om deze bewerking uit te voeren, roept de stuurprogrammacode de gethostbyname
en gethostbyaddr
WinSock-API's aan. Als geïntegreerde beveiliging wordt gebruikt, probeert het stuurprogramma de volledig gekwalificeerde DNS van de server om te zetten, zelfs als een IP-adres of een hostnaam wordt doorgegeven als de naam van de server.
Wanneer het SQL Server-stuurprogramma op de client de volledig gekwalificeerde DNS van de server oplost, wordt de bijbehorende DNS gebruikt om de SPN voor de server te vormen. Daarom kunnen problemen met het omzetten van het IP-adres of de hostnaam naar een volledig gekwalificeerde DNS door WinSock ertoe leiden dat het SQL Server stuurprogramma een ongeldige SPN voor de server maakt.
Het SQL Server-stuurprogramma aan de clientzijde kan bijvoorbeeld als een volledig gekwalificeerde DNS worden gebruikt om ongeldige SPN's als volgt op te lossen:
MSSQLSvc/SQLSERVER1:1433
MSSQLSvc/123.123.123.123:1433
MSSQLSvc/SQLSERVER1.antartica.corp.mycompany.com:1433
MSSQLSvc/SQLSERVER1.dns.northamerica.corp.mycompany.com:1433
Wanneer het SQL Server-stuurprogramma een ongeldige SPN vormt, werkt verificatie nog steeds omdat de SSPI-interface de SPN in de Active Directory-service probeert op te zoeken. Als de SSPI-interface de SPN niet vindt, wordt Kerberos-verificatie niet uitgevoerd. Op dat moment schakelt de SSPI-laag over naar de NTLM-verificatiemodus. De aanmelding maakt gebruik van NTLM-verificatie en slaagt doorgaans. Als het SQL Server-stuurprogramma een geldige SPN vormt die niet is toegewezen aan de juiste container, probeert het stuurprogramma de SPN, maar kan het niet gebruiken. In dit geval kan de fout 'Kan SSPI-context niet genereren' optreden. Als het SQL Server-opstartaccount een lokaal systeemaccount is, is de juiste container de computernaam. Voor elk ander account is de juiste container het SQL Server-opstartaccount. Verificatie maakt gebruik van de eerste SPN die wordt gevonden, dus zorg ervoor dat er geen SPN's zijn toegewezen aan onjuiste containers. Met andere woorden, elke SPN mag slechts aan één container worden toegewezen.
Hoe kan ik de verificatiemethode van de verbinding verifiëren?
Voer de volgende query uit om de verificatiemethode van een verbinding te bepalen:
SELECT net_transport, auth_scheme
FROM sys.dm_exec_connections
WHERE session_id = @@SPID;
Zie Bepalen of het verificatietype Kerberos is voor meer informatie.
SPN's voor SQL Server maken
Wanneer een exemplaar van de SQL Server-database-engine wordt gestart, probeert SQL Server automatisch de SPN voor de SQL Server-service te registreren met behulp van de DsWriteAccountSpn-API. Deze aanroep slaagt als het SQL Server-serviceaccount lees-servicePrincipalName
en schrijfservicePrincipalName
rechten heeft in Active Directory. Anders heeft u uw Active Directory-beheerder nodig om handmatig de juiste SPN te registreren met Microsoft Kerberos Manager voor SQL Server of het ingebouwde hulpprogramma Setspn. Zie Een Service-principalnaam registreren voor Kerberos-verbindingen voor meer informatie over het beheren van SPN's voor SQL Server.
De fout oplossen met Kerberos Configuration Manager (aanbevolen)
Opmerking
Deze procedure is alleen van toepassing op situaties waarin u deze foutberichten altijd ontvangt, niet af en toe.
Er zijn verschillende redenen waarom Kerberos-verbindingen mislukken, zoals onjuist geconfigureerde SPN's, problemen met naamomzetting of onvoldoende rechten voor SQL Server-service opstartaccounts. Microsoft Kerberos Configuration Manager (KCM) is een hulpprogramma waarmee u de oorzaken van de fout kunt controleren. KCM biedt ook opties om eventuele geïdentificeerde problemen in het proces op te lossen.
Volg deze stappen om het probleem met behulp van KCM op te lossen.
Download en installeer Kerberos Configuration Manager op de computer met de verbindingsproblemen.
Start KerberosConfigMgr.exe vanuit de map %SystemDrive%:\Program Files\Microsoft\Kerberos Configuration Manager. Gebruik vervolgens een domeinaccount met machtigingen om verbinding te maken met de SQL Server-computer waarmee u geen verbinding kunt maken.
Selecteer Verbinding maken en laat de servernaam en andere gegevens die van toepassing zijn op uw scenario leeg als u KCM uitvoert op de SQL Server-computer. Selecteer Verbinding maken om de analyse uit te voeren. Nadat KCM klaar is met het ophalen van de benodigde informatie, wordt automatisch overgeschakeld naar het tabblad SPN en wordt standaard informatie weergegeven voor SQL Server, SQL Server Reporting Services, Analysis Services en AG-listeners. Als u deze fout wilt oplossen, schakelt u alles uit behalve SQL Server.
Controleer de diagnose van het hulpprogramma met behulp van de kolom Status en volg de relevante stappen om het probleem op te lossen:
Status Meer informatie Actie Goed Het ingeschakelde item is correct geconfigureerd. U kunt doorgaan naar het volgende item in de uitvoer. Geen actie nodig Vereiste SPN ontbreekt Deze status wordt gerapporteerd wanneer de SPN die is geïdentificeerd in de kolom Vereist SPN ontbreekt voor het SQL Server-opstartaccount in Active Directory. 1. Selecteer Herstellen om de informatie in het dialoogvenster Waarschuwing te bekijken.
2. Selecteer Ja om de ontbrekende SPN toe te voegen aan Active Directory.
3. Als uw domeinaccount over de benodigde machtigingen beschikt om Active Directory bij te werken, wordt de vereiste SPN toegevoegd aan Active Directory.
4. Als uw domeinaccount niet beschikt over de benodigde machtigingen om Active Directory bij te werken, gebruikt u Alles genereren of Genereren om het script te genereren waarmee de Active Directory-beheerder de ontbrekende SPN's kan toevoegen.
5. Nadat de SPN's zijn toegevoegd, voert u Kerberos Configuration Manager opnieuw uit om te controleren of de SPN-problemen zijn opgelost.
6. Daarnaast kunt u de volgende opdrachten gebruiken:
- GebruikSETSPN -Q spnName
om de SPN en de huidige accounts te zoeken.
- GebruikSETSPN -D
om de SPN uit het onjuiste account te verwijderen.TCP moet zijn ingeschakeld voor het gebruik van Kerberos-configuratie Dit gebeurt wanneer TCP niet is ingeschakeld op de clientcomputer. Voer de volgende stappen uit om het TCP/IP-protocol in te schakelen voor het SQL Server-exemplaar:
1. Vouw in SQL Server Configuration Manager in het console venster SQL Server Netwerkconfiguratie uit.
2. Selecteer in het consolevensterProtocollen als <instantienaam>.
3. Klik met de rechtermuisknop in het venster details op TCP/IP en selecteer vervolgens Inschakelen.
4. Selecteer SQL Server Services in het console venster.
5. Klik in het detailvenster met de rechtermuisknop op SQL Server (<exemplaarnaam>) en selecteer vervolgens Opnieuw opstarten om de SQL Server-service te stoppen en opnieuw te starten.
Zie Een servernetwerkprotocol in- of uitschakelen voor meer informatie.Dynamische poort Dit bericht wordt weergegeven voor benoemde exemplaren die gebruikmaken van dynamische poorten (standaardconfiguratie). In omgevingen waarin u Kerberos moet gebruiken om verbinding te maken met SQL Server, moet u uw benoemde exemplaar instellen op een statische poort en die poort gebruiken bij het registreren van SPN. Voer de volgende stappen uit om uw SQL Server-exemplaar te configureren voor het gebruik van een statische poort:
1. Vouw in SQL Server Configuration Manager in het consolevensterSQL Server-netwerkconfiguratie uit, vouw Protocollen uit als <exemplaarnaam> en dubbelklik vervolgens op TCP/IP.
2. Controleer in het dialoogvenster TCP/IP-eigenschappen de instelling Alles luisteren op het tabblad Protocol.
3. Als de instelling Alles luisteren is ingesteld op Ja, gaat u naar het tabblad IP-adressen en scrollt u naar de onderkant van Windows om de instelling IPAll te vinden. Verwijder de huidige waarde die is opgenomen in de dynamische TCP-poorten en stel de gewenste waarde in het veld TCP-poort in. Selecteer OK en start het SQL Server-exemplaar opnieuw op om de instellingen van kracht te laten worden.
4. Als de instelling Alles luisteren is ingesteld op Nee, gaat u naar het tabblad IP-adressen en controleert u elk van de IP-adressen die worden weergegeven in IP1, IP2. Voor ingeschakelde IP-adressen verwijdert u de huidige waarde in het veld Dynamische TCP-poorten en stelt u de gewenste waarde in het veld TCP-poort in. Selecteer OK en start het SQL Server-exemplaar opnieuw op om de instellingen van kracht te laten worden.
Zie Een server configureren om te luisteren op een specifieke TCP-poort voor meer informatie.Dubbele SPN U kunt de situatie tegenkomen wanneer dezelfde SPN is geregistreerd onder verschillende accounts in Active Directory. 1. Selecteer de knop Herstellen, bekijk de informatie in het dialoogvenster Waarschuwing en selecteer Ja als u de ontbrekende SPN aan Active Directory kunt toevoegen.
2. Als uw domeinaccount de benodigde machtigingen heeft om Active Directory bij te werken, wordt de onjuiste SPN verwijderd.
3. Als uw domeinaccount niet over de benodigde machtigingen beschikt om Active Directory bij te werken, gebruikt u de knop Genereren of Alles genereren om het benodigde script te genereren dat u kunt overdragen aan uw Active Directory-beheerder om de dubbele SPN's te verwijderen. Zodra de SPN's zijn verwijderd, voert u de KCM opnieuw uit om te controleren of de SPN-problemen zijn opgelost.Opmerking
Als het domeinaccount waarmee KCM wordt gestart geen bevoegdheden heeft voor het bewerken van SPN's in Active Directory, kunt u de bijbehorende knop Genereren of Alles genereren onder de kolom SPN-script gebruiken om de vereiste opdrachten te genereren en samen met uw Active Directory-beheerder de problemen op te lossen die door KCM worden geïdentificeerd.
Nadat u alle problemen hebt opgelost die in de KCM zijn geïdentificeerd, voert u het hulpprogramma opnieuw uit. Zorg ervoor dat er geen andere problemen worden gerapporteerd en probeer de verbinding opnieuw. Als het hulpprogramma nog steeds problemen rapporteert, herhaalt u de vorige procedure.
De fout oplossen zonder Kerberos-Configuration Manager
Als u KCM niet kunt gebruiken, voert u de volgende stappen uit:
Stap 1: naamomzetting controleren met de ping-opdracht
De belangrijkste factor die Kerberos-verificatie succesvol maakt, is de geldige DNS-functionaliteit op het netwerk. U kunt deze functionaliteit op de client en de server controleren met behulp van het Ping
opdrachtprompthulpprogramma. Voer op de clientcomputer de volgende opdracht uit om het IP-adres op te halen van de server waarop SQL Server wordt uitgevoerd (waarbij de naam van de computer is SQLServer1
):
ping sqlserver1
Voer de volgende opdracht uit om te zien of het hulpprogramma Ping de volledig gekwalificeerde DNS van SQLServer1
oplost:
ping -a <IPAddress>
Bijvoorbeeld:
C:\>ping SQLSERVER1
Pinging SQLSERVER1 [123.123.123.123] with 32 bytes of data:
Reply from 123.123.123.123: bytes=32 time<10ms TTL=128
Reply from 123.123.123.123: bytes=32 time<10ms TTL=128
Reply from 123.123.123.123: bytes=32 time<10ms TTL=128
Reply from 123.123.123.123: bytes=32 time<10ms TTL=128
Ping statistics for 123.123.123.123:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms
C:\>ping -a 123.123.123.123
Pinging SQLSERVER1.northamerica.corp.mycompany.com [123.123.123.123] with 32 bytes of data:
Reply from 123.123.123.123: bytes=32 time<10ms TTL=128
Reply from 123.123.123.123: bytes=32 time<10ms TTL=128
Reply from 123.123.123.123: bytes=32 time<10ms TTL=128
Reply from 123.123.123.123: bytes=32 time<10ms TTL=128
Ping statistics for 123.123.123.123:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms
C:\>
Wanneer de opdracht ping -a <IPAddress>
wordt omgezet in de juiste volledig gekwalificeerde DNS van de computer waarop SQL Server wordt uitgevoerd, is de resolutie aan de clientzijde ook geslaagd.
Voor gedetailleerde diagnostische gegevens gebruikt u de cmdlet Test-NetConnection of Test-Connection om de TCP-connectiviteit te testen op basis van de PowerShell-versie die op de computer is geïnstalleerd. Raadpleeg Cmdlet-overzicht voor meer informatie over PowerShell-cmdlet.
Opmerking
Naamomzettingsmethoden kunnen DNS-, WINS-, Hosts-bestanden en Lmhosts-bestanden bevatten. Raadpleeg de volgende koppelingen voor meer informatie over problemen met naamomzetting en probleemoplossing:
Controleer of er aliassen voor de doel-SQL Server aanwezig zijn in SQL Server Configuration Manager en in het hulpprogramma SQL Server Client Network. Als een dergelijke alias bestaat, controleert u of deze juist is geconfigureerd door de servernamen, het netwerkprotocol, het poortnummer, enzovoort te controleren. Een SQL Server-alias kan ertoe leiden dat er een onverwachte SPN wordt gegenereerd. Dit resulteert in NTLM-referenties als de SPN niet wordt gevonden, of een SSPI-fout, als deze per ongeluk overeenkomt met de SPN van een andere server.
Stap 2: communicatie tussen domeinen controleren
Controleer of het domein waarmee u zich aanmeldt kan communiceren met het domein van de server waarop SQL Server wordt uitgevoerd. Er moet ook een juiste naamomzetting in het domein zijn.
Zorg ervoor dat u zich bij Windows kunt aanmelden met hetzelfde domeinaccount en hetzelfde wachtwoord als het opstartaccount van de SQL Server-service. De SSPI-fout kan bijvoorbeeld optreden in een van de volgende situaties:
- Het domeinaccount is vergrendeld.
- U hebt de SQL Server-service niet opnieuw opgestart nadat het wachtwoord van het account is gewijzigd.
Als uw aanmeldingsdomein verschilt van het domein van de server waarop SQL Server wordt uitgevoerd, controleert u de vertrouwensrelatie tussen de domeinen.
Controleer of het domein waartoe de server behoort en het domeinaccount dat u gebruikt om verbinding te maken zich in hetzelfde forest bevinden. Deze stap is vereist om SSPI te laten werken.
Stap 3: SQL Server-SPN's verifiëren met behulp van de hulpprogramma's SQLCHECK en Setspn
Als u zich lokaal kunt aanmelden bij de SQL Server-computer en beheerderstoegang hebt, gebruikt u SQLCHECK. SQLCheck biedt de meeste informatie die nodig is voor het oplossen van problemen in één bestand. Raadpleeg de startpagina van het hulpprogramma voor meer informatie over het gebruik van het hulpprogramma en welke informatie het verzamelt. U kunt ook de pagina met aanbevolen vereisten en controlelijst raadplegen. Zodra u het uitvoerbestand heeft gegenereerd, controleert u de SPN-configuratie voor uw SQL Server-exemplaar in de sectie SQL Server-informatie van het uitvoerbestand.
Voorbeelduitvoer:
Suggested SPN Exists Status
---------------------------------------------------------- ------ -------------------
MSSQLSvc/testsqlsvr.corp.com:2000 True Okay
MSSQLSvc/testsqlsvr.corp.com True Okay
MSSQLSvc/testsqlsvr:2000 False SPN does not exist.
MSSQLSvc/testsqlsvr False SPN does not exist.
Gebruik de bovenstaande uitvoer om de volgende stappen te bepalen (zie de voorbeelden hieronder) en gebruik het hulpprogramma Setspn om de benodigde herstelacties uit te voeren om SPN-problemen op te lossen.
Scenario | Voorgestelde actie |
---|---|
SPN bestaat niet | Voeg de vereiste SPN('s) toe voor uw SQL Server-serviceaccount. |
Dubbele SPN's | Verwijder de SPN die is geregistreerd voor uw SQL-service onder het onjuiste account. |
SPN onder onjuist account | Verwijder de geregistreerde SPN voor uw SQL-service onder het onjuiste account en registreer vervolgens de SPN onder het juiste serviceaccount. |
Onjuiste SPN is geregistreerd | Verwijder de onjuiste SPN en registreer de juiste SPN. |
Opmerking
U kunt de sectie SQL Server-informatie van het uitvoerbestand van het hulpprogramma SQLCHECK bekijken om het serviceaccount van uw SQL Server-exemplaar te vinden.
Setspn is een geïntegreerd hulpprogramma in nieuwere versies van Windows waarmee u SPN's in Active Directory kunt lezen, toevoegen, wijzigen of verwijderen. U kunt dit hulpprogramma gebruiken om te controleren of SQL Server SPN's zijn geconfigureerd volgens Een service-principalnaam registreren voor Kerberos-verbindingen. Zie het hulpprogramma Setspn en voorbeelden over het gebruik ervan voor meer informatie.
Zie Een service-principalnaam registreren voor Kerberos-verbindingen voor meer informatie over scenario's waarin SQL Server automatisch SPN's registreert en waar handmatige SPN-registratie is vereist.
Stap 4: controleer de accountmachtiging voor SQL Server-opstartaccount op de gekoppelde server
Als u Imiteren gebruikt als verificatieoptie op de pagina Beveiliging van uw gekoppelde server, is SQL Server vereist om binnenkomende referenties door te geven aan externe SQL Server. Voor het SQL Server-opstartaccount waar de gekoppelde server is gedefinieerd, moet het Account worden vertrouwd voor het overdrachtsrecht dat aan het account is toegewezen in Active Directory. Zie Computer- en gebruikersaccounts kunnen worden vertrouwd voor delegatie voor meer informatie.
Opmerking
Deze stap is alleen vereist wanneer u problemen met betrekking tot gekoppelde serverquery's oplost.