ArcGIS Enterprise utiliza HTTPS, que exige que exista un certificado digital configurado con ArcGIS Notebook Server. 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 en un sitio de ArcGIS Notebook Server.
Guardar y ejecutar el script de certificado
Para crear un certificado de dominio, el 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 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ó el 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 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"
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 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.
- Inicie sesión en el Directorio de administrador de ArcGIS Notebook Server en https://notebookserver.domain.com:11443/arcgis/admin.
- Busque machines > <nombre del equipo> > sslcertificates y haga clic en importRootOrIntermediate.
- Introduzca un alias como hizo 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, 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.