Skip To Content

Настройка сертификата домена

ArcGIS Enterprise использует HTTPS, который требует, чтобы сертификат был сконфигурирован с ArcGIS Notebook Server. Интернет-браузер Chrome доверяет только тем сертификатам домена, которые содержат параметр subject alternative name (SAN). Этот параметр нельзя сконфигурировать в приложении IIS Manager отдельно, а это значит, что такому рабочему процессу Chrome не доверяет.

В большинстве случаев, ваш администратор IT предоставит вам необходимый сертификат, подписанный центром сертификации. Приведённый ниже скрипт создаёт сертификат, который содержит SAN, и экспортирует его из IIS Manager в формат, который затем можно импортировать на сайт ArcGIS Notebook Server.

Сохраните и экспортируйте скрипт сертификата

Чтобы создать сертификат домена, у домена должен быть центр сертификации, а на вашем компьютере должен быть установлен диспетчер IIS Manager. Лучше для этого рабочего процесса использовать среду Windows PowerShell ISE, так как в ней есть и окно скриптов, и окно командной строки.

  1. Откройте на своем компьютере приложение Windows PowerShell ISE с использованием опции Запустить от имени администратора и создайте новый скрипт.
  2. Скопируйте приведённый ниже текст и вставьте его в окно скрипта приложения.
  3. Сохраните скрипт как файл .ps1, например certificateScript.ps1.
  4. На панели командной строки приложения ISE измените директории на то местоположение, где был сохранен скрипт, и запустите следующий скрипт: .\certificateScript.ps1.

Сертификация скрипта на запуск в 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"
}

Импорт сертификата в ArcGIS Notebook Server

Эти шаги показывают, как импортировать оба файла сертификата, экспортированные скриптом: корневой сертификат домена в формате .cer и сертификат сервера в формате .pfx. Оба местоположения должны быть в той же папке, где вы сохранили скрипт; они также предоставляются в выходе командной строки при выполнении скрипта.

  1. Войдите в ArcGIS Notebook Server Administrator Directory в https://notebookserver.domain.com:11443/arcgis/admin.
  2. Перейдите в machines > <machine name> > sslcertificates и щелкните importRootOrIntermediate.
  3. Введите псевдоним как в шаге 3 и перейдите к местоположению файла domainRoot.cer. Щелкните Импорт.
  4. Вернитесь на страницу компьютера и щелкните importExistingServerCertificate.
  5. Снова введите пароль certificate и местоположение сертификата .pfx на своем компьютере. Щелкните Подтвердить.
  6. Вернитесь на страницу компьютера и щелкните edit.
  7. Замените значение SSL-сертификат веб-сервера на псевдоним нового доменного сертификата. Щелкните Сохранить изменения.

    Компьютер сервера перезапустится, это может занять несколько минут.