Skip To Content

Configurar un nuevo certificado de dominio

ArcGIS Enterprise utiliza HTTPS, que exige que exista un certificado digital configurado con ArcGIS Notebook Server. 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 necesario firmado por una autoridad certificadora. 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 sitio de ArcGIS Notebook Server.

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.

  1. Abra la aplicación Windows PowerShell ISE de su equipo empleando la opción Ejecutar como administrador y cree un nuevo script.
  2. Copie y pegue el texto que aparece a continuación a la ventana de script de la aplicación.
  3. Guarde el script como archivo .ps1, por ejemplo, certificateScript.ps1.
  4. 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 en ArcGIS Notebook Server

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.

  1. Inicie sesión en el Directorio de administrador de ArcGIS Notebook Server en https://notebookserver.domain.com:11443/arcgis/admin.
  2. Busque machines > <nombre del equipo> > sslcertificates y haga clic en importRootOrIntermediate.
  3. Introduzca un alias como hizo en el paso 3 y vaya a la ubicación del archivo domainRoot.cer. Haga clic en Importar.
  4. Regrese a la página del equipo y haga clic en importExistingServerCertificate.
  5. 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.
  6. Vuelva a la página del equipo y haga clic en Editar.
  7. 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.