it-swarm.asia

كيفية منح ASP.NET حق الوصول إلى مفتاح خاص في شهادة في مخزن الشهادات؟

لدي تطبيق ASP.NET يصل إلى المفتاح الخاص في شهادة في مخزن الشهادات. في Windows Server 2003 ، تمكنت من استخدام winhttpcertcfg.exe لمنح حق الوصول إلى المفتاح الخاص لحساب NETWORK SERVICE. كيف يمكنني منح أذونات للوصول إلى مفتاح خاص في شهادة في مخزن الشهادات (الكمبيوتر المحلي\الشخصي) على Windows Server 2008 R2 في IIS 7.5 موقع ويب؟

لقد حاولت منح Full Trust حق الوصول إلى "Everyone" و "IIS AppPool\DefaultAppPool" و "IIS_IUSRS" وكل حساب أمان آخر يمكن أن أجده باستخدام الشهادات MMC (Server 2008 R2). ومع ذلك ، توضح التعليمة البرمجية أدناه أن الرمز لا يمكنه الوصول إلى المفتاح الخاص لشهادة تم استيرادها باستخدام المفتاح الخاص. رمز بدلاً من ذلك يلقي والخطأ في كل مرة يتم الوصول إلى خاصية المفتاح الخاص.

Default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Import Namespace="System.Security.Cryptography.X509Certificates" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Repeater ID="repeater1" runat="server">
            <HeaderTemplate>
                <table>
                    <tr>
                        <td>
                            Cert
                        </td>
                        <td>
                            Public Key
                        </td>
                        <td>
                            Private Key
                        </td>
                    </tr>
            </HeaderTemplate>
            <ItemTemplate>
                <tr>
                    <td>
                    <%#((X509Certificate2)Container.DataItem).GetNameInfo(X509NameType.SimpleName, false) %>
                    </td>
                    <td>
                    <%#((X509Certificate2)Container.DataItem).HasPublicKeyAccess() %>
                    </td>
                    <td>
                    <%#((X509Certificate2)Container.DataItem).HasPrivateKeyAccess() %>
                    </td>
                </tr>
            </ItemTemplate>
            <FooterTemplate>
                </table></FooterTemplate>
        </asp:Repeater>
    </div>
    </form>
</body>
</html>

Default.aspx.cs


using System;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Web.UI;
public partial class _Default : Page 
{
    public X509Certificate2Collection Certificates;
    protected void Page_Load(object sender, EventArgs e)
    {
        // Local Computer\Personal
        var store = new X509Store(StoreLocation.LocalMachine);
        // create and open store for read-only access
        store.Open(OpenFlags.ReadOnly);
        Certificates = store.Certificates;
        repeater1.DataSource = Certificates;
        repeater1.DataBind();
    }
}
public static class Extensions
{
    public static string HasPublicKeyAccess(this X509Certificate2 cert)
    {
        try
        {
            AsymmetricAlgorithm algorithm = cert.PublicKey.Key;
        }
        catch (Exception ex)
        {
            return "No";
        }
        return "Yes";
    }
    public static string HasPrivateKeyAccess(this X509Certificate2 cert)
    {
        try
        {
            string algorithm = cert.PrivateKey.KeyExchangeAlgorithm;
        }
        catch (Exception ex)
        {
            return "No";
        }
        return "Yes";
    }
}
100
thames
  1. إنشاء/شراء شهادة. تأكد من أن لديه مفتاح خاص.
  2. استيراد الشهادة إلى حساب "الكمبيوتر المحلي". أفضل استخدام الشهادات MMC. تأكد من التحقق من "السماح بتصدير المفتاح الخاص"
  3. استنادًا إلى ، IIS 7.5 تستخدم هوية تجمع التطبيقات أحد الإجراءات التالية.

    • IIS 7.5 موقع يعمل تحت ApplicationPoolIdentity. افتح MMC => إضافة شهادات (الكمبيوتر المحلي) الإضافية => الشهادات (الكمبيوتر المحلي) => شخصي => الشهادات => انقر بزر الماوس الأيمن على شهادة الاهتمام => كل المهام => إدارة المفتاح الخاص = > أضف IIS AppPool\AppPoolName ومنحه Full control. استبدل " AppPoolName " باسم تجمع التطبيقات الخاص بك (أحيانًا IIS_IUSRS)
    • IIS 7.5 موقع يعمل تحت خدمة الشبكة. باستخدام الشهادات MMC ، أضاف "NETWORK SERVICE" إلى الثقة الكاملة في الشهادة في "الكمبيوتر المحلي\الشخصي".
    • يتم تشغيل IIS 7.5 موقع ويب ضمن حساب مستخدم الكمبيوتر المحلي "MyIISUser". باستخدام الشهادات MMC ، أضف "MyIISUser" (حساب مستخدم كمبيوتر محلي جديد) إلى "الثقة الكاملة" في الشهادة في "الكمبيوتر المحلي\شخصي".

التحديث بناءً على تعليقHil Hale:

احذر ، إذا كنت تستخدم نطاقًا ، فسيتم تحديد نطاقك افتراضيًا في "من مربع الموقع". تأكد من تغيير ذلك إلى "الكمبيوتر المحلي". تغيير الموقع إلى "الكمبيوتر المحلي" لعرض هويات تجمع التطبيقات.

175
thames

ملاحظة حول منح أذونات عبر MMC و Certs و Select Cert والنقر بزر الماوس الأيمن وجميع المهام و "إدارة المفاتيح الخاصة"

إدارة المفاتيح الخاصة موجودة فقط في قائمة القائمة للأفراد ... لذا ، إذا كنت قد وضعت شهاداتك في الأشخاص الموثوق بهم ، وما إلى ذلك ، فأنت محظوظ.

وجدنا طريقة للتغلب على هذا الأمر الذي نجح بالنسبة لنا. قم بسحب وإسقاط الشهادة إلى شخصي ، قم بإجراء إدارة المفاتيح الخاصة لمنح أذونات. تذكر أن تقوم بتعيين لاستخدام الكائنات المضمنة من نوع الكائنات واستخدام الجهاز المحلي وليس المجال. لقد منحنا حقوقًا للمستخدم DefaultAppPool وتركناه عند هذا الحد.

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

41
Garrett Goebel

إذا كنت تحاول تحميل شهادة من ملف .pfx في IIS فقد يكون الحل بسيطًا مثل تمكين هذا الخيار لـ Application Pool.

انقر بزر الماوس الأيمن على تجمع التطبيقات وحدد Advanced Settings.

ثم قم بتمكين Load User Profile


 enter image description here 

11
Simon_Weaver

لقد اكتشفت كيفية القيام بذلك في Powershell التي سألها أحدهم عن:

$keyname=(((gci cert:\LocalMachine\my | ? {$_.thumbprint -like $thumbprint}).PrivateKey).CspKeyContainerInfo).UniqueKeyContainerName
$keypath = $env:ProgramData + “\Microsoft\Crypto\RSA\MachineKeys\”
$fullpath=$keypath+$keyname

$Acl = Get-Acl $fullpath
$Ar = New-Object System.Security.AccessControl.FileSystemAccessRule("IIS AppPool\$iisAppPoolName", "Read", "Allow")
$Acl.SetAccessRule($Ar)
Set-Acl $fullpath $Acl
7
Ian Robertson

بالنسبة لي ، لم يكن الأمر أكثر من إعادة استيراد الشهادة مع تحديد "السماح بتصدير المفتاح الخاص".

أعتقد أن هذا ضروري ، ولكنه يجعلني أشعر بالتوتر لأنه تطبيق جهة خارجية يصل إلى هذه الشهادة.

5
Nathan Hartley