Skip To Content

도메인 인증서 구성

ArcGIS Enterprise는 HTTPS를 사용하므로 ArcGIS Notebook Server에 디지털 인증서가 구성되어 있어야 합니다. Chrome 인터넷 브라우저는 주체 대체 이름(SAN) 매개변수가 포함된 도메인 인증서만 신뢰합니다. 이 매개변수는 IIS 관리자 응용프로그램 단독으로 구성할 수 없습니다. 즉, 해당 워크플로에서 생성된 인증서는 Chrome에서 신뢰하지 않습니다.

대부분의 경우 IT 관리자는 사용자에게 필수 CA 서명 인증서를 제공합니다. 아래 스크립트에서는 SAN이 포함된 인증서를 생성한 다음 나중에 ArcGIS Notebook Server 사이트로 가져올 수 있는 형식으로 IIS 관리자에서 내보냅니다.

인증서 스크립트 저장 및 실행

도메인 인증서를 생성하려면 도메인에 인증 기관이 있고 머신에 IIS 관리자가 설치되어 있어야 합니다. 이 워크플로에는 스크립트 창과 명령 프롬프트 창이 모두 제공되는 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:").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"
}

ArcGIS Notebook Server로 인증서 가져오기

이 단계에서는 스크립트에서 내보낸 두 인증서 파일(.cer 형식의 도메인 루트 인증서와 .pfx 형식의 서버 인증서)을 가져오는 방법을 안내합니다. 두 파일의 위치는 스크립트가 저장된 동일한 폴더여야 하며 스크립트 실행 시 명령 프롬프트 결과에도 제공됩니다.

  1. https://notebookserver.domain.com:11443/arcgis/admin에서 ArcGIS Notebook Server 관리자 디렉터리에 로그인합니다.
  2. 머신 > <머신 이름> > SSL 인증서로 이동한 다음 루트 또는 중간 인증서 가져오기를 클릭합니다.
  3. 3단계에서와 같이 별칭을 입력하고 domainRoot.cer 파일 위치로 이동합니다. 가져오기를 클릭합니다.
  4. 머신 페이지로 돌아간 다음 기존 서버 인증서 가져오기를 클릭합니다.
  5. 다시 비밀번호(certificate)와 머신의 .pfx 인증서 위치를 제공합니다. 제출을 클릭합니다.
  6. 머신 페이지로 돌아가서 편집을 클릭합니다.
  7. 웹 서버 SSL 인증서의 값을 새 도메인 인증서의 별칭으로 바꿉니다. 편집 내용 저장을 클릭합니다.

    서버 머신이 다시 시작되며 이때 몇 분 정도 소요됩니다.