Skip To Content

Criar um certificado de domínio

O ArcGIS Enterprise utiliza HTTPS, que exige que um certificado seja configurado com seu portal. Iniciando em 2017, o navegador da internet Chrome somente confia em certificados de domínio que contenha um parâmetro de nome alternativo do assunto (SAN). Este parâmetro não pode ser configurado somente pelo aplicativo IIS Manager, isto significa que os certificados produzidos deste fluxo de trabalho não são confiáveis pelo Chrome.

Na maioria dos casos, seu administrador de TI fornecerá o certificado de domínio necessário. O script abaixo cria um certificado que contém um SAN e o exporta do IIS Manager em um formato que pode então ser importado em seu portal.

Salve e execute o script de certificado

Para criar um certificado de domínio, seu domínio deve já ter uma autoridade de certificado e sua máquina deve ter o IIS Manager instalado. O ambiente Windows PowerShell ISE é preferível para este fluxo de trabalho, já ele fornece ambos uma janela de script e uma janela de comandos.

Se um certificado do nome do host já existir em sua máquina, o script irá solicitar a você se deseja substituir o certificado existente.

  1. Abra o aplicativo Windows PowerShell ISE em sua máquina utilizando a opção Executar como administrador e crie um novo script.
  2. Copie e cole o texto abaixo na janela de script do aplicativo.
  3. Salve o script como o arquivo .ps1, tal como certificateScript.ps1.
  4. No painel do comando do aplicativo ISE, altere os diretórios para onde seu script foi salvo e execute o seguinte script: .\certificateScript.ps1

O script de certificado para ser executado no 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 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"
Anotação:

Se você receber uma mensagem de erro de exceção de segurança ao tentar executar o script, a política de execução precisa ser ajustada. Para fazer uma mudança temporária para permitir que o script execute, execute o comando seguinte:

Set-ExecutionPolicy RemoteSigned -scope Process

Importar o novo certificado em uma implantação existente

Se a sua implantação do ArcGIS Enterprise já tiver sido configurada, siga as etapas abaixo para importar o novo certificado em seu portal do ArcGIS Enterprise e seu servidor de hospedagem e torne o certificado da web padrão para ambos os componentes.

Estas etapas esboçam como importar ambos os arquivos de certificado exportado pelo script: o certificado de raiz de domínio no formato .cer e o certificado de servidor no formato .pfx. As localizações de ambos devem estar na mesma pasta onde você salvou o script; eles também são fornecidos na saída do comando quando o script é executado.

  1. Entre no ArcGIS Portal Administrator Directory em https://sample.domain.com:7443/arcgis/portaladmin.
  2. Procure por Segurança > Certificados SSL e clique em Importar Raiz ou Certificado Intermediário.
  3. Forneça um nome alternativo para o certificado e o caminho de arquivo para o arquivo domainRoot.cer exportado pelo script acima. Selecione opção Não reinicie o portal após importar (a operação na etapa 7 reiniciará o portal) e clique em Importar.
  4. Procure novamente por Certificados SSL e clique em Importar Certificado de Servidor Existente.
  5. Insira a senha do certificado certificado e um nome alternativo do certificado diferente do nome alternativo que você forneceu para o certificado raiz e então procure pelo arquivo .pfx em sua máquina. Clique em Importar.
  6. Retorne à página Certificados SSL e clique em Atualizar.
  7. Substitua o valor para Certificado SSL de servidor da web com o nome alternativo do certificado .pfx que você importou na etapa 5. Clique em Atualizar. O portal reiniciará, o que pode demorar alguns minutos.
  8. Registre no seu ArcGIS Server Administrator Directory em https://sample.domain.com:6443/arcgis/admin.
  9. Procure por máquinas > <nome de máquina> > sslcertificates e clique em importRootOrIntermediate.
  10. Forneça um nome alternativo como na etapa 3 e procure pela localização do arquivo domainRoot.cer. Clique em importar.
  11. Procure novamente pela página da máquina e clique em importExistingServerCertificate.
  12. Novamente, digite a senha do certificado e a localização do certificado do .pfx em sua máquina. Clique em Enviar.
  13. Retorne à página da máquina e clique em editar.
  14. Substitua o valor para Certificado SSL de servidor da web com o nome alternativo do novo certificado de domínio. Clique em Salvar Edição. A máquina do servidor reiniciará, o qual leva alguns minutos.

Quando você completar o fluxo de trabalho, o novo certificado para seu portal do ArcGIS Enterprise e servidor de hospedagem será confiável por todos os navegadores da web.