Cómo usar SPN al configurar aplicaciones Web que se alojan en servicios de Internet Information Server


Resumen


Este artículo describe los nombres principales de servicio (SPN). Este artículo describe también cómo usar SPN al configurar aplicaciones Web que se alojan en los servicios de Microsoft Internet Information Services (IIS). Este artículo también describe el proceso de negociación de la autenticación integrada de Windows. El encabezado de seguridad "Negotiate" permite a los clientes seleccionar entre la autenticación Kerberos y la autenticación NTLM. Además, este artículo describe escenarios comunes que requieren un SPN habilitar la autenticación Kerberos. La última sección describe situaciones en que la autenticación Kerberos puede fallar. La última sección también proporciona pasos para solucionar problemas.

INTRODUCCIÓN


Importante: Los temas que se tratan en este artículo se aplican a servicios de Internet Information Server (IIS) 6.0. Los temas también se aplican a IIS 7.0 y 7.5 si está deshabilitada la autenticación de modo Kernel estableciendo la opción de configuración useKernelMode en false.
En este artículo paso a paso se describe cómo utilizar nombres principales de servicio (SPN) al configurar aplicaciones Web que se alojan en IIS. IIS pasa el encabezado de seguridad Negotiate cuando se utiliza la autenticación integrada de Windows para autenticar las solicitudes de cliente. El encabezado de seguridad "Negotiate" permite a los clientes seleccionar entre la autenticación Kerberos y la autenticación NTLM. El proceso de Negotiate selecciona la autenticación Kerberos a menos que una de las siguientes condiciones sea verdadera:
  • Uno de los sistemas que está implicado en la autenticación no puede utilizar la autenticación Kerberos.
  • La aplicación que se está llamando no proporciona la información suficiente para utilizar la autenticación Kerberos.
Para habilitar el proceso de Negotiate para que seleccione el protocolo Kerberos para la autenticación, la aplicación cliente debe proporcionar un SPN, un nombre principal de usuario (UPN) o un nombre de cuenta de NetBIOS como el nombre de destino. Si la aplicación cliente no proporciona un nombre de destino, el proceso de negociación no puede utilizar el protocolo Kerberos. Si el proceso de negociación no puede utilizar el protocolo Kerberos, el proceso de negociación selecciona el protocolo NTLM.

Más información


Conceptos

Definición de un SPN

Un SPN es el nombre mediante el cual un cliente identifica de manera única una instancia de un servicio. Si instala varias instancias de un servicio en los equipos de un bosque, cada instancia de servicio debe tener su propio SPN. Una instancia de un servicio determinado puede tener varios SPN si hay varios nombres que los clientes pueden utilizar para la autenticación. Por ejemplo, un SPN siempre incluye el nombre del equipo host en el que se ejecuta la instancia de servicio. Por lo tanto, una instancia de servicio puede registrar un SPN para cada nombre o alias de su host.

La clase de servicio HTTP

La clase de servicio HTTP difiere del protocolo HTTP. El protocolo HTTP y el protocolo HTTPS utilizan la clase de servicio HTTP. La clase de servicio es la cadena que identifica la clase general del servicio. Nombres de clase de servicio conocido incluyen "www" para un servicio Web y "ldap" para un servicio de directorio. Por lo general, el nombre de la clase de servicio puede ser cualquier cadena que sea única para la clase de servicio. Tenga en cuenta que la sintaxis SPN utiliza un carácter de barra diagonal (/) para separar los elementos. Por lo tanto, no puede aparecer el carácter de barra diagonal (/) en un nombre de clase de servicio.

El servicio HOST y la clase de servicio HTTP

El servicio HOST representa el equipo host. El protocolo Kerberos utiliza el SPN de HOST para tener acceso al equipo host. El protocolo Kerberos utiliza la "llave" de largo plazo que se encuentra en el equipo host para crear un vale de servicio. La clase de servicio HTTP es uno de los servicios integrados que actúan como un alias para el SPN de HOST. El SPN de HOST se asigna a la cuenta del equipo host. Por lo tanto, cuando se utiliza la clase de servicio HTTP predeterminada, el protocolo Kerberos utiliza la cuenta del equipo como cuenta de servicio para solicitar un vale de servicio.

Escenarios comunes

En esta sección se describe escenarios que pueden requerir un SPN. Además, en esta sección se muestra cómo determinar qué SPN se debe establecer para cada escenario. En estos casos, se utilizan los siguientes términos:
IIS6server1El nombre de host del equipo que está ejecutando IIS
miDominioEl dominio al que está unido el equipo IIS6server1
appPool1La cuenta de usuario en el dominio de MiDominio que se utiliza para la identidad del grupo de aplicaciones
appPool2La cuenta de usuario en el dominio de MiDominio que se utiliza para la identidad del segundo grupo
www.test.comEl primer encabezado de host para un sitio Web
www.test2.comEl segundo encabezado de host para un sitio Web
www.test3.comEl tercer encabezado de host para un sitio Web
www.myIIScluster.comEl nombre de dominio completo de un clúster de equipos que ejecutan IIS
www.myEXCHcluster.comEl nombre de dominio completo de un clúster de equipos que ejecutan Microsoft Exchange en IIS

La herramienta Setspn.exe

La herramienta Setspn.exe permite leer, modificar y eliminar la propiedad de directorio SPN para una cuenta de servicio de Active Directory. Los SPN se utilizan para localizar un nombre principal de destino para ejecutar un servicio. El SetSpn.exe herramienta también permite ver los SPN actuales, restablecer los SPN de la cuenta predeterminada y agregar o eliminar SPNs.To complementaria que obtener la herramienta Setspn.exe para Microsoft Windows Server 2003, haga clic en el número de artículo siguiente para ver el artículo en el Microsoft Knowledge Base:
Actualización de herramientas de soporte técnico 970536 Setspn.exe para Windows Server 2003

Escenario 1: Acceso a una aplicación de IIS cuando se ha modificado la identidad del grupo de aplicaciones

Cuando una aplicación de IIS se ejecuta en una cuenta de usuario de dominio en lugar de en la cuenta de servicio de red predeterminada, debe establecer el SPN del servicio HTTP en la cuenta de dominio. En este escenario, se accede a la aplicación de IIS utilizando, ya sea el nombre NetBIOS del servidor que ejecuta el IIS o el FQDN del servidor que está ejecutando el IIS. Para acceder a la aplicación de IIS mediante el nombre NetBIOS, utilice el comando siguiente, donde NETBIOS_NAME_OF_IIS_SERVER es el nombre NetBIOS del servidor que está ejecutando IIS:
Setspn – S HTTP /NETBIOS_NAME_OF_IIS_SERVER dominio\nombre de usuario
Por ejemplo, el comando puede ser similar a lo siguiente:
Setspn – S HTTP/iis6server1 mydomain\appPool1
Para acceder a la aplicación de IIS utilizando el nombre completo, utilice el comando siguiente, donde FQDN_OF_IIS_SERVER es el FQDN del servidor que está ejecutando IIS:
Setspn – S HTTP /FQDN_OF_IIS_SERVER dominio\nombre de usuario
Por ejemplo, el comando puede ser similar a lo siguiente:
Setspn – S HTTP/iis6server1.mydomain.com mydomain\appPool1

Escenario 2: Acceso a una aplicación Web utilizando un encabezado de host

Cuando tiene acceso a una aplicación Web utilizando un encabezado de host, debe establecer un SPN para el servicio HTTP. Al ejecutar la aplicación Web sometida a una cuenta predeterminada como la cuenta de servicio de red, la cuenta servicio local o la cuenta de sistema local, puede utilizar el siguiente comando:
Setspn-A HTTP /HOST_HEADER NETBIOS_NAME_OF_IIS_SERVER
En este comando, HOST_HEADER es el encabezado de host que escribe en una ventana del explorador para tener acceso a la aplicación y NETBIOS_NAME_OF_IIS_SERVER es el nombre NetBIOS del servidor que está ejecutando IIS. Por ejemplo, el comando de la aplicación puede ser similar a lo siguiente:
Setspn – A iis6server1 HTTP/www.test.com
Si ejecuta la aplicación bajo una cuenta de dominio, puede utilizar el siguiente comando:
Setspn-A HTTP /HOSTHEADER_OR_DNS_ALIAS dominio\nombre de usuario
En este comando, HOSTHEADER_OR_DNS_ALIAS es el encabezado de host o alias DNS que se utiliza para tener acceso a la aplicación Web. Por ejemplo, el comando de la aplicación puede ser similar a uno de los siguientes comandos:
  • Setspn – A mydomain\appPool1 HTTP/www.test.com
  • Setspn – A mydomain\appPool2 HTTP/www.test3.com

Escenario 3: Tener acceso a una aplicación de IIS en un entorno de clúster o equilibrio de carga

Al ejecutar IIS en un entorno agrupado o en un entorno con equilibrio de carga, acceso a aplicaciones mediante el nombre del clúster en lugar de utilizando un nombre de nodo. Este escenario incluye el equilibrio de la carga en la red. En la tecnología de clúster, un nodo se refiere a un equipo que es miembro del clúster. Para utilizar Kerberos como protocolo de autenticación en este escenario, la identidad del grupo de aplicación en cada nodo IIS debe configurarse para utilizar la misma cuenta de usuario de dominio. Para configurar cada nodo IIS para utilizar la misma cuenta de usuario de dominio, utilice el comando siguiente:
Setspn-A HTTP /nombre_clúster dominio\nombre de usuario
Por ejemplo, el comando puede ser similar a uno de los siguientes comandos:
  • Setspn – A mydomain\appPool1 HTTP/www.myIISCluster.com
  • Setspn – A mydomain\appPool2 HTTP/www.myEXCHCluster.com

Escenario 4: Usar SQL Server para tener acceso a una aplicación

El SPN en el servidor back-end que tenga que comprobar si la aplicación Web de IIS requiere acceso a un equipo de back-end que está ejecutando SQL Server. La aplicación Web no funcionen correctamente si los SPN necesarios están configurados incorrectamente. Si el equipo back-end que está ejecutando SQL Server se ejecuta bajo la cuenta sistema local, el MSSQLSvc /FQDN_OF_SQL_SERVER:port el número de puerto debe estar disponible para el nombre del equipo. Para determinar los SPN para el equipo que está ejecutando SQL Server, utilice el comando siguiente:
Setspn – L SQL_SERVER_COMPUTER_NAME
Utilice el siguiente comando para establecer el SPN para el nombre del equipo que está ejecutando SQL Server:
Setspn – A MSSQLSvc /FQDN_OF_SQLSERVER:port SQLSERVER_COMPUTER_NAME
Si el equipo back-end que está ejecutando SQL Server se ejecuta bajo una cuenta de dominio, el MSSQLSvc /FQDN_OF_SQL_SERVER:port el número de puerto debe estar disponible para la cuenta de dominio. Utilice el comando siguiente para determinar el SPN para la cuenta de dominio:
Setspn – L dominio\nombreDeUsuario
Utilice uno de los siguientes comandos para establecer el SPN para el nombre del equipo que está ejecutando SQL Server:
  • Setspn – A MSSQLSvc /FQDN_OF_SQLSERVER:portFQDN_OF_SQLSERVER
  • Setspn – A MSSQLSvc /FQDN_OF_SQLSERVER:portdominio\nombre de usuario

La secuencia de comandos SPN auxiliar

Puede utilizar la siguiente secuencia de comandos de ejemplo para buscar el SPN de una aplicación de IIS. También puede utilizar esta secuencia de comandos para buscar los SPN duplicados. Para utilizar esta secuencia de comandos, siga estos pasos:
  1. Haga clic en Inicio, haga clic en Ejecutar, escriba Notepady, a continuación, haga clic en Aceptar.
  2. En el archivo de Bloc de notas, pegue el siguiente script:
    Dim argSPN, argUser, argComputer, spnToSearch, objCategory, strFilter, searchCategory, domainInputFunction Help()Dim strMessagestrMessage = strMessage & "Usage:" & chr(13)strMessage = strMessage & "For accurate results run this script from the IIS server or a member server in the same domain as IIS server." & chr(13)strMessage = strMessage & "Check the article's failure scenarios and make sure no duplicate SPNs exist." & chr(13)strMessage = strMessage & "cscript spnHelper.vbs /f:spn /spn:HTTP/www.test.com /user:mydomain\apppool1" & chr(13)strMessage = strMessage & "cscript spnHelper.vbs /f:spn /spn:HTTP/www.test.com /computer:iis6server1" & chr(13)strMessage = strMessage & "cscript spnHelper.vbs /f:user /user:mydomain\apppool1" & chr(13)strMessage = strMessage & "cscript spnHelper.vbs /f:computer /computer:iis6server1" & chr(13)strMessage = strMessage & "cscript spnHelper.vbs /f:duplicatespn /spn:HTTP/www.test.com" & chr(13)strMessage = strMessage & "cscript spnHelper.vbs /f:requiredspn" & chr(13)MsgBox strMessage,,"SPN Helper"WScript.QuitEnd FunctionFunction setArguments()argSPN = lcase(WScript.Arguments.Named("spn"))argUser =  lcase(WScript.Arguments.Named("user"))argComputer = lcase(WScript.Arguments.Named("computer"))searchCategory = lcase(WScript.Arguments.Named("f"))if instr(argUser,"\")>0 thendomainInput = ",DC=" & split(argUser,"\")(0)argUser = split(argUser,"\")(1)end ifEnd FunctionFunction resetValues()spnToSearch = ""objCategory = ""strFilter = ""End FunctionFunction getGCPath()Dim tempGCPath, objGC, tempGC, tempStrSet objGC = GetObject("GC:")for each tempGC in objGCtempGCPath = tempGC.ADsPathnextif tempGCPath <> "" thengetGCPath = tempGCPathelseWScript.Echo "Unable to find active directory"WScript.Quitend ifFor tempCounter=0 to UBound(split(lcase(split(getGCPath,"//")(1)),"."))If tempCounter = UBound(split(lcase(split(getGCPath,"//")(1)),".")) Then tempSeperator="" else tempSeperator = ","tempStr = tempStr & "DC=" & split(lcase(split(getGCPath,"//")(1)),".")(tempCounter) & tempSeperatorNextgetGCPath = tempGCPath & "/" & tempStrEnd FunctionFunction getSPNClass()Dim tempSPNClassIf trim(argSPN)="" Then getSPNClass = "*": Exit FunctionIf instr(argSPN,"/")=0 Then getSPNClass = "*": Exit FunctionIf instr(split(argSPN,"/")(0),"*")>0 Then getSPNClass = "*": Exit FunctiongetSPNClass = split(argSPN,"/")(0)End FunctionFunction isSPNInputValid(spnIN)isSPNInputValid = ""If instr(spnIN,"/")=0 Then Exit FunctionIf instr(spnIN,"*")>0 Then Exit FunctionisSPNInputValid = spnINEnd FunctionFunction Main()Dim paramSPNparamSPN = ""call  resetValues()call setArguments()Select Case searchCategoryCase "spn"if (argUser = "" and argComputer = "") or (argUser <> "" and argComputer <> "") then WScript.Echo "You must use /spn along with /computer or /user": WScript.Quitif argSPN = "" then argSPN = "*"spnToSearch = "(servicePrincipalName=" & argSPN & ")"if argUser <> "" then objCategory = "(objectCategory=person)(sAMAccountName=" & argUser & ")"if argComputer <> "" then objCategory = "(objectCategory=computer)(cn=" & argComputer & ")"End IfstrFilter = "(&" & spnToSearch & objCategory & ")"Case "duplicatespn"If isSPNInputValid(argSPN)="" Then WScript.Echo "Invalid SPN input. Please verify and try again.": WScript.QuitspnToSearch = "(servicePrincipalName=" & argSPN & ")"strFilter = spnToSearchparamSPN = argSPNCase "requiredspn"call showRequiredSPNs("IIS")WScript.QuitCase "computer"objCategory = "(&(objectCategory=computer)(cn=" & argComputer & "))"strFilter = objCategoryCase "user"objCategory = "(&(objectCategory=person)(sAMAccountName=" & argUser & "))"strFilter = objCategoryCase elsecall Help()WScript.QuitEnd Selectcall getSPNs(paramSPN)End FunctionFunction getPingResult(hostName,errorMessage)'On Error Resume NextgetPingResult = ""If instr(hostName,".")=0 ThenDim tempGCPath, objGC, tempGCSet objGC = GetObject("GC:")for each tempGC in objGCtempGCPath = tempGC.ADsPathnextif tempGCPath <> "" thengcPath = tempGCPathelseWScript.Echo "Unable to find active directory"WScript.Quitend ifSet adConn = CreateObject("ADODB.Connection")Set adCmd = CReateObject("ADODB.Command")adConn.Provider = "ADsDSOObject"adConn.Open "ADs Provider"Set adCmd.ActiveConnection = adConnadQuery = "<" + gcPath + ">;" & "(&(objectCategory=computer)(cn=" & hostName & "))" & ";dnsHostName;subtree"'WScript.Echo adQuery'WScript.QuitadCmd.CommandText = adQuerySet adRecordSet = adCmd.Executeif adRecordSet.RecordCount>0 Then If IsNull(adRecordSet.Fields("dnsHostName"))=0 Then getPingResult = adRecordSet.Fields("dnsHostName") hostName = getPingResult Else getPingResult = hostNameEnd Ifelse errorMessage = "Could not find " & hostname & " in the active directory"end ifExit FunctionEnd IfgetPingResult = hostNameExit Function'If Err Then getPingResult = hostNameEnd FunctionFunction getSPNs(spn)Dim spnClass, duplicateSPNArrayspnClass = getSPNClass()duplicateSPNArray = ""gcPath = getGCPath()Set adConn = CreateObject("ADODB.Connection")Set adCmd = CreateObject("ADODB.Command")adConn.Provider = "ADsDSOObject"adConn.Open "ADs Provider"Set adCmd.ActiveConnection = adConnadQuery = "<" + gcPath + domainInput + ">;" & strFilter & ";distinguishedName,objectCategory,dnsHostName,servicePrincipalName,sAMAccountName;subtree"'WScript.Echo adQuery'WScript.QuitadCmd.CommandText = adQuerySet adRecordSet = adCmd.Executeif adRecordSet.EOF and adRecordSet.Bof ThenWScript.echo "No " & searchCategory & " found with the given criteria."elseIf adRecordSet.RecordCount>10 ThenIf msgbox(adRecordSet.RecordCount & " Records are returned with the given criteria. Printing all of them might take a long time" & chr(13) & " Do you want to print all of them?",vbYesNo,"Kerberos")=vbNo Then Exit FunctionEnd IfDo While not adRecordset.EofIf Err Then Exit DoWScript.echo "Class: " & split(split(adRecordSet.Fields("objectCategory"),",")(0),"=")(1)WScript.Echo adRecordSet.Fields("distinguishedName")if UCase(adRecordSet.Fields("objectCategory")) = "COMPUTER" ThenWScript.echo "Computer Name" & adRecordSet.Fields("dnsHostName")elseWScript.echo "User Name: " & adRecordSet.Fields("samAccountName")end ifif instr(searchCategory,"spn")>0 ThenspnCollection = adRecordSet.Fields("servicePrincipalName")for each individualSPN in spnCollectionif spnClass="*" ThenWScript.Echo Chr(9) + individualSPNelseSelect Case searchCategoryCase "spn"if Lcase(split(individualSPN,"/")(0)) = lcase(spnClass) ThenWScript.Echo Chr(9) + individualSPNend ifCase "duplicatespn"if Lcase(individualSPN) = lcase(spn) ThenduplicateSPNArray = duplicateSPNArray & Lcase(individualSPN) & " for " & split(split(adRecordSet.Fields("objectCategory"),",")(0),"=")(1) & ":" & adRecordSet.Fields("samAccountName") & Chr(29)end ifCase "requiredspn"End SelectEnd ifnextend ifWScript.EchoadRecordSet.MoveNextLoopIf searchCategory = "duplicatespn" ThenIf UBound(Split(duplicateSPNArray,Chr(29)))>1 ThenWScript.Echo "Duplicate SPNs found"For tempDuplicateCount=0 to UBound(Split(duplicateSPNArray,Chr(29)))-1WScript.Echo Split(duplicateSPNArray,Chr(29))(tempDuplicateCount)NextEnd IfEnd IfWScript.Echo ""If adRecordset.RecordCount>1 Then WScript.Echo "Found " & adRecordset.RecordCount & " accounts" Else WScript.Echo "Found " & adRecordset.RecordCount & " account"end ifadRecordset.CloseadConn.CloseIf Err Then MsgBox Err.MessageEnd FunctionFunction getCategoryCount(myFilterValue, myFilterCategory)'This function accepts 2 parameters. First paramenter is the filter value and second param is filter category.'If you want to pass in your own filter string with various categories, you can pass "" as the second param.gcPath = getGCPath()searchCategory = myFilterCategorySelect Case lcase(searchCategory)Case "spn"tempFilter = "(servicePrincipalName=" & myFilterValue & ")"Case "user"tempFilter = "(&(objectCategory=person)(sAMAccountName=" & myFilterValue & "))"Case "computer"tempFilter = "(&(objectCategory=computer)(cn=" & myFilterValue & "))"Case elsetempFilter = myFilterValueEnd SelectDim tempCategoryCounttempCategoryCount = 0Set adConn = CreateObject("ADODB.Connection")Set adCmd = CReateObject("ADODB.Command")adConn.Provider = "ADsDSOObject"adConn.Open "ADs Provider"Set adCmd.ActiveConnection = adConnadQuery = "<" + gcPath + domainInput + ">;" & tempFilter & ";objectCategory,dnsHostName,servicePrincipalName,sAMAccountName;subtree"'WScript.Echo adQuery'WScript.QuitadCmd.CommandText = adQuerySet adRecordSet = adCmd.Executeif adRecordSet.EOF and adRecordSet.Bof ThenelseDo While not adRecordset.EofIf Err Then Exit Doif searchCategory = "spn" ThenspnCollection = adRecordSet.Fields("servicePrincipalName")for each individualSPN in spnCollectionIf lcase(individualSPN) = lcase(myFilterValue) ThentempCategoryCount  = tempCategoryCount  + 1End IfnextelsetempCategoryCount = tempCategoryCount + 1end if   adRecordSet.MoveNextLoopend ifgetCategoryCount = tempCategoryCountadRecordset.CloseadConn.CloseEnd FunctionFunction showRequiredSPNs(Product)Select Case ProductCase "IIS"If MsgBox("Is IIS running in a Cluster or NLB",vbYesNo)=vbYes Then 'Running in Cluster or NLB is truestrClusterName = InputBox("Enter the Cluster Name")If strClusterName = "" Then WScript.QuitIf getPingResult(strClusterName,errorMessage)="" ThenIf MsgBox(errorMessage & ". Do you want to continue?",vbYesNo)<>vbYes Then WScript.QuitEnd IfstrDomainAccount = InputBox("Enter the Domain Account that the application pool is running under")If strDomainAccount = "" Then WScript.QuitstrRequiredSPN = "HTTP/" & strClusterNameIf instr(strDomainAccount,"\") > 0 thenIf getCategoryCount(split(strDomainAccount,"\")(1), "user")=0 ThenWScript.Echo "Domain account " & strDomainAccount & " does not exist"WScript.QuitEnd IfElseIf getCategoryCount(strDomainAccount, "user")=0 ThenWScript.Echo "Domain account " & strDomainAccount & " does not exist"WScript.QuitEnd IfEnd IfIf getCategoryCount(strRequiredSPN, "spn")>0 ThenWScript.Echo "SPN " & " is already set. Use search option for finding the account that it is set for"WScript.QuitEnd IfWScript.Echo "You need to set the SPN " & strRequiredSPN & " for domain account " & strDomainAccountElseIf MsgBox("Is IIS application pool running under domain account",vbYesNo)=vbYes Then strHostName = InputBox("Enter the hostname or host header or FQDN that you use to access the application")If strHostName = "" Then WScript.QuitIf getPingResult(strHostName,errorMessage)="" ThenIf MsgBox(errorMessage & ". Do you want to continue?",vbYesNo)<>vbYes Then WScript.QuitEnd IfstrDomainAccount = InputBox("Enter the Domain Account that the application pool is running under")If strDomainAccount = "" Then WScript.QuitIf instr(strDomainAccount,"\") > 0 thenIf getCategoryCount(split(strDomainAccount,"\")(1), "user")=0 ThenWScript.Echo "Domain account " & strDomainAccount & " does not exist"WScript.QuitEnd IfElseIf getCategoryCount(strDomainAccount, "user")=0 ThenWScript.Echo "Domain account " & strDomainAccount & " does not exist"WScript.QuitEnd IfEnd IfstrRequiredSPN = "HTTP/" & strHostNameIf getCategoryCount(strRequiredSPN, "spn")>0 ThenWScript.Echo "SPN " & strSPNRequired & " is already set. Use search option for finding the account that it is set for"WScript.QuitElseWScript.Echo "You need to set SPN " & strRequiredSPN & " for domain account " & strDomainAccountWScript.QuitEnd IfElsestrHostName = InputBox("Enter the host header or FQDN that you use to access the application")If strHostName = "" Then WScript.QuitIf getPingResult(strHostName,errorMessage)="" ThenIf MsgBox(errorMessage & ". Do you want to continue?",vbYesNo)<>vbYes Then WScript.QuitEnd IfIf MsgBox("Are you accessing the application with netbios name or FQDN or CNAME alias of IIS server?",vbYesNo)=vbYes ThenstrRequiredSPN = "host/" & strHostNameIf getCategoryCount(strRequiredSPN, "spn")>0 ThenWScript.Echo "Required SPN " & strRequiredSPN & " is already set. Use search option for finding the account that it is set for"WScript.QuitElseWScript.Echo "You need to set SPN " & strRequiredSPN & " for IIS server's netbios name"WScript.QuitEnd IfEnd IfstrHostHeader = InputBox("Enter the host header that you use to access the application")If strHostHeader = "" Then WScript.QuitstrRequiredSPN = "http/" & strHostHeaderIf getCategoryCount(strSPNRequired, "spn")>0 ThenWScript.Echo "A required SPN " & strSPNRequired & " is already set. Use search option to find the account the SPN is set to. If the required SPN is found under a different account, remove and add it to the IIS server's machine account."WScript.QuitElseWScript.Echo "You need to set SPN " & strRequiredSPN & " for IIS server's netbios name"WScript.QuitEnd IfEnd IfEnd IfCase Elsecall Help()End SelectEnd Functioncall Main()'
  3. Guarde el archivo como Spnhelper.vbs.
  4. En el símbolo del sistema, ejecute el archivo Spnhelper.vbs mediante la opción de línea de comandos apropiada. Nota: Para ver las opciones de línea de comandos para el archivo Spnhelper.vbs, escriba Spnhelper.vbs/help en un símbolo del sistema y, a continuación, presione ENTRAR.

Consideraciones adicionales

La autenticación Kerberos puede fallar cuando se configuren los SPN necesarios para las cuentas de equipo o para las cuentas de dominio. Si la autenticación Kerberos produce un error imprevisto, haga lo siguiente:
  • Compruebe que ningún SPN duplicados existe en el catálogo global para un SPN. Por ejemplo, si se establece el SPN HTTP/www.test.com para la cuenta myDomain\appPool1 y para la cuenta de myDomain\appPool2, un SPN duplicado existe aunque se configuren los SPN para diferentes cuentas. Además, si el SPN HTTP/iis6server1.mydomain.com está configurado para la cuenta myDomain\appPool1 y el SPN HTTP/iis6server1.mydomain.com también está asociado con la cuenta de equipo para el servidor, también tiene un SPN duplicado. Puede tener un SPN de HOST y un SPN de HTTP. El SPN de HTTP explícito anula una implícita que cubre la entrada de HOST. Sin embargo, si la dirección URL que los tipos de usuario está asociado con más de una cuenta de usuario o con más de una cuenta de equipo, tiene un SPN duplicado.
  • Compruebe que el SPN se han replicado en otros controladores de dominio. Problemas de replicación entre los controladores de dominio pueden impedir que los SPN replicar en otros controladores de dominio. Cuando los SPN no se replican en otros controladores de dominio, la aplicación no funcionen en algunos equipos cliente. Por ejemplo, si se establece el SPN HTTP/www.test.com para la cuenta myDomain\appPool1 en un controlador de dominio, el SPN HTTP/www.test.com no podrá encontrarse para la cuenta myDomain\appPool1 en un segundo controlador de dominio si el SPN no se ha replicado en el segundo controlador de dominio. Nota: De forma predeterminada, la replicación tarda 15 minutos.
  • Compruebe que el servidor Web está configurado para admitir la autenticación de Kerberos. Para ello, compruebe que la configuración de la clave NTAuthenticationProviders en la metabase de IIS no se cambió a NTLM. El valor predeterminado es Negotiate, NTLM.
  • Compruebe que el servidor o el servicio que está delegando las credenciales es de confianza para la delegación.
  • Compruebe que la cuenta que se ejecuta el servicio es de confianza para la delegación.
  • En Active Directory, compruebe que está desactivada la casilla de verificación de la cuenta es importante y no se puede delegar para los usuarios que accedan a la aplicación.
  • Si tiene acceso a la aplicación directamente desde el servidor, compruebe que está desactivada la casilla de verificación Comprobación de seguridad de bucle invertido . Para obtener más información acerca de cómo comprobar que se deshabilita la comprobación de bucle invertido, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
    896861 recibe un error 401.1 cuando explora un sitio Web que usa autenticación integrada y está alojado en IIS 5.1 o IIS 6
  • Compruebe que el cliente es un cliente habilitado para Kerberos. Además, compruebe que la opción Habilitar autenticación integrada de Windows está habilitada en Internet Explorer. Para ello, haga clic en Opciones de Internet en el menú Herramientas , haga clic en la ficha Opciones avanzadas y asegúrese de que está activada la casilla de verificación Habilitar autenticación integrada de Windows .
  • Compruebe que todos los equipos que forman parte del proceso de Kerberos tienen la resolución de nombres coherente y están conectados por la relación de confianza Kerberos. Por ejemplo, compruebe que los equipos que intervienen en el proceso de Kerberos están en el mismo bosque o que forman parte de una confianza de Kerberos entre bosques.
  • Compruebe que el tamaño del símbolo (token) no supera el valor establecido para la propiedad MaxTokenSize . Además, compruebe que el tamaño de la solicitud no supera el valor establecido para la propiedad MaxFieldLength . Estos valores pueden superarse si los usuarios que forman parte del proceso de Kerberos son miembros de muchos grupos.
    920862 mensaje de error cuando un usuario de Outlook Web Access intenta acceder a un buzón en Exchange Server 2003: "HTTP 400 Solicitud incorrecta (encabezado de solicitud demasiado larga)"
  • Compruebe que las directivas de seguridad necesarias están habilitadas al configurar cuentas de dominio para los grupos de aplicaciones. Para ello, compruebe que la cuenta de dominio es un miembro de las siguientes directivas de seguridad local en el equipo que está ejecutando IIS:
    • Ajustar cuotas de memoria para un proceso
    • Iniciar sesión como un servicio
    • Reemplazar un token de nivel de proceso
  • Compruebe que la autenticación Kerberos está funcionando correctamente sobre UDP. De forma predeterminada, la autenticación Kerberos utiliza UDP. Sin embargo, la pérdida de paquetes UDP puede producir un error en la autenticación de Kerberos. Cuando se produce este problema, puede forzar la autenticación Kerberos use TCP. Para obtener más información acerca de cómo forzar la autenticación Kerberos use TCP, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
    244474 Cómo forzar a Kerberos a usar TCP en lugar de UDP en Windows Server 2003, Windows XP y Windows 2000
  • Compruebe que la marca de tiempo en el autenticador no difiera en más de cinco minutos desde la marca de tiempo del servidor. Para obtener más información acerca de cómo resolver las diferencias de marca de hora, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
    232386 no puede iniciar sesión si no se sincronizan la hora y fecha
  • Compruebe que el puerto TCP/UDP 88 no esté bloqueado por un firewall o un enrutador. De forma predeterminada, la autenticación Kerberos utiliza el puerto TCP/UDP 88.
  • Compruebe que el entorno de modo de dominio es al menos un entorno de modo nativo de Microsoft Windows 2000. Para obtener más información acerca de cómo determinar el modo de dominio, visite el siguiente sitio Web de Microsoft:
  • En el cliente, compruebe que la dirección URL de la aplicación Web se agrega a los sitios de intranet local. Para obtener más información acerca de cómo agregar una dirección URL a la intranet local, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
    303650 sitio de intranet se identifica como un sitio de Internet cuando utiliza un FQDN o una dirección IP
  • Compruebe que cada dispositivo de gigabit ethernet está utilizando la versión más reciente del controlador. Para obtener más información acerca de los problemas que pueden producirse cuando los controladores para los dispositivos gigabit Ethernet no están actualizados, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
    326152 no puede conectarse al controlador de dominio y no se puede aplicar la directiva de grupo con dispositivos Gigabit Ethernet
Para obtener más información acerca de cómo utilizar la autenticación Kerberos con equilibrio de carga de sitios Web, visite el siguiente sitio Web de Microsoft:Para obtener más información acerca de los problemas que pueden producirse al utilizar la autenticación Kerberos con servidores proxy, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
321728 Internet Explorer admiten la autenticación Kerberos con servidores proxy
Para obtener más información acerca de cómo configurar IIS para admitir el protocolo Kerberos y el protocolo NTLM para la autenticación de red, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
215383 cómo configurar IIS para admitir el protocolo Kerberos y el protocolo NTLM para la autenticación de red
Para obtener más información acerca de cómo configurar un servidor virtual de Windows SharePoint Services para utilizar autenticación Kerberos y cómo volver desde la autenticación Kerberos a la autenticación NTLM, haga clic en el número de artículo siguiente para ver el artículo en el Microsoft Knowledge Base:
Cómo configurar un servidor virtual de Windows SharePoint Services para utilizar autenticación Kerberos y cómo volver desde la autenticación Kerberos a la autenticación NTLM de 832769
Para obtener más información acerca de los problemas que pueden producirse cuando utiliza el protocolo de autenticación Kerberos para conectarse a un servidor Web que utiliza un puerto no estándar en Windows XP o Windows Server 2003, haga clic en el número de artículo siguiente para verlo en el Microsoft Microsoft Knowledge Base:
908209 Internet Explorer 6 no puede utilizar el protocolo de autenticación Kerberos para conectarse a un servidor Web que utiliza un puerto no estándar en Windows XP o Windows Server 2003