x509certificate.createfromcertfile - كلمة مرور الشبكة المحددة غير صحيحة

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

سؤال

لدي تطبيق .NET الذي أريد استخدامه كعميل لاستدعاء خدمة Web SOAP SSL. لقد تم تزويدها بشهادة عميل صالحة تسمى foo.pfx. وبعد هناك كلمة مرور في الشهادة نفسها.

أنا موجود الشهادة في الموقع التالي: C:\certs\foo.pfx

للاتصال بخدمة الويب، أحتاج إلى إرفاق شهادة العميل. إليك الرمز:

public X509Certificate GetCertificateFromDisk(){
    try{             

       string certPath = ConfigurationManager.AppSettings["MyCertPath"].ToString(); 
       //this evaluates to "c:\\certs\\foo.pfx". So far so good.

       X509Certificate myCert = X509Certificate.CreateFromCertFile(certPath);
       // exception is raised here! "The specified network password is not correct" 

       return cert;

     }
    catch (Exception ex){    
        throw;
     }
}

يبدو أن الاستثناء هو حول تطبيق .NET في محاولة لقراءة القرص. طريقة CreateFromCertFile هي طريقة ثابتة يجب أن تخلق مثيل جديد من X509Certificate. لا يتم تجاوز الطريقة، ولديها حجة واحدة فقط: المسار.

عندما أفحص الاستثناء، أجد هذا:

_COMPlusExceptionCode = -532459699
Source=mscorlib

سؤال: هل يعرف أي شخص ما سبب الاستثناء "كلمة مرور الشبكة المحددة غير صحيحة"؟

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

المحلول

اتضح أنني كنت أحاول إنشاء شهادة من .pfx بدلا من ملف .cer.

الدرس المستفاد...

  • ملفات. سرية هي شهادة X.509 في شكل ثنائي. هم انهم دير ترميز.
  • ملفات .pfx ملفات الحاويات. وبعد أيضا دير المشفرة. أنها لا تحتوي ليس فقط على الشهادات، ولكن أيضا مفاتيح خاصة في شكل مشفرة.

نصائح أخرى

قد تحتاج إلى المستخدم X509Certificate2() مع معلمة X509KeyStorageFlags.MachineKeySet في حين أن. هذا ثابت مشكلة مماثلة كان لدينا. الائتمان إلى الموقع الأصلي الذي اقترح هذا: http://vdachev.net/2012/03/07/c-sharp-error-creating-x509certificate2-from-a-pfx-px-p2-file-in-production/

نقلا عن:

سبب

يبدو أن سبب المشكلة لديه الكثير للقيام به مع رسائل الخطأ. لسبب ما يحاول المنشئ الوصول إلى المتجر الرئيسي الخاص على الرغم من أن المفتاح الخاص في مخزن في الملف الذي يتم فتحه. بشكل افتراضي يتم استخدام متجر مفتاح المستخدم ولكن ASP.NET (وربما خدمات Windows غير التفاعلية بشكل عام) لا يسمح بفتحها. فرص هي متجر مفتاح المستخدم للحساب المحدد غير موجود حتى.

المحلول

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

حل آخر هو تمرير معلمة إضافية إلى المنشئ - العلم الذي يشير إلى أن المفاتيح الخاصة (من المفترض أن تكون) مخزنة في الكمبيوتر المحلي - X509KeystorageFlags.machinekyset، مثل هذا: var certificate = new X509Certificate2(fileName, password, X509KeyStorageFlags.MachineKeySet);

بالنسبة إلى PFX بدون كلمة مرور، يمكن تحديد كلمة المرور كما string.Empty.

أنظر أيضا https://stackoverflow.com/a/8291956/130352.

اعتمادا على وضعك، ربما تحتاج إلى تثبيت الشهادة على الخادم أولا للحصول على مستوى الثقة لأعلى قبل تصدير .cer ملف.

اضطررت إلى القيام بذلك لمشروع مماثل وهنا كانت ملاحظاتي حول كيفية إنجازها.

استبدال Foo.cer مع تصدير الشهادة المثبتة على الخادم. (تثبيت سيرت من pfx ملف ثم تصديرها إلى cer ملف.)

  • أمر IIS6 للسماح بإمكانية الوصول إلى مجموعة IIS_WPG إلى مفتاح Cert. بحاجة إلى تثبيت winhttpcertcfg (يمكنك اتباع الرابط أدناه للاستيلاء على نسختك الخاصة).

    C: Program Files Program Files Tools> أدوات مورد Windows> WinhttpCertcfg -i (المسار إلى ملف PFX، على سبيل المثال. E: Certs foo.pfx) -c local_machine my -a iis_wpg -p (كلمة المرور لملف PFX)

  • يبصق المعلومات الأساسية والمنح امتياز

    منح مفتاح الوصول الخاص للحساب:

    (SERVERNAME)\IIS_WPG
    

تحميل WinHttpCertCfg.msi هنا التي تقوم بتثبيت EXE.

يمكن العثور على مزيد من المعلومات حول كيفية استخدام Cert Config هنا.

ثم يعود فقط إلى كيفية قيامك بالدفع الخاص بك.

//Cert Challenge URL 
Uri requestURI = new Uri("https://someurl");

//Create the Request Object
HttpWebRequest pageRequest = (HttpWebRequest)WebRequest.Create(requestURI);

//After installing the cert on the server export a client cert to the working directory as Foo.cer
string certFile = MapPath("Foo.cer");
X509Certificate cert = X509Certificate.CreateFromCertFile(certFile);


//Set the Request Object parameters
pageRequest.ContentType = "application/x-www-form-urlencoded";
pageRequest.Method = "POST";
pageRequest.AllowWriteStreamBuffering = false;
pageRequest.AllowAutoRedirect = false;
pageRequest.ClientCertificates.Add(cert);

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

يتم إرجاع رسالة الخطأ "كلمة مرور الشبكة المحددة غير صحيح" عند إرجاع رسالة الخطأ عندما تكون الشهادة التي تحاول استيرادها في أحد متاجر نظام التشغيل موجودة بالفعل في هذا المتجر.

في حالتي كنت أحاول تشغيل في وضع التطبيق الخاص وحصلت على نفس الخطأ.

كلمة المرور الشبكة المحددة غير صحيحة

منشئ privateauthenticator (في Xero.Api.Example.Applications.Privateهل تحاول استيراد الشهادة على افتراض عدم تحديد كلمة مرور أثناء إنشاء الشهادة.

_certificate = new X509Certificate2();
_certificate.Import(certificatePath);

ثم غيرت الاستيراد لاستخدام طريقة الزائدة التي تستخدم كلمة المرور،

_certificate.Import(certificatePath, "mypasswordusedtocreatethecertificate",  X509KeyStorageFlags.MachineKeySet);

قد تحتاج إلى x509keystorageflags.machinekyset.

أنا أستخدم الشهادة من وظيفة الويب.

في حالتي المتغيرة الهوية إلى NetworkService في تجمع التطبيقات حل هذه المشكلة.

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