Skip To Content

Créer un certificat de domaine

ArcGIS Enterprise utilise HTTPS, qui nécessite la configuration d’un certificat avec votre portail. Depuis le début de l’année 2017, le navigateur Internet Chrome fait uniquement confiance aux certificats de domaine contenant un paramètre SAN (Subject Alternative Name). Ce paramètre ne peut pas être configuré par l’application IIS Manager seule, ce qui signifie que Chrome ne se fie pas aux certificats produits via ce processus.

Le plus souvent, votre administrateur informatique vous fournira le certificat de domaine nécessaire. Le script ci-dessous crée un certificat contenant un paramètre SAN et l’exporte à partir de IIS Manager dans un format pouvant ensuite être importé sur votre portail.

Enregistrer et exécuter le script de certificat

Pour que vous puissiez créer un certificat de domaine, votre domaine doit déjà posséder une autorité de certificat et IIS Manager doit être installé sur votre machine. L’environnement Windows PowerShell ISE est préférable pour ce processus, car il fournit à la fois une fenêtre de script et une fenêtre d’invite de commande.

  1. Ouvrez l’application Windows PowerShell ISE sur votre machine à l’aide de l’option Run as administrator (Exécuter en tant qu’administrateur), puis créez un nouveau script.
  2. Copiez le texte ci-dessous et collez-le dans la fenêtre de script de l’application.
  3. Enregistrez le script en tant que fichier .ps1 (par exemple, certificateScript.ps1).
  4. Dans le panneau d’invite de commande de l’application ISE, spécifiez les répertoires dans lesquels votre script a été enregistré, puis exécutez le script suivant : .\certificateScript.ps1

Script de certificat à exécuter dans 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 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"
	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"
}

Importer le nouveau certificat dans un déploiement existant

Si votre déploiement ArcGIS Enterprise a déjà été configuré, suivez les étapes ci-après pour importer le nouveau certificat sur votre portail ArcGIS Enterprise et votre serveur d’hébergement et pour en faire le certificat web par défaut des deux composants.

Ces étapes indiquent comment importer les deux fichiers de certificat exportés par le script : le certificat racine de domaine dans le format .cer et le certificat de serveur dans le format .pfx. L’emplacement des deux doit se trouver dans le dossier où vous avez enregistré le script ; il est également spécifié dans la sortie de l’invite de commande lorsque le script est exécuté.

  1. Connectez-vous à votre répertoire administrateur de ArcGIS Portal à l’adresse suivante : https://sample.domain.com:7443/arcgis/portaladmin.
  2. Accédez à Security (Sécurité) > SSL Certificates (Certificats SSL) et cliquez sur Import Root or Intermediate Certificate (Importer le certificat racine ou intermédiaire).
  3. Spécifiez un alias pour le certificat et le chemin d’accès au fichier domainRoot.cer exporté par le script ci-dessus. Sélectionnez l’option Do not restart the portal after import (Ne pas redémarrer le portail après l’importation) (l’opération effectuée à l’étape 7 redémarre le portail), puis cliquez sur Import (Importer).
  4. Revenez à SSL Certificates (Certificats SSL) et cliquez sur Import Existing Server Certificate (Importer le certificat de serveur existant).
  5. Entrez le mot de passe de certificat certificate et un alias de certificat différent de l’alias que vous avez spécifié pour le certificat racine, puis accédez au fichier .pfx sur votre machine. Cliquez sur Import (Importer)
  6. Retournez à la page SSL Certificates (Certificats SSL) et cliquez sur Update (Mettre à jour).
  7. Remplacez la valeur de Web server SSL certificate (Certificat SSL du serveur web) par l’alias du certificat .pfx que vous avez importé à l’étape 5. Cliquez sur Mettre à jour. Le portail redémarre, ce qui peut nécessiter jusqu’à quelques minutes.
  8. Connectez-vous à votre répertoire administrateur de ArcGIS Server à l’adresse suivante : https://sample.domain.com:6443/arcgis/admin.
  9. Accédez à machines > <nom de machine> > sslcertificates et cliquez sur importRootOrIntermediate.
  10. Entrez un alias comme à l’étape 3 et accédez à l’emplacement du fichier domainRoot.cer. Cliquez sur import (importer).
  11. Retournez à la page de la machine et cliquez sur importExistingServerCertificate.
  12. De nouveau, spécifiez le mot de passe certificate et l’emplacement du certificat .pfx sur votre machine. Cliquez sur Submit (Envoyer).
  13. Retournez à la page de la machine et cliquez sur edit (mettre à jour).
  14. Remplacez la valeur de Web server SSL certificate (Certificat SSL du serveur web) par l’alias du nouveau certificat de domaine. Cliquez sur Save Edits (Enregistrer les mises à jour). La machine de serveur redémarre, ce qui peut nécessiter jusqu’à quelques minutes.

Une fois le processus terminé, tous les navigateurs web se fient au nouveau certificat de votre portail ArcGIS Enterprise et de votre serveur d’hébergement.