Skip To Content

Configurer un nouveau certificat de domaine

ArcGIS Enterprise utilise le protocole HTTPS, qui nécessite la configuration d’un certificat numérique avec ArcGIS Notebook Server. 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 fournit le certificat signé par une autorité de certification nécessaire. Le script ci-dessous crée un certificat contenant un autre nom d’objet et l’exporte à partir de IIS Manager dans un format pouvant ensuite être importé dans votre site ArcGIS Notebook Server.

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 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"
}

Importer le nouveau certificat dans ArcGIS Notebook Server

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 ArcGIS Notebook Server à l’adresse https://notebookserver.domain.com:11443/arcgis/admin.
  2. Accédez à machines > <nom de machine> > sslcertificates et cliquez sur importRootOrIntermediate.
  3. Entrez un alias comme à l’étape 3 et accédez à l’emplacement du fichier domainRoot.cer. Cliquez sur import (importer).
  4. Retournez à la page de la machine et cliquez sur importExistingServerCertificate.
  5. De nouveau, spécifiez le mot de passe certificate et l’emplacement du certificat .pfx sur votre machine. Cliquez sur Submit (Envoyer).
  6. Retournez à la page de la machine et cliquez sur edit (mettre à jour).
  7. Remplacez la valeur de Web server SSL certificate (Certificat SSL du serveur web) par l’alias du nouveau certificat de domaine. Cliquez sur Enregistrer les mises à jour. La machine de serveur redémarre, ce qui peut nécessiter jusqu’à quelques minutes.