Da ArcGIS Enterprise HTTPS verwendet, muss ein Zertifikat mit Ihrem Portal konfiguriert werden. Seit 2017 gelten im Internetbrowser Chrome nur die Domänenzertifikate als vertrauenswürdig, die den Parameter "Alternativer Name des Antragstellers" (Subject Alternative Name, SAN) enthalten. Dieser Parameter kann nicht durch die Anwendung IIS Manager allein konfiguriert werden. Das bedeutet, dass Zertifikate, die in diesem Workflow erstellt werden, durch Chrome nicht als vertrauenswürdig eingestuft werden.
In den meisten Fällen erhalten Sie das erforderliche Domänenzertifikat von Ihrem IT-Administrator. Das folgende Skript erstellt ein Zertifikat, das einen SAN enthält, und exportiert es aus IIS Manager in einem Format, in dem es in Ihr Portal importiert werden kann.
Speichern und Ausführen des Zertifikatskripts
Damit ein Domänenzertifikat erstellt werden kann, muss Ihre Domäne bereits eine Zertifizierungsstelle enthalten und auf Ihrem Computer muss IIS Manager installiert sein. Für diesen Workflow sollte vorzugsweise die Windows PowerShell ISE-Umgebung verwendet werden, da sie sowohl ein Skriptfenster als auch ein Eingabeaufforderungsfenster bereitstellt.
Wenn auf dem Computer bereits ein Zertifikat für den Hostnamen vorhanden ist, müssen Sie angeben, ob dieses überschrieben werden soll.
- Öffnen Sie die Anwendung Windows PowerShell ISE unter Verwendung der Option Als Administrator ausführen auf Ihrem Computer und erstellen Sie ein Skript.
- Kopieren Sie den folgenden Text über die Zwischenablage in das Skriptfenster der Anwendung.
- Speichern Sie das Skript als .ps1-Datei, zum Beispiel als certificateScript.ps1.
- Wechseln Sie im Eingabeaufforderungsfenster der ISE-Anwendung in das Verzeichnis, in dem Ihr Skript gespeichert wurde, und führen Sie das folgende Skript aus: .\certificateScript.ps1
Zertifikatskript, das in PowerShell ausgeführt werden muss
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
}
# 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"
Importieren des neuen Zertifikats in eine vorhandene Bereitstellung
Wenn Ihre ArcGIS Enterprise-Bereitstellung bereits eingerichtet wurde, dann führen Sie die folgenden Schritte aus, um das neue Zertifikat in Ihr ArcGIS Enterprise-Portal und Ihren Hosting-Server zu importieren und als Standard-Webzertifikat für beide Komponenten festzulegen.
In diesen Schritten wird beschrieben, wie Sie die beiden Zertifikatsdateien, die durch das Skript exportiert wurden, importieren: Das Stammzertifikat der Domäne im .cer-Format und das Serverzertifikat im .pfx-Format. Beide Dateien müssen in dem Ordner gespeichert sein, in dem Sie Ihr Skript gespeichert haben. Sie werden auch in der Ausgabe der Eingabeaufforderung angegeben, wenn das Skript ausgeführt wird.
- Melden Sie sich bei Ihrem ArcGIS Portal-Administratorverzeichnis unter https://sample.domain.com:7443/arcgis/portaladmin an.
- Navigieren Sie zu Security > SSL Certificates und klicken Sie auf Import Root or Intermediate Certificate.
- Geben Sie einen Alias für das Zertifikat und den Dateipfad zur Datei domainRoot.cer, die durch das Skript exportiert wurde, an. Wählen Sie die Option Do not restart the portal after import aus (das Portal wird mit der Operation in Schritt 7 neu gestartet) und klicken Sie auf Import.
- Navigieren Sie zurück zu SSL Certificates und klicken Sie auf Import Existing Server Certificate.
- Geben Sie das Zertifikatskennwort certificate und einen Zertifikatsalias, der sich von dem Alias, den Sie für das Stammzertifikat angegeben haben, unterscheidet, ein und navigieren Sie dann zur .pfx-Datei auf Ihrem Computer. Klicken Sie auf Import.
- Kehren Sie zur Seite SSL Certificates zurück und klicken Sie auf Update.
- Ersetzen Sie den Wert für Web server SSL certificate durch den Alias des .pfx-Zertifikats, das Sie in Schritt 5 importiert haben. Klicken Sie auf Update. Das Portal wird neu gestartet. Dies kann einige Minuten dauern.
- Melden Sie sich bei Ihrem ArcGIS-Server-Administratorverzeichnis unter https://sample.domain.com:6443/arcgis/admin an.
- Navigieren Sie zu machines > <Computername> > sslcertificates und klicken Sie auf importRootOrIntermediate.
- Geben Sie einen Alias wie in Schritt 3 ein und navigieren Sie zur Datei domainRoot.cer. Klicken Sie auf Import.
- Navigieren Sie zurück zur Seite mit dem Computernamen und klicken Sie auf importExistingServerCertificate.
- Geben Sie auch hier das Kennwort certificate und den Speicherort des .pfx-Zertifikats auf Ihrem Computer an. Klicken Sie auf Submit.
- Navigieren Sie zurück zur Seite mit dem Computernamen und klicken Sie auf edit.
- Ersetzen Sie den Wert für Web server SSL certificate durch den Alias des neuen Domänenzertifikats. Klicken Sie auf Save Edits. Der Servercomputer wird neu gestartet. Dies kann einige Minuten dauern.
Wenn Sie diesen Workflow abgeschlossen haben, wird das neue Zertifikat für Ihr ArcGIS Enterprise-Portal und Ihren Hosting-Server durch alle Webbrowser als vertrauenswürdig eingestuft.