Skip to main content

Создание сертификата домена

Эта тема не относится к ArcGIS Enterprise на Linux.

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

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

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

Чтобы создать сертификат домена, ваш домен должен иметь центр сертификации, и на вашем компьютере должен быть установлен диспетчер 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:")[-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"
Примечание:

Если при попытке запуска скрипта вы получаете сообщение об ошибке исключительной ситуации безопасности, необходимо изменить политику выполнения. Чтобы временно изменить сценарий и разрешить его выполнение, выполните следующую команду:

Set-ExecutionPolicy RemoteSigned -scope Process

Импорт нового сертификата в существующее развёртывание

Если ваше развертывание ArcGIS Enterprise уже настроено, выполните следующие шаги, чтобы установить новые веб-сертификаты по умолчанию как для Portal for ArcGIS, так и для хост-сервера.

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

Примечание:

Для импорта нового сертификата только на ваш хост-сервер выполните шаги с 8 по 14.

  1. Войдите в ArcGIS Portal Administrator Directory по адресу https://sample.example.com:7443/arcgis/portaladmin.

  2. Перейдите в БезопасностьСертификаты SSL и щелкните Импортировать корневой или промежуточный сертификат.

  3. Введите псевдоним сертификата и путь к файлу domainRoot.cer, экспортированному в указанном выше скрипте. Выберите опцию Не перезапускать портал после импорта (операция в шаге 7 перезапустит портал) и щелкните Импорт.

  4. Снова перейдите в Сертификаты SSL и щелкните Импортировать существующий сертификат сервера.

  5. Введите пароль сертификата certificate и псевдоним сертификата, отличающийся от псевдонима, который вы указали для корневого сертификата, а затем перейдите к файлу .pfx на своем компьютере. Щёлкните Импорт.

  6. Вернитесь на страницу Сертификаты SSL и щелкните Обновить.

  7. Замените значение SSL-сертификат веб-сервера на псевдоним сертификата .pfx, который вы импортировали в шаге 5. Щелкните Обновить. Портал перезапустится, это может занять несколько минут.

  8. Войдите в ArcGIS Server Administrator Directory по адресу https://sample.example.com:6443/arcgis/admin.

  9. Перейдите в компьютеры > <имя компьютера> > sslcertificates и щелкните importRootOrIntermediate.

  10. Введите псевдоним, как в шаге 3, и перейдите к местоположению файла domainRoot.cer. Щелкните Импорт.

  11. Вернитесь на страницу компьютера и щелкните importExistingServerCertificate.

  12. Снова введите пароль сертификата и местоположение сертификата .pfx на своем компьютере. Щелкните Подтвердить.

  13. Вернитесь на страницу компьютера и щелкните edit.

  14. Замените значение SSL-сертификат веб-сервера на псевдоним нового доменного сертификата. Щелкните Сохранить изменения. Компьютер сервера перезапустится, это может занять несколько минут.

Когда вы завершите этот рабочий процесс, новый сертификат станет доверенными во всех веб-браузерах.