Skip To Content

Crear un certificado de dominio

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 configurarse únicamente mediante la aplicación IIS Manager, es decir que Chrome no confía en los certificados producidos a partir de ese 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 IIS Manager a un formato que se puede importar al portal.

Guardar y ejecutar el script de certificado

Para crear un certificado de dominio, su dominio debe tener ya una autoridad de certificación e IIS Manager debe estar instalado en su máquina. Para este flujo de trabajo se recomienda el entorno Windows PowerShell ISE, ya que proporciona tanto una ventana de script como una ventana de símbolo del sistema.

Si existe un certificado para el nombre de host en el equipo, el script le solicita si desea sobrescribir el certificado existente.

  1. Abra la aplicación Windows PowerShell ISE de su equipo empleando la opción Ejecutar como administrador y cree un script.
  2. Copie el texto siguiente en la ventana de script de la aplicación.
  3. Guarde el script como archivo .ps1, por ejemplo, certificateScript.ps1.
  4. En el panel de comandos de la aplicación ISE, cambie los directorios para apuntar a aquel en el que se guardó el script y ejecute el script .\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 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"
    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"

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 como archivo .cer y el certificado de servidor como archivo .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.

  1. Inicie sesión en su directorio de administrador de portal de ArcGIS en https://sample.domain.com:7443/arcgis/portaladmin.
  2. Navegue a Seguridad > Certificados SSL y haga clic en Importar certificado raíz o intermedio.
  3. 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.
  4. Regrese a Certificados SSL y haga clic en Importar certificado de servidor existente.
  5. Introduzca certificate como 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.
  6. Vuelva a la página Certificados SSL y haga clic en Actualizar.
  7. 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, proceso que puede tardar unos minutos.

  8. Inicie sesión en su directorio de administrador de ArcGIS Server en https://sample.domain.com:6443/arcgis/admin.
  9. Busque machines > <nombre del equipo> > sslcertificates y haga clic en importRootOrIntermediate.
  10. Especifique un alias como hizo en el paso 3 y vaya a la ubicación del archivo domainRoot.cer. Haga clic en Importar.
  11. Regrese a la página del equipo y haga clic en importExistingServerCertificate.
  12. Introduzca certificate como contraseña y especifique la ubicación del certificado .pfx en su equipo. Haga clic en Enviar.
  13. Vuelva a la página del equipo y haga clic en Editar.
  14. Sustituya el valor de Certificado SSL de servidor web por el alias del nuevo certificado de dominio. Haga clic en Guardar cambios.

    El equipo servidor se reinicia, proceso que puede tardar unos minutos.

El nuevo certificado de su portal de ArcGIS Enterprise y el servidor de alojamiento serán considerados ahora como sitios de confianza en todos los navegadores web.