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 apenas pelo aplicativo IIS Manager, o que significa que os certificados produzidos a partir desse fluxo de trabalho não são confiáveis ​​para o Chrome.

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

Salve e execute o script de certificado

Para criar um certificado de domínio, seu domínio já deve ter uma autoridade de certificação e o IIS Manager deve estar instalado em sua máquina. O ambiente Windows PowerShell ISE é recomendado para este fluxo de trabalho, pois fornece uma janela de script e uma janela de comando.

Se houver um certificado para o nome do host em sua máquina, o script perguntará se você 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 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 prompt de comando do aplicativo ISE, mude os diretórios para onde o script foi salvo e execute o 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"

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 descrevem como importar os dois arquivos de certificado exportados pelo script: o certificado raiz do domínio como um arquivo .cer e o certificado do servidor como um arquivo .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 do 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. Digite certificado como a senha do certificado, digite um nome alternativo de certificado diferente do nome alternativo fornecido para o certificado raiz e vá até o 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 é reiniciado, o que pode levar 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 você fez na etapa 3 e vá até o local do arquivo domainRoot.cer. Clique em importar.
  11. Procure novamente pela página da máquina e clique em importExistingServerCertificate.
  12. Digite certificado como a senha e digite a localização do certificado .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 é reiniciada, o que pode levar alguns minutos.

O novo certificado para o seu portal ArcGIS Enterprise e servidor de hospedagem agora será confiável para todos os navegadores da web.