كيفية تعيين إذن القراءة على ملف المفتاح الخاص من شهادة X. 509 من .صافي

StackOverflow https://stackoverflow.com/questions/425688

  •  06-07-2019
  •  | 
  •  

سؤال

هنا هو رمز لإضافة pfx إلى Cert المخزن.

X509Store store = new X509Store( StoreName.My, StoreLocation.LocalMachine );
store.Open( OpenFlags.ReadWrite );
X509Certificate2 cert = new X509Certificate2( "test.pfx", "password" );
store.Add( cert );
store.Close();

ومع ذلك ، لم أتمكن من العثور على طريقة تعيين إذن NetworkService الوصول إلى المفتاح الخاص.

يمكن لأي شخص أن تسلط بعض الضوء ؟ شكرا مقدما.

هل كانت مفيدة؟

المحلول

أن تفعل ذلك برمجيا ، عليك أن تفعل ثلاثة أشياء:

  1. على طريق المفتاح الخاص مجلد.

  2. الحصول على اسم ملف المفتاح الخاص داخل هذا المجلد.

  3. إضافة إذن هذا الملف.

انظر هذا المنصب بعض التعليمة البرمجية الموجودة في المثال الذي يفعل كل ثلاثة (تبدو على وجه التحديد في "AddAccessToCertificate" الأسلوب).

نصائح أخرى

وهذا الجواب في وقت متأخر ولكن أردت أن بعد ذلك لأي شخص آخر أن يأتي البحث في هنا:

ولقد وجدت مقالا بلوق MSDN الذي أعطى الحل باستخدام CryptoKeySecurity <لأ href = "http://blogs.msdn.com/b/cagatay/archive/2009/02/08/removing-acls-from-csp- مفتاح containers.aspx "> هنا ، وهنا مثال على حل في C #:

var rsa = certificate.PrivateKey as RSACryptoServiceProvider;
if (rsa != null)
{
    // Modifying the CryptoKeySecurity of a new CspParameters and then instantiating
    // a new RSACryptoServiceProvider seems to be the trick to persist the access rule.
    // cf. http://blogs.msdn.com/b/cagatay/archive/2009/02/08/removing-acls-from-csp-key-containers.aspx
    var cspParams = new CspParameters(rsa.CspKeyContainerInfo.ProviderType, rsa.CspKeyContainerInfo.ProviderName, rsa.CspKeyContainerInfo.KeyContainerName)
    {
        Flags = CspProviderFlags.UseExistingKey | CspProviderFlags.UseMachineKeyStore,
        CryptoKeySecurity = rsa.CspKeyContainerInfo.CryptoKeySecurity
    };

    cspParams.CryptoKeySecurity.AddAccessRule(new CryptoKeyAccessRule(sid, CryptoKeyRights.GenericRead, AccessControlType.Allow));

    using (var rsa2 = new RSACryptoServiceProvider(cspParams))
    {
        // Only created to persist the rule change in the CryptoKeySecurity
    }
}

وأنا باستخدام SecurityIdentifier لتحديد الحساب ولكن على NTAccount العمل فقط كذلك.

في حالة هذا يساعد أي شخص آخر، كتبت الجواب جيم الفيضانات في بوويرشيل

function Set-PrivateKeyPermissions {
param(
[Parameter(Mandatory=$true)][string]$thumbprint,
[Parameter(Mandatory=$false)][string]$account = "NT AUTHORITY\NETWORK SERVICE"
)
#Open Certificate store and locate certificate based on provided thumbprint
$store = New-Object System.Security.Cryptography.X509Certificates.X509Store("My","LocalMachine")
$store.Open("ReadWrite")
$cert = $store.Certificates | where {$_.Thumbprint -eq $thumbprint}

#Create new CSP object based on existing certificate provider and key name
$csp = New-Object System.Security.Cryptography.CspParameters($cert.PrivateKey.CspKeyContainerInfo.ProviderType, $cert.PrivateKey.CspKeyContainerInfo.ProviderName, $cert.PrivateKey.CspKeyContainerInfo.KeyContainerName)

# Set flags and key security based on existing cert
$csp.Flags = "UseExistingKey","UseMachineKeyStore"
$csp.CryptoKeySecurity = $cert.PrivateKey.CspKeyContainerInfo.CryptoKeySecurity
$csp.KeyNumber = $cert.PrivateKey.CspKeyContainerInfo.KeyNumber

# Create new access rule - could use parameters for permissions, but I only needed GenericRead
$access = New-Object System.Security.AccessControl.CryptoKeyAccessRule($account,"GenericRead","Allow")
# Add access rule to CSP object
$csp.CryptoKeySecurity.AddAccessRule($access)

#Create new CryptoServiceProvider object which updates Key with CSP information created/modified above
$rsa2 = New-Object System.Security.Cryptography.RSACryptoServiceProvider($csp)

#Close certificate store
$store.Close()

}

ملحوظة أن المعلمة حساب يمكن أن يكون في شكل "DOMAIN \ USER" وكذلك (لم تبن فقط في أسماء) - اختبرت ذلك في بيئتي وتحويلها تلقائيا إلى SID المناسب

يمكنك استخدام WinHttpCertCfg.exe أداة الذي يأتي كجزء من نظام التشغيل Windows Server 2003 Resource Kit Tools.

على سبيل المثال:

winhttpcertcfg -g -c LOCAL_MACHINE\My -s test -a NetworkService


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

على سبيل المثال:

FindPrivateKey My LocalMachine -n "CN=test"

وهذا هو الحل وجدت ل Windows Server 2008 إذا كان أي شخص مهتم: HTTP : //technet.microsoft.com/en-us/library/ee662329.aspx

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top