2011-07-26 18 views
13

मैं इकाई .NET अनुप्रयोग का परीक्षण कर रहा हूं; कुछ यूनिट परीक्षणों में प्रोग्रामिंग रूप से X509Certificate2 ऑब्जेक्ट्स उत्पन्न होते हैं।कम से कम डमी X509Certificate2 कैसे बनाएं?

मुझे वास्तविक हस्ताक्षर/निजी कुंजी/सत्यापन सामग्री की परवाह नहीं है, मैं बस एक ऐसा ऑब्जेक्ट रखना चाहता हूं जो उसके क्षेत्रों की जांच के दौरान अपवाद नहीं फेंकता। मैंने पैरामीटर रहित कन्स्ट्रक्टर का उपयोग करने की कोशिश की, लेकिन फिर एक्सेस किए जाने पर खेतों का एक पूरा समूह अपवाद फेंक देता है। के रूप में डिबगर में देखी गई:

subjectName = '। (नई System.Collections.Generic.Mscorlib_CollectionDebugView (result.Certificates)) आइटम [0] .SubjectName' प्रकार 'System.Security.Cryptography.CryptographicException' का एक अपवाद फेंक दिया

मैं भी इसमें कुछ यादृच्छिक संख्या के साथ एक बाइट सरणी गुजर करने की कोशिश की, लेकिन वह भी निर्माण नहीं किया

तो, सवाल (सरणी एक विशिष्ट आकार होने की जरूरत है?): सरलतम है क्या (कोड की सबसे छोटी लाइनें) प्रोग्रामेटिक रूप से X509Certificate2 ऑब्जेक्ट उत्पन्न करने का तरीका जो फ़ील्ड/संपत्ति एक्सेस पर अपवाद नहीं फेंक देगा?

+0

मोल्स क्या है? क्या आप अपना अंतिम समाधान उत्तर के रूप में प्रदान कर सकते हैं? मैं अब भी वही काम करने की कोशिश कर रहा हूं। – Langdon

+0

मुझे लगता है कि वह माइक्रोसॉफ्ट रिसर्च से टेस्ट स्टब्स और डिटोर बनाने के लिए एक ढांचा है। आप यहां देख सकते हैं: http://research.microsoft.com/en-us/projects/moles/। – Sascha

उत्तर

8

मैं निम्नलिखित सुझाव है:

  1. एक प्रमाण पत्र का उपयोग कर makecert उत्पन्न करें।
  2. अपनी प्रोजेक्ट में प्रमाणपत्र जोड़ें और एंबेडेड संसाधन में अपनी बिल्ड एक्शन बदलें।
  3. अपने यूनिट परीक्षण सेटअप में संसाधन से प्रमाण पत्र लोड करें, नीचे देखें।

कोड:

byte[] embeddedCert; 
Assembly thisAssembly = Assembly.GetAssembly(typeof(MyType)); 
using (Stream certStream = thisAssembly.GetManifestResourceStream("YourProjectName.localhost.pfx")) 
{ 
    embeddedCert = new byte[certStream.Length]; 
    certStream.Read(embeddedCert, 0, (int)certStream.Length); 
} 

_signingCert = new X509Certificate2(embeddedCert, "password"); 

इस बिंदु पर आप के रूप में अब तक प्रमाण पत्र के साथ बातचीत के रूप में जाने के लिए अच्छा होना चाहिए। यदि आपके यूनिट परीक्षणों की अलग-अलग ज़रूरतें हैं तो आप अलग-अलग प्रकार बना सकते हैं।

+1

मुझे लगता है कि मैं वास्तव में केवल उस बाइट सरणी को * एक बार * पढ़ सकता हूं, इसे एक फ़ाइल में वर्णों के रूप में प्रिंट कर सकता हूं, और उसके बाद स्रोत कोड में हार्ड-कोडित बाइट [] के रूप में कॉपी-पेस्ट कर सकता हूं? यह बहुत बुरा नहीं होगा ... – Cephron

+0

हाँ, यह भी काम करेगा। –

+0

इसे काम करने के लिए मोल्स का उपयोग करके समाप्त हुआ, लेकिन उपयोगी उत्तर के लिए धन्यवाद! – Cephron

1

लैंगडन के अनुरोध पर, समाधान मैं का इस्तेमाल किया, अपने आप को:

 //Moling test Certificate 
     var cert = new MX509Certificate2(); 
     var subject = new MX500DistinguishedName(); 
     // hookup 
     cert.SubjectNameGet =() => subject; 
     cert.ThumbprintGet =() => "foo"; 
     subject.NameGet =() => "foobar"; 

यह काम किया, क्योंकि केवल खेतों मैं प्रमाणपत्र में पहुँचा थे यह subjectName और Thumbprint, और subjectName मैं था पहुँचा का ही क्षेत्र है नाम। मैंने डमी तारों को वापस करने के लिए इन क्षेत्रों के लिए गेटटर विधियों को "मोल्ड" किया। यदि आप अन्य क्षेत्रों तक पहुंचने के लिए थे, तो आपको शायद उन्हें तिल करने की आवश्यकता होगी।

और इसलिए, "मोल्स" क्या है?

"मोल्स टेस्ट स्टब्स के लिए हल्के ढांचे और प्रतिनिधियों पर आधारित .NET में detours है। मोल्स का उपयोग किसी भी .NET विधि को अलग करने के लिए किया जा सकता है, जिसमें सीलबंद प्रकारों में गैर-आभासी/स्थैतिक विधियां शामिल हैं। मोल्स स्वतंत्र रूप से उपलब्ध है विजुअल स्टूडियो गैलरी पर या Pex के साथ बंडल। "

http://research.microsoft.com/en-us/projects/moles/

+1

मेरे ऊपर जेसन का जवाब स्वीकार किया क्योंकि वह अधिक सामान्य है। – Cephron

2

यह बहुत hacky लग सकता है, और यह कैसे व्यावहारिक आप होना चाहते हैं पर निर्भर करता है ... एक दृष्टिकोण मैं सिर्फ मशीन से एक यादृच्छिक प्रमाण पत्र हड़पने के लिए उपयोग किया गया था।

यह अच्छा था जब: - मुझे पता है कि इन परीक्षणों को चलाने वाली प्रत्येक मशीन का एक वैध प्रमाणपत्र है। - मैं जीआईटी का उपयोग कर रहा था और प्रमाण के लिए एक बाइनरी फ़ाइल में जांच नहीं करना चाहता था - मुझे प्रमाण सामग्री पर कोई परवाह नहीं है - मैं ऐसे कोड का उपयोग कर रहा हूं जो नकली मित्रवत नहीं है और स्पष्ट रूप से एक गैर-नकली X509 प्रमाण पत्र की आवश्यकता है वस्तु।

निश्चित रूप से बुलेट प्रूफ नहीं, लेकिन मुझे अनवरोधित किया और मेरे परीक्षण परिदृश्य को अनवरोधित कर दिया।

static X509Certificate2 GetRandomCertificate() 
    { 
     X509Store st = new X509Store(StoreName.My, StoreLocation.LocalMachine); 
     st.Open(OpenFlags.ReadOnly); 
     try 
     { 
      var certCollection = st.Certificates; 

      if (certCollection.Count == 0) 
      { 
       return null; 
      } 
      return certCollection[0]; 
     } 
     finally 
     { 
      st.Close(); 
     } 
    } 
+1

यह परीक्षण के लिए शानदार है। क्या हमें रास्ते से पासवर्ड से सावधान रहना है? – Timo

0

ऐसा करने का एक और आसान तरीका है।

  1. मेकर्ट का उपयोग करके प्रमाणपत्र बनाएं या किसी मौजूदा प्रमाणपत्र को निर्यात करें।
  2. प्रोजेक्ट में प्रमाणपत्र जोड़ें (App_Data फ़ोल्डर)।
  3. प्रमाणपत्र प्राप्त करने के लिए नीचे दिए गए चरणों का पालन करें।

कोड:

 string certificate = "cert.pfx"; 
     string certPath = string.Format("{0}/App_Data/{1}", HttpRuntime.AppDomainAppPath, certificate); 
     byte[] bytes = Util.FileToArray(certPath); 
     X509Certificate2 publicKey = new X509Certificate2(bytes, "somepassoword"); 
संबंधित मुद्दे