Skip To Content

إنشاء شهادة المجال

يستخدم ArcGIS Enterprise HTTPS، التي تتطلب أن يتم تكوين الشهادة مع البوابة الإلكترونية. ابتداءً من عام 2017، يوثق مستعرض الإنترنت Chrome فقط شهادات المجال التي تحتوي على معلمة الاسم البديل للموضوع (SAN). يتعذر تكوين هذه المعلمة بواسطة تطبيق IIS Manager على حدة، مما يعني أن الشهادات التي يتم إنتاجها من دورة العمل تكون غير موثوقة بواسطة Chrome.

في معظم الحالات، مسؤول IT الخاص بك سوف يزودك بشهادة المجال اللازمة. يقوم البرنامج النصي التالي بإنشاء شهادة تتضمن SAN وتقوم بتصديرها من IIS Manager في تنسيق يمكن استيراده عندئذِ في البوابة الإلكترونية.

احفظ البرنامج النصي للشهادة وقم بتنفيذه

لإنشاء شهادم المجال، يجب أن يكون للمجال الخاص بك مرجع مصدق بالفعل، ويجب أن يتم تثبيت IIS Manager على الجهاز الخاص بك. تعتبر بيئة 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:")[-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"
ملاحظة:‏

إذا تلقيت رسالة خطأ استثناء أمان عند محاولة تشغيل البرنامج النصي، فإن سياسة التنفيذ بحاجة إلى تعديلها. لإجراء تغيير مؤقت للسماح بتنفيذ البرنامج النصي، قم بتشغيل الأمر التالي:

Set-ExecutionPolicy RemoteSigned -scope Process

قم باستيراد الشهادة الجديدة في عملية النشر الحالية

إذا تم إعداد عملية النشر ArcGIS Enterprise بالفعل، اتبع الخطوات أدناه لاستيراد الشهادة الجديدة في بوابة ArcGIS Enterprise الإلكترونية وخادم الاستضافة، وجعلها شهادة الويب الافتراضية لكلا المكونين.

توضح تلك الخطوات كيفية استيراد كلا ملفي الشهادة التي تم تصديرهما بواسطة البرنامج النصي: الشهادة الأساسية للمجال بتنسيق .cer وشهادة الخادم بتنسيق .pfx. ينبغي أن تكون مواقع كلاهما في نفس المجلد حيث يتم حفظ البرنامج النصي؛ ويتم توفيرهم أيضاً في موجه الأوامر الناتج عند تنفيذ البرنامج النصي.

  1. سجل الدخول إلى دليل مسؤول بوابة ArcGIS الإلكترونية في https://sample.domain.com:7443/arcgis/portaladmin.
  2. استعرض شهادات > SSL الخاصة بالأمن وانقر فوق استيراد الشهادة الأساسية أو المتوسطة.
  3. قم بتقديم اسم مستعار للشهادة ومسار الملف على الملف domainRoot.cer الذي تم تصديره بواسطة البرنامج النصي أعلاه. حدد الخيار لا تقم بإعادة تشغيل البوابة الإلكترونية بعد الاستيراد (تقوم العملية في الخطوة 7 بإعادة تشغيل البوابة الإلكترونية، وانقر فوق استيراد.
  4. استعرض مرة أخرى شهادات SSL وانقر فوق استيراد شهادة الخادم الحالي.
  5. أدخل كلمة مرور الشهادة الشهادة واسم مستعار للشهادة يختلف عن الاسم المستعار الذي قدمته للشهادة الجذر، ثم استعرض إلى ملف .pfx على جهازك. انقر على استيراد.
  6. قم بالرجوع إلى صفحة شهادات SSL وانقر فوق تحديث.
  7. استبدل القيمة الخاصة بشهادة SSL لخادم الويب مع الاسم المستعار لشهادة .pfx التي قمت باستيرادها في الخطوة 5. انقر على تحديث. سوف يعاد تشغيل البوابة الإلكترونية، التي تستغرق بضع دقائق.
  8. سجّل الدخول إلى دليل مسؤول ArcGIS Server على https://sample.domain.com:6443/arcgis/admin.
  9. استعرض الأجهزة > <machine name> > sslcertificates وانقر فوق importRootOrIntermediate.
  10. أدخل اسمًا مستعارًا كما في الخطوة 3 واستعرض موقع ملف domainRoot.cer. انقر فوق استيراد.
  11. استعرض مرة أخرى صفحة الجهاز وانقر فوق importExistingServerCertificate.
  12. أدخل مرة أخرى كلمة مرور الشهادة والموقع الخاص بشهادة .pfx على جهازك. انقر فوق إرسال.
  13. قم بالرجوع إلى صفحة الجهاز وانقر فوق تحرير.
  14. استبدل القيمة الخاصة بشهادة SSL لخادم الويب مع الاسم المستعار لشهادة المجال الجديدة. انقر على حفظ عمليات التحرير. سوف يعاد تشغيل جهاز الخادم، الذي يستغرق بضع دقائق.

عند اكتمال دورة العمل، ستكون الشهادة الجديدة لبوابة ArcGIS Enterprise الإلكترونية وخادم الاستضافة موثوقة بواسطة جميع برامج استعراض الويب.