मैं एसएसएल को एक .NET एप्लिकेशन में कैसे जोड़ूं जो कि प्रेजिस्प्लिस्टर का उपयोग करता है - यह * आईआईएस पर नहीं चल रहा है

Most recent edits in bold I am using the .net HttpListener class, but I'm won't be running on IIS and am not using ASP.net. This web site describes what code to actual use to implement SSL with asp.net and this site describes how to set up the certificates (although I'm not sure if it works only for IIS or not).

कक्षा दस्तावेज विभिन्न प्रकार के प्रमाणीकरण (मूल, पाचन, विंडोज, इत्यादि) का वर्णन करता है --- उनमें से कोई भी एसएसएल का संदर्भ नहीं देता है। यह कहता है कि यदि HTTPS का उपयोग किया जाता है, तो आपको एक सेट करने की आवश्यकता होगी सर्वर प्रमाणपत्र । क्या यह एक लाइन प्रॉपर्टी सेटिंग और HttpListener बाकी के आंकड़े होने जा रहा है?

संक्षेप में, मुझे यह जानने की जरूरत है कि प्रमाणपत्र कैसे सेट अप करें और एसएसएल को लागू करने के लिए कोड को कैसे संशोधित करें।

हालांकि यह तब नहीं होता जब मैं HTTPS तक पहुंचने का प्रयास कर रहा हूं, मैंने अपने सिस्टम इवेंट लॉग में एक त्रुटि देखी - स्रोत "शैननेल" है और संदेश की सामग्री है:

प्रयास करते समय एक घातक त्रुटि आई   एसएसएल सर्वर प्रमाण पत्र तक पहुंचने के लिए   निजी चाबी। त्रुटि कोड वापस आ गया   क्रिप्टोग्राफिक मॉड्यूल से है   0x80090016।

Edit:
Steps taken so far

  • सी # में एक काम कर रहे HTTPListener बनाया जो HTTP कनेक्शन के लिए काम करता है (उदाहरण के लिए " http: // localhost: 8089 / foldername / "
  • makecert.exe
  • का उपयोग करके प्रमाणपत्र बनाया गया
  • प्रमाण पत्र को certmgr.exe
  • का उपयोग करके भरोसा करने के लिए जोड़ा गया
  • परीक्षण पोर्ट (जैसे 80 9 0) पर एसएसएल कनेक्शन सुनने के लिए प्रयुक्त Httpcfg.exe
  • HTTPListener में listener.Prefixes के माध्यम से पोर्ट 8080 जोड़ा गया। जोड़ें ( https: // localhost: 8090 / foldername / </एक> ");
  • एक HTTP क्लाइंट कनेक्शन का परीक्षण किया, उदाहरण के लिए (ब्राउज़र में http: // localhost: 8089 / foldername / ") और सही वापसी प्राप्त करें
  • एक HTTPS क्लाइंट कनेक्शन का परीक्षण किया, उदा। (ब्राउज़र में http: // localhost: 8090 / foldername / ") और" डेटा स्थानांतरण बाधित "प्राप्त करें ( फ़ायरफ़ॉक्स में)
  • विजुअल स्टूडियो में डिबगिंग से पता चलता है कि जब एचटीटीपीएस कनेक्शन शुरू होता है तो अनुरोध प्राप्तकर्ता श्रोता कॉलबैक कभी भी हिट नहीं होता है - मुझे ऐसा कोई स्थान नहीं दिखता है जिसे मैं पहले किसी और चीज़ को पकड़ने के लिए ब्रेकपॉइंट सेट कर सकता हूं।
  • नेटस्टैट से पता चलता है कि एचटीटीपीएस और HTTP दोनों के लिए सुन रहे बंदरगाह खुले हैं। कनेक्शन के प्रयास के बाद HTTPS पोर्ट TIME_WAIT पर जाता है।
  • फ़िडलर और HTTPAnalyzer किसी भी ट्रैफ़िक को नहीं पकड़ता है, मुझे लगता है कि यह उन HTTP विश्लेषण उपकरणों में दिखाने के लिए प्रक्रिया में काफी दूर नहीं है

प्रश्न

  • समस्या क्या हो सकती है?
  • क्या नेट कोड का एक टुकड़ा है जो मुझे याद आ रहा है (जिसका मतलब है कि मुझे सी # में और अधिक करना है जो श्रोता को उपसर्ग जोड़ना है जो एचटीटीपीएस को इंगित करता है, जो मैंने किया है)
  • क्या कहीं कॉन्फ़िगरेशन चरण याद आया है?
  • समस्या का विश्लेषण करने के लिए मैं और क्या कर सकता हूं?
  • क्या सिस्टम इवेंट में त्रुटि संदेश समस्या का संकेत है? यदि ऐसा है तो यह कैसे तय किया जाएगा?
0
ro fr bn

5 उत्तर

मैंने अभी तक इसे पूरी तरह कार्यान्वित नहीं किया है, लेकिन यह वेबसाइट एक अच्छी walkthrough

0
जोड़ा

The class documentation

यह नोट है:

यदि आप एक HttpListener का उपयोग कर बनाते हैं   https, आपको एक सर्वर का चयन करना होगा   उस श्रोता के लिए प्रमाण पत्र।   अन्यथा, एक HttpWebRequest क्वेरी   यह HttpListener एक के साथ असफल हो जाएगा   कनेक्शन का अप्रत्याशित बंद।

और इस:

आप सर्वर प्रमाण पत्र कॉन्फ़िगर कर सकते हैं   और उपयोग करके अन्य श्रोता विकल्प   HttpCfg.exe। देख    http: // msdn .microsoft.com / पुस्तकालय / default.asp? url = / पुस्तकालय / en-us / http / http / httpcfg_exe.asp   अधिक जानकारी के लिए। निष्पादन योग्य है   विंडोज सर्वर 2003, या के साथ भेज दिया   स्रोत कोड से बनाया जा सकता है   प्लेटफार्म एसडीके में उपलब्ध है।

क्या पहला नोट दूसरे द्वारा समझाया गया है? जैसा कि प्रश्न में उल्लिखित है, मैंने प्रमाण पत्र को एक विशिष्ट बंदरगाह में बांधने के लिए httpcfg.exe का उपयोग किया था। अगर वे इसके अलावा कुछ और चाहते हैं, तो नोट संदिग्ध है।

0
जोड़ा

आपको सिर्फ एक आईपी: पोर्ट को प्रमाण पत्र बांधना होगा और फिर अपने श्रोता को https: // उपसर्ग के साथ खोलना होगा। 0.0.0.0 सभी आईपी पर लागू होता है। एपिड कोई यादृच्छिक GUID है, और certhash प्रमाणपत्र का हैश है (कभी-कभी थंबप्रिंट भी कहा जाता है)।

व्यवस्थापक विशेषाधिकारों का उपयोग कर cmd.exe के साथ निम्न चलाएं।

netsh http add sslcert ipport=0.0.0.0:1234 certhash=613bb67c4acaab06def391680505bae2ced4053b  appid={86476d42-f4f3-48f5-9367-ff60f2ed2cdc}

यदि आप इसका परीक्षण करने के लिए एक स्व-हस्ताक्षरित प्रमाणपत्र बनाना चाहते हैं,

  1. Open IIS
  2. Click on your computer name
  3. Click Server Certificates icon
  4. Click generate Self-Signed certificate
  5. Double click and go to details
  6. You will see the thumbprint there, just remove the spaces.

    HttpListener listener = new HttpListener();
    listener.Prefixes.Add("https://+:1234/");
    listener.Start();
    Console.WriteLine("Listening...");
    HttpListenerContext context = listener.GetContext();
    
    using (Stream stream = context.Response.OutputStream)
    using (StreamWriter writer = new StreamWriter(stream))
        writer.Write("hello, https world");
    
    Console.ReadLine();
    

इस प्रोग्राम को चलाने के बाद मैंने मुद्रित पाठ देखने के लिए बस https: // localhost: 1234 पर नेविगेट किया। चूंकि सर्टिफिकेट सीएन यूआरएल से मेल नहीं खाता है और यह विश्वसनीय सर्टिफिकेट स्टोर में नहीं है, इसलिए आपको सर्टिफिकेट चेतावनी मिल जाएगी। पाठ एन्क्रिप्टेड है हालांकि आप वायर शार्क जैसे टूल के साथ सत्यापित कर सकते हैं।

यदि आप स्वयं हस्ताक्षरित x509 प्रमाणपत्र खोलने पर अधिक नियंत्रण चाहते हैं तो openssl एक शानदार टूल है और विंडोज़ के लिए एक पोर्ट है। मेकर्ट टूल की तुलना में मुझे इसके साथ बहुत अधिक सफलता मिली है।


यह भी बहुत महत्वपूर्ण है कि यदि आप एक एसएसएल चेतावनी वाले कोड से https सेवा के साथ संचार कर रहे हैं, तो आपको सेवा उद्देश्यों के लिए प्रमाणपत्र बिंदु सत्यापनकर्ता को सेटअप उद्देश्यों के लिए बाईपास करना होगा।

ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, errors) => true;
0
जोड़ा

मुझे एक समान समस्या है, और ऐसा लगता है कि प्रमाण पत्र के साथ कोई समस्या हो सकती है।

यहां वह रास्ता है जो मेरे लिए काम करता है:

makecert.exe -r -a sha1 -n CN=localhost -sky exchange -pe -b 01/01/2000 -e 01/01/2050 -ss my -sr localmachine

फिर प्रमाण पत्र देखें thumbprint , इसे क्लिपबोर्ड पर कॉपी करें और रिक्त स्थान हटाएं। अगली कमांड में यह पैरामीटर होगा:

HttpCfg.exe set ssl -i 0.0.0.0:801 -h 35c65fd4853f49552471d2226e03dd10b7a11755

फिर https: // localhost: 801 / पर एक सेवा होस्ट चलाएं और यह पूरी तरह से काम करता है।

मैं स्वयं को जेनरेट किए गए प्रमाणपत्र पर चलाने के लिए https नहीं कर सकता हूं। यहां एक कोड उत्पन्न करने के लिए चलाया गया कोड (स्पष्टता के लिए त्रुटि प्रबंधन को हटाया गया है):

LPCTSTR pszX500 = subject;
DWORD cbEncoded = 0;
CertStrToName(X509_ASN_ENCODING, pszX500, CERT_X500_NAME_STR, NULL, pbEncoded, &cbEncoded, NULL);
pbEncoded = (BYTE *)malloc(cbEncoded);
CertStrToName(X509_ASN_ENCODING, pszX500, CERT_X500_NAME_STR, NULL, pbEncoded, &cbEncoded, NULL);

// Prepare certificate Subject for self-signed certificate
CERT_NAME_BLOB SubjectIssuerBlob;
memset(&SubjectIssuerBlob, 0, sizeof(SubjectIssuerBlob));
SubjectIssuerBlob.cbData = cbEncoded;
SubjectIssuerBlob.pbData = pbEncoded;

// Prepare key provider structure for self-signed certificate
CRYPT_KEY_PROV_INFO KeyProvInfo;
memset(&KeyProvInfo, 0, sizeof(KeyProvInfo));
KeyProvInfo.pwszContainerName = _T("my-container");
KeyProvInfo.pwszProvName = NULL;
KeyProvInfo.dwProvType = PROV_RSA_FULL;
KeyProvInfo.dwFlags = CRYPT_MACHINE_KEYSET;
KeyProvInfo.cProvParam = 0;
KeyProvInfo.rgProvParam = NULL;
KeyProvInfo.dwKeySpec = AT_SIGNATURE;

// Prepare algorithm structure for self-signed certificate
CRYPT_ALGORITHM_IDENTIFIER SignatureAlgorithm;
memset(&SignatureAlgorithm, 0, sizeof(SignatureAlgorithm));
SignatureAlgorithm.pszObjId = szOID_RSA_SHA1RSA;

// Prepare Expiration date for self-signed certificate
SYSTEMTIME EndTime;
GetSystemTime(&EndTime);
EndTime.wYear += 5;

// Create self-signed certificate
pCertContext = CertCreateSelfSignCertificate(NULL, &SubjectIssuerBlob, 0, &KeyProvInfo, &SignatureAlgorithm, 0, &EndTime, 0);
hStore = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, 0, CERT_SYSTEM_STORE_LOCAL_MACHINE, L"MY");
CertAddCertificateContextToStore(hStore, pCertContext, CERT_STORE_ADD_REPLACE_EXISTING, 0);

सर्टिफिकेट ठीक दिखाता है और इसमें एक कामकाजी निजी कुंजी है, लेकिन https समय-समय पर होगा जैसे थंबप्रिंट कभी पंजीकृत नहीं हुआ था। अगर कोई जानता है कि क्यों - कृपया टिप्पणी करें

EDIT1: After some playing around, I have found the initialization for CertCreateSelfSignCertificate which generates proper certificate:

CRYPT_KEY_PROV_INFO KeyProvInfo;
memset(&KeyProvInfo, 0, sizeof(KeyProvInfo));
KeyProvInfo.pwszContainerName = _T("my-container");
KeyProvInfo.pwszProvName = _T("Microsoft RSA SChannel Cryptographic Provider");
KeyProvInfo.dwProvType = PROV_RSA_SCHANNEL;
KeyProvInfo.dwFlags = CRYPT_MACHINE_KEYSET;
KeyProvInfo.cProvParam = 0;
KeyProvInfo.rgProvParam = NULL;
KeyProvInfo.dwKeySpec = AT_KEYEXCHANGE;
0
जोड़ा

httpcfg.exe (XP) या netsh.exe (Vista +) का उपयोग किये बिना आईएस / पोर्ट संयोजन में एसएसएल प्रमाण पत्र को बाध्य करने का एक वैकल्पिक तरीका यहां दिया गया है।

http://dotnetcodebox.blogspot.com .au / 2012/01 / कैसे करने वाली काम के साथ-ssl-certificate.html

इसका अर्थ यह है कि आप एक C ++ HttpSetService कॉन्फ़िगरेशन एपीआई विंडोज़ में कमांड लाइन के बजाए इसे प्रोग्रामेटिक रूप से करने के लिए बनाया गया है, इसलिए ओएस पर निर्भरता को हटाकर और httpcfg इंस्टॉल किया गया है।

0
जोड़ा
मैंने इस कोड को Nuget पैकेज के रूप में प्रकाशित किया है। इसका इस्तेमाल करने के लिए स्वतंत्र महसूस करें।
जोड़ा लेखक Serghei Gorodetki, स्रोत