ArcGIS Enterprise utiliza HTTPS, que exige que exista un certificado configurado con su portal. 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.
Si ya existe un certificado para el nombre de host en el equipo, el script le consultará si desea sobrescribir el certificado existente.
- Abra la aplicación Windows PowerShell ISE de su equipo empleando la opción Ejecutar como administrador y cree un script.
- Copie y pegue el texto que aparece a continuación en 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:")[-1].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
}
# Check if a certificate already exists and prompt user to overwrite
if (@(Get-ChildItem cert:\LocalMachine\My | where-object { $_.FriendlyName -eq "$hostname" }).count -ne 0) {
Write-Host "A certificate for $hostname already exists"
$reply = Read-Host -Prompt "Overwrite existing certificate? (y/n)"
if ( $reply -notmatch "[yY]" ) { Exit }
Get-ChildItem cert:\LocalMachine\My | where-object { $_.FriendlyName -eq "$hostname" } | Remove-Item
}
New-CertificateRequest -hostname $hostname > $null
Write-Host "`nCreated a new certificate for $hostname"
# 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 -eq "https"}).count -eq 0) {
New-WebBinding -name "Default Web Site" -Protocol https -Port 443
Write-Host 'Created https binding for "Default Web Site"'
}
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 -eq "$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 this certificate"
# Export certificate to .pfx (Windows 2016 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"
Remove-Item $scriptPath\$pfxname -ErrorAction Ignore
$pfxpwd = ConvertTo-SecureString -String "certificate" -Force -AsPlainText
$cert = (Get-ChildItem cert:\LocalMachine\My | where-object { $_.FriendlyName -eq "$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 "Exported certificate in PFX format with password 'certificate' to"
Write-Host " $scriptPath\$pfxname"
}
# Export domain CA root certificate to domainRoot.cer
Remove-Item $scriptPath\domainRoot.cer -ErrorAction Ignore
certutil -config $OnlineCA '-ca.cert' $scriptPath\domainRoot.cer > $null
Write-Host "Exported domain root certificate to"
Write-Host " $scriptPath\domainRoot.cer"
Nota:
Si recibe un mensaje de error de excepción de seguridad al intentar ejecutar el script, debe ajustar la política de ejecución. Para realizar un cambio temporal para que se pueda ejecutar el script, ejecute este comando:Set-ExecutionPolicy RemoteSigned -scope Process
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.
Nota:
Para importar el nuevo certificado en su servidor de alojamiento solamente, realice los pasos del 8 al 14.
- 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 y un alias de certificado distinto del alias que indicó para el certificado raíz y vaya 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.
- Especifique un alias como en el paso 3 y vaya 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, proporcione la contraseña certificate y la ubicación del 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.