Skip To Content

Tworzenie certyfikatu domeny

Oprogramowanie ArcGIS Enterprise wykorzystuje protokół HTTPS, który wymaga skonfigurowania certyfikatu w portalu. Przeglądarka internetowa Chrome traktuje jako zaufane tylko te certyfikaty domeny, które zawierają parametr alternatywnej nazwy podmiotu (subject alternative name — SAN). Tego parametru nie można skonfigurować za pomocą samej aplikacji Menedżer usług IIS, co oznacza, że certyfikaty utworzone w ramach tej procedury wykonywania zadań nie są traktowane jako zaufane przez przeglądarkę Chrome.

W większości przypadków niezbędny certyfikat domeny udostępni administrator IT. Poniższy skrypt tworzy certyfikat zawierający nazwę SAN i eksportuje go z Menedżera usług IIS w formacie, który następnie można zaimportować w portalu.

Zapisanie i uruchomienie skryptu certyfikatu

Aby utworzyć certyfikat domeny, domena musi już mieć jednostkę certyfikującą, a na komputerze musi być zainstalowany Menedżer usług IIS. Preferowanym środowiskiem na potrzeby tej procedury wykonywania zadań jest aplikacja Windows PowerShell ISE, ponieważ udostępnia zarówno okno skryptu, jak i okno wiersza poleceń.

Jeśli certyfikat dla danej nazwy hosta już istnieje na komputerze, skrypt spowoduje wyświetlenie pytania o chęć zastąpienia istniejącego certyfikatu.

  1. Otwórz aplikację Windows PowerShell ISE na komputerze za pomocą opcji Uruchom jako administrator i utwórz skrypt.
  2. Skopiuj i wklej poniższy tekst w oknie skryptu tej aplikacji.
  3. Zapisz skrypt jako plik .ps1, taki jak certificateScript.ps1.
  4. Na panelu wiersza poleceń aplikacji ISE przejdź do katalogu, w którym skrypt został zapisany i uruchom ten skrypt w następujący sposób: .\certificateScript.ps1

Skrypt certyfikatu do uruchomienia w aplikacji 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 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"
Notatka:

Jeśli podczas próby uruchomienia skryptu zostanie wyświetlony komunikat o błędzie wyjątku bezpieczeństwa, należy skorygować zasady wykonywania. Aby tymczasowo zezwolić na wykonywanie skryptów, uruchom następujące polecenie:

Set-ExecutionPolicy RemoteSigned -scope Process

Importowanie nowego certyfikatu do istniejącego wdrożenia

Jeśli wdrożenie oprogramowania ArcGIS Enterprise zostało już skonfigurowane, wykonaj poniższe czynności, aby zaimportować nowy certyfikat do portalu ArcGIS Enterprise i serwera hostującego, a także ustawić ten certyfikat jako domyślny certyfikat internetowy dla obu tych komponentów.

W poniższych czynnościach przedstawiono sposób importowania obu plików certyfikatów eksportowanych przez skrypt: certyfikatu głównego domeny w formacie .cer i certyfikatu serwera w formacie .pfx. Oba te certyfikaty powinny znajdować się w tym samym folderze, w którym zapisano skrypt. Lokalizacje tych certyfikatów są także podawane w danych wynikowych wiersza poleceń udostępnianych przy wykonywaniu skryptu.

Notatka:

Aby zaimportować nowy certyfikat wyłącznie na serwer hostujący, wykonaj etapy od 8 do 14.

  1. Zaloguj się do aplikacji ArcGIS Portal Administrator Directory pod adresem https://sample.domain.com:7443/arcgis/portaladmin.
  2. Wybierz opcje Bezpieczeństwo (Security) > Certyfikaty SSL (SSL Certificates) i kliknij opcję Importuj certyfikat główny lub pośredni (Import Root or Intermediate Certificate).
  3. Podaj alias certyfikatu i ścieżkę do pliku domainRoot.cer wyeksportowanego przez powyższy skrypt. Wybierz opcję Do not restart the portal after import (Nie restartuj portalu po imporcie) (portal zostanie zrestartowany w ramach operacji wykonywanej w etapie nr 7) i kliknij opcję Import (Importuj).
  4. Przejdź z powrotem do strony Certyfikaty SSL (SSL Certificates) i kliknij opcję Importuj istniejący certyfikat serwera (Import Existing Server Certificate).
  5. Wpisz hasło certyfikatu certificate i alias certyfikatu inny niż alias podany dla certyfikatu głównego, a następnie przejdź do pliku .pfx na Twoim komputerze. Kliknij przycisk Import (Importuj).
  6. Wróć do strony Certyfikaty SSL (SSL Certificates) i kliknij opcję Aktualizuj (Update).
  7. Zastąp wartość opcji Certyfikat SSL serwera internetowego aliasem certyfikatu .pfx zaimportowanego w etapie nr 5. Kliknij przycisk Update (Aktualizuj). Portal zostanie zrestartowany — operacja ta potrwa klika minut.
  8. Zaloguj się do aplikacji ArcGIS Server Administrator Directory pod adresem https://sample.domain.com:6443/arcgis/admin.
  9. Przejdź do katalogu machines > <nazwa komputera> > sslcertificates i kliknij pozycję importRootOrIntermediate.
  10. Podaj alias, tak jak w etapie 3, i przejdź do lokalizacji, w której znajduje się plik domainRoot.cer. Kliknij przycisk Import (Importuj).
  11. Wróć do strony komputera i kliknij pozycję importExistingServerCertificate.
  12. Ponownie wpisz hasło certificate i lokalizację certyfikatu .pfx na komputerze. Kliknij opcję Prześlij.
  13. Wróć do strony komputera i kliknij opcję Edytuj (edit).
  14. Zastąp wartość opcji Certyfikat SSL serwera internetowego (Web server SSL certificate) aliasem nowego certyfikatu domeny. Kliknij opcję Zapisz zmiany (Save Edits). Komputer serwera zostanie zrestartowany — operacja ta potrwa klika minut.

Po zakończeniu tej procedury wykonywania zadań nowy certyfikat portalu ArcGIS Enterprise i serwera hostującego zostaną uznane jako zaufane przez wszystkie przeglądarki internetowe.