ArcGIS Enterprise utiliza HTTPS, que exige que exista un certificado configurado con su portal. Desde 2017, el navegador de Internet Chrome solo confía en los certificados de dominio que contengan un parámetro de Nombre alternativo de sujeto (SAN, por sus siglas en inglés). Este parámetro no puede ser configurado de forma independiente por la aplicación Administrador de IIS, lo que significa que Chrome no confía en los certificados producidos desde este flujo de trabajo.
En la mayoría de los casos, su administrador de TI le proporcionará el certificado de dominio necesario. El script que aparece a continuación crea un certificado que contiene un SAN y lo exporta desde el Administrador de IIS a un formato que se puede importar a continuación al portal.
Guardar y ejecutar el script de certificado
Para crear un certificado de dominio, su dominio debe contar ya con una autoridad de certificados y su equipo debe tener instalado el Administrador de IIS. El entorno Windows PowerShell ISE preferible para este flujo de trabajo, ya que proporciona tanto una ventana de script como una ventana de comando.
- Abra la aplicación Windows PowerShell ISE de su equipo empleando la opción Ejecutar como administrador y cree un nuevo script.
- Copie y pegue el texto que aparece a continuación a la ventana de script de la aplicación.
- Guarde el script como archivo .ps1, por ejemplo, certificateScript.ps1.
- En el panel de comando de la aplicación ISE, cambie los directorios para apuntar a aquel en el que se guardó su script y ejecute el script siguiente: .\certificateScript.ps1
Script de certificado para su ejecución en PowerShell
function New-CertificateRequest {
param ( [string]$hostname )
$CATemplate = "WebServer"
$CertificateINI = "cert.ini"
$CertificateREQ = "cert.req"
$CertificateRSP = "cert.rsp"
$CertificateCER = "cert.cer"
$Subject = 'Subject="CN=' + $hostname + '"'
$FriendlyName = 'FriendlyName=' + $hostname
$SAN = '_continue_ = "dns=' + $hostname + '&"'
### INI file generation
new-item -type file $CertificateINI -force
add-content $CertificateINI '[Version]'
add-content $CertificateINI 'Signature="$Windows NT$"'
add-content $CertificateINI ''
add-content $CertificateINI '[NewRequest]'
add-content $CertificateINI $Subject
add-content $CertificateINI 'Exportable=TRUE'
add-content $CertificateINI 'KeyLength=2048'
add-content $CertificateINI 'KeySpec=1'
add-content $CertificateINI 'KeyUsage=0xA0'
add-content $CertificateINI 'MachineKeySet=True'
add-content $CertificateINI 'ProviderName="Microsoft RSA SChannel Cryptographic Provider"'
add-content $CertificateINI 'ProviderType=12'
add-content $CertificateINI 'SMIME=FALSE'
add-content $CertificateINI 'RequestType=PKCS10'
add-content $CertificateINI $FriendlyName
add-content $CertificateINI '[Strings]'
add-content $CertificateINI 'szOID_ENHANCED_KEY_USAGE = "2.5.29.37"'
add-content $CertificateINI 'szOID_PKIX_KP_SERVER_AUTH = "1.3.6.1.5.5.7.3.1"'
add-content $CertificateINI 'szOID_PKIX_KP_CLIENT_AUTH = "1.3.6.1.5.5.7.3.2"'
add-content $CertificateINI 'szOID_SUBJECT_ALT_NAME2 = "2.5.29.17"'
add-content $CertificateINI '[Extensions]'
add-content $CertificateINI '2.5.29.17 = "{text}"'
add-content $CertificateINI $SAN
### Certificate request generation
if (test-path $CertificateREQ) {del $CertificateREQ}
certreq -new $CertificateINI $CertificateREQ
### Online certificate request and import
if ($OnlineCA) {
if (test-path $CertificateCER) {del $CertificateCER}
if (test-path $CertificateRSP) {del $CertificateRSP}
certreq -submit -attrib "CertificateTemplate:$CATemplate" -config $OnlineCA $CertificateREQ $CertificateCER
certreq -accept $CertificateCER
}
### Delete certificate request files
if (test-path $CertificateINI) {del $CertificateINI}
if (test-path $CertificateREQ) {del $CertificateREQ}
if (test-path $CertificateRSP) {del $CertificateRSP}
if (test-path $CertificateCER) {del $CertificateCER}
}
## Main
if ($args.length -ne 0) {$hostname = $args[0]}
else {$hostname = "$env:computername.$env:userdnsdomain".ToLower()}
# Check if a CA exists in the domain and if IIS is installed
if (@(certutil -dump | select-string "Config:")) {
$OnlineCA = (certutil -dump | select-string "Config:").Line.replace("``",'"').replace("'",'"').split('"')[1]
} else {
Write-Host "Unable to determine certificate authority (CA) for this domain"
Exit
}
if (-not @(Get-Service W3SVC -ErrorAction Ignore)) {
Write-Host "IIS is not installed on this machine"
Exit
}
# Generate a certificate for the local machine if one does not already exist
if (@(Get-ChildItem cert:\LocalMachine\My | where-object { $_.FriendlyName -like "$hostname" }).count -eq 0) {
New-CertificateRequest -hostname $hostname > $null
Write-Host "Created a new certificate for $hostname"
} else {
Write-Host "A certificate for $hostname already exists"
}
# Create https binding if necessary and add new cert to https binding
import-module WebAdministration
if (@(Get-WebBinding -name "Default Web Site" | Where-Object {$_.protocol -match "https"}).count -eq 0) {
Write-Host 'Creating https binding for "Default Web Site"'
New-WebBinding -name "Default Web Site" -Protocol https -Port 443
}
if (@(netsh http show sslcert ipport="0.0.0.0:443" | select-string -pattern "IP:port").count -ne 0) {
netsh http delete sslcert ipport="0.0.0.0:443" > $null
}
$cert = (Get-ChildItem cert:\LocalMachine\My | where-object { $_.FriendlyName -like "$hostname" } | Select-Object -First 1).Thumbprint
$guid = [guid]::NewGuid().ToString("B")
netsh http add sslcert ipport="0.0.0.0:443" certhash=$cert certstorename=MY appid="$guid" > $null
Write-Host "Updated https binding to use certificate for $hostname"
# Export certificate to .pfx if it doesn't already exist (Windows 2012 and higher)
$scriptPath = split-path -parent $MyInvocation.MyCommand.Definition
if ([Environment]::OSVersion.Version -ge (new-object 'Version' 6,2)) {
$pfxname = $hostname.Split(".")[0]
if ($pfxname -eq '*') {$pfxname = "wildcard"}
$pfxname = $pfxname + ".pfx"
if (-Not (test-path $scriptPath\$pfxname)) {
$pfxpwd = ConvertTo-SecureString -String "certificate" -Force -AsPlainText
$cert = (Get-ChildItem cert:\LocalMachine\My | where-object { $_.FriendlyName -like "$hostname" } | Select-Object -First 1).Thumbprint
Get-ChildItem -Path cert:\localMachine\My\$cert | Export-PfxCertificate -FilePath $scriptPath\$pfxname -Password $pfxpwd -ChainOption EndEntityCertOnly > $null
Write-Host "Certificate for $hostname successfully exported to $scriptPath\$pfxname with password 'certificate'"
}
}
# Export domain CA root certificate to domainRoot.cer
if (-Not (test-path $scriptPath\domainRoot.cer) -And ($OnlineCA)) {
certutil -config $OnlineCA '-ca.cert' $scriptPath\domainRoot.cer > $null
Write-Host "Domain root certificate exported to $scriptPath\domainRoot.cer"
}
Importar el nuevo certificado a una implementación existente
Si su implementación de ArcGIS Enterprise ya está configurada, siga los pasos que aparecen a continuación para importar el nuevo certificado a su portal de ArcGIS Enterprise y su servidor de alojamiento, así como para establecerlo como certificado de web predeterminado para ambos componentes.
Estos pasos resumen la forma de importar los dos archivos de certificado exportados por el script: el certificado raíz de dominio en formato .cer y el certificado de servidor en formato .pfx. Las ubicaciones de ambos deben estar en la misma carpeta en la que guardó el script; también se indican en la salida del comando al ejecutar el script.
- Inicie sesión en su directorio de administrador de portal de ArcGIS en https://sample.domain.com:7443/arcgis/portaladmin.
- Navegue a Seguridad > Certificados SSL y haga clic en Importar certificado raíz o intermedio.
- Indique un alias para el certificado y la ruta del archivo domainRoot.cer exportado por el script anterior. Seleccione la opción No reiniciar el portal tras importar (la operación del paso 7 reiniciará el portal) y haga clic en Importar.
- Regrese a Certificados SSL y haga clic en Importar certificado de servidor existente.
- Introduzca la contraseña de certificado certificate y un alias de certificado distinto del alias que indicó para el certificado raíz; continuación, navegue al archivo .pfx de su equipo. Haga clic en Importar.
- Vuelva a la página Certificados SSL y haga clic en Actualizar.
- Sustituya el valor de Certificado SSL de servidor web por el alias del certificado .pfx que importó en el paso 5. Haga clic en Actualizar. El portal se reinicia, lo que requiere unos minutos.
- Inicie sesión en su directorio de administrador de ArcGIS Server en https://sample.domain.com:6443/arcgis/admin.
- Busque machines > <nombre del equipo> > sslcertificates y haga clic en importRootOrIntermediate.
- Introduzca un alias como hizo en el paso 3 y navegue a la ubicación del archivo domainRoot.cer. Haga clic en Importar.
- Regrese a la página del equipo y haga clic en importExistingServerCertificate.
- También en este caso, indique la contraseña certificate y la ubicación de certificado de .pfx en su equipo. Haga clic en Enviar.
- Vuelva a la página del equipo y haga clic en Editar.
- Sustituya el valor de Certificado SSL de servidor web por el alias del nuevo certificado de dominio. Haga clic en Guardar cambios. El equipo del servidor se reinicia, lo que requiere unos minutos.
Cuando haya completado el flujo de trabajo, el nuevo certificado de su portal de ArcGIS Enterprise y el servidor de alojamiento serán considerados como sitios de confianza en todos los navegadores web.