ArcGIS Enterprise يستخدم HTTPS، الذي يتطلب أن يتم تكوين الشهادة الرقمية مع ArcGIS Notebook Server. ابتداءً من عام 2017، مستعرض الإنترنت Chrome يوثق فقط شهادات المجال التي تحتوي على معلمة الاسم البديل للموضوع (SAN). يتعذر تكوين هذه المعلمة بواسطة تطبيق IIS Manager على حدة، مما يعني أن الشهادات التي يتم إنتاجها من دورة العمل تكون غير موثوقة بواسطة Chrome.
في معظم الحالات، مسؤول IT الخاص بك سوف يزودك بالشهادة الموقعة من المرجع المصدق اللازمة. يقوم البرنامج النصي التالي بإنشاء شهادة تتضمن SAN وتقوم بتصديرها من IIS Manager في تنسيق يمكن استيراده عندئذِ في موقع ArcGIS Notebook Server.
احفظ البرنامج النصي للشهادة وقم بتنفيذه
لإنشاء شهادم المجال، يجب أن يكون للمجال الخاص بك مرجع مصدق بالفعل، ويجب أن يتم تثبيت IIS Manager على الجهاز الخاص بك. تعتبر بيئة Windows PowerShell ISE الأفضل لدورة العمل الحالية، حيث أنها توفر كلاً من نافذة البرنامج النصي ونافذة موجه الأوامر.
- افتح تطبيق Windows PowerShell ISE على الجهاز الخاص بك باستخدام خيار تنفيذ كمسؤول ، وقم بإنشاء برنامج نصي جديد.
- انسخ النص التالي وقم بلصقه في نافذة البرنامج النصي من التطبيق.
- احفظ البرنامج النصي في صورة ملف .ps1 ، مثل certificateScript.ps1.
- في لوحة موجه الأوامر من تطبيق 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 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"
}
استيراد شهادة جديدة في ArcGIS Notebook Server
توضح تلك الخطوات كيفية استيراك كلا ملفات الشهادة التي تم تصديرها بواسطة البرنامج النصي: الشهادة الأساسية للمجال في التنسيق .cer وشهادة الخادم في تنسيق .pfx . ينبغي أن تكون مواقع كلاهما في نفس المجلد حيث يتم حفظ البرنامج النصي؛ ويتم توفيرهم أيضاً في موجه الأوامر الناتج عند تنفيذ البرنامج النصي.
- سجل الدخول إلى دليل مسؤول ArcGIS Notebook Server على https://notebookserver.domain.com:11443/arcgis/admin.
- استعرض الأجهزة > <machine name> > sslcertificates وانقر فوق importRootOrIntermediate.
- أدخل اسم مستعار كما في الخطوة 3 واستعرض الموقع الخاص بملف domainRoot.cer. انقر فوق استيراد.
- استعرض مرة أخرى صفحة الجهاز وانقر فوق importExistingServerCertificate.
- وفّر مرة أخرى كلمة مرور الشهادة والموقع الخاص بالشهادة .pfx على جهازك. انقر فوق إرسال.
- قم بالرجوع إلى صفحة الجهاز وانقر فوق تحرير.
- استبدل القيمة الخاصة بشهادة SSL لخادم الويب مع الاسم المستعار لشهادة المجال الجديدة. انقر على حفظ عمليات التحرير. سوف يعاد تشغيل جهاز الخادم، الذي يستغرق بضع دقائق.