ArcGIS Enterprise utilizza HTTPS, che richiede la configurazione di un certificato con il portale. Il browser Internet Chrome considera attendibili solo dei certificati di dominio che contengono un parametro Subject Alternative Name (SAN). Questo parametro non può essere configurato solo dall'applicazione IIS Manager, il che significa che i certificati prodotti da quel flusso di lavoro non sono considerati attendibili da Chrome.
Nella maggior parte dei casi, l'amministratore IT fornisce il certificato di dominio necessario. Lo script seguente crea un certificato che contiene una SAN e lo esporta da IIS Manager in un formato che può quindi essere importato nel portale.
Salvare ed eseguire lo script del certificato
Per creare un certificato di dominio, il dominio deve già disporre di un'autorità di certificazione e il computer deve avere IIS Manager installato. L'ambiente Windows PowerShell ISE è preferibile per questo flusso di lavoro, poiché fornisce una finestra di script che una finestra prompt dei comandi.
Se il computer contiene già un certificato per il nome host, lo script chiederà se si desidera sovrascrivere il certificato esistente.
- Aprire l'applicazione Windows PowerShell ISE sul computer utilizzando l'opzione Esegui come amministratore e creare uno script.
- Copiare e incollare il testo sottostante nella finestra di script dell'applicazione.
- Salvare lo script come file .ps1, ad esempio certificateScript.ps1.
- Nel pannello del prompt dei comandi dell'applicazione ISE, cambiare le directory in cui è stato salvato lo script ed eseguire il seguente script: .\certificateScript.ps1
Script del certificato da eseguire in 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 BuildChain > $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:
Se appare un messaggio di errore di eccezione di sicurezza quando si prova a eseguire lo script, è necessario modificare i criteri di esecuzione. Per apportare una modifica temporanea per consentire l'esecuzione dello script, eseguire il comando seguente:Set-ExecutionPolicy RemoteSigned -scope Process
Importare il nuovo certificato in una distribuzione esistente
Se la distribuzione ArcGIS Enterprise è già stata configurata, attenersi alla seguente procedura per importare il nuovo certificato nel portale ArcGIS Enterprise e nel server di hosting e per renderlo il certificato Web predefinito per entrambi i componenti.
Questi passaggi descrivono il modo in cui importare entrambi i file di certificato esportati dallo script: il certificato radice del dominio in formato .cer e il certificato del server in formato .pfx. Le posizioni di entrambi dovrebbero essere nella stessa cartella in cui si è salvato lo script; vengono inoltre forniti nell'output del prompt dei comandi quando si esegue lo script.
Nota:
Per importare il nuovo certificato solo al server di host, seguire i passaggi da 8 a 14.
- Effettuare l'accesso ad ArcGIS Portal Administrator Directory su https://sample.domain.com:7443/arcgis/portaladmin.
- Passare a Sicurezza > Certificati SSL e fare clic su Importa certificato radice o intermedio.
- Fornire un alias per il certificato e il percorso del file al file domainRoot.cer esportato dallo script in alto. Selezionare l’opzione Non riavviare il portale dopo l’importazione (l’operazione del passaggio 7 riavvia il portale) e fare clic su Importa.
- Passare di nuovo a Certificati SSL e fare clic su Importa un certificato server esistente.
- Digitare la password del certificato certificate e un alias del certificato diverso da quello fornito per il certificato root, quindi individuare il file sul proprio computer. .pfx Fare clic su Importa.
- Tornare alla pagina Certificati SSL e fare clic su Aggiorna.
- Sostituire il valore per Certificato SSL server Web con l'alias del certificato .pfx che è stato importato nel passaggio 5. Fare clic su Aggiorna. Il portale si riavvia e l’operazione richiede qualche minuto.
- Effettuare l'accesso ad ArcGIS Server Administrator Directory su https://sample.domain.com:6443/arcgis/admin.
- Passare a machines > <nome computer> > sslcertificates e fare clic su importRootOrIntermediate.
- Fornire un alias come è stato fatto nel passaggio 3 ed individuare la posizione del file domainRoot.cer. Fare clic su Importa.
- Passare di nuovo alla pagina del computer e fare clic su importExistingServerCertificate.
- Digitare nuovamente la password certificate e la posizione del certificato .pfx sul proprio computer. Fare clic su Invia.
- Tornare alla pagina del computer e fare clic su Modifica.
- Sostituire il valore per Certificato SSL server Web con l’alias del nuovo certificato di dominio. Fare clic su Salva modifiche. Il computer server si riavvia e l’operazione richiede qualche minuto.
Una volta completato il flusso di lavoro, il nuovo certificato per il portale ArcGIS Enterprise e il server di hosting sarà considerato attendibile da tutti i browser Web.