আমি কিভাবে সার্ফেলস্টেনার ব্যবহার করে এমন একটি .net অ্যাপ্লিকেশনে SSL যোগ করব - এটি * IIS- এ চলবে না

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).

ক্লাস ডকুমেন্টেশন বিভিন্ন প্রকারের প্রমাণীকরণ (মৌলিক, ডাইজেস্ট, উইন্ডোজ, ইত্যাদি) বর্ণনা করে - তাদের মধ্যে কেউই SSL- কে উল্লেখ করে না এটি বলে যে যদি HTTPS ব্যবহার করা হয়, তাহলে আপনাকে সেট আপ করতে হবে সার্ভার সার্টিফিকেট এই একটি এক লাইন সম্পত্তি সেটিং হতে যাচ্ছে এবং <�কোড> HttpListener </কোড> বিশদ আউট দেখায়?

সংক্ষেপে, আমি জানতে চাই সার্টিফিকেট কীভাবে সেট করা যায় এবং SSL বাস্তবায়নের জন্য কোডটি কীভাবে পরিবর্তন করা যায়।

আমি HTTPS অ্যাক্সেস করার চেষ্টা করছি যখন এটি ঘটতে না হলেও, আমি আমার সিস্টেম ইভেন্ট লগ একটি ত্রুটি লক্ষ্য করেছি - উৎস "Schannel" এবং বার্তা কন্টেন্ট হয়:

চেষ্টা করার সময় একটি মারাত্মক ত্রুটি ঘটেছে   SSL সার্ভার শংসাপত্র অ্যাক্সেস করতে   ব্যক্তিগত কী ত্রুটি কোড ফিরে   ক্রিপ্টোগ্রাফিক মডিউল থেকে   0x80090016।

Edit:
Steps taken so far

  • HTTP সংযোগের জন্য কাজ করে এমন একটি HTTPListener তৈরি করা হয়েছে (যেমন " http: // localhost: 8089 / ফোল্ডার নাম / </একটি> "করুন
  • makecert.exe ব্যবহার করে একটি শংসাপত্র তৈরি করেছে
  • certmgr.exe ব্যবহার করে বিশ্বস্ত হতে শংসাপত্র যুক্ত করেছে
  • ব্যবহৃত এইচটিপিসিএফজি.exe একটি পরীক্ষা পোর্টে SSL সংযোগগুলির জন্য (যেমন 8090) শোনার জন্য
  • লিঙ্কারের মাধ্যমে HTTPListener- এ পোর্ট 8080 যোগ করেছে। পিফিক্স.অড ( https: // localhost: 8090 / ফোল্ডার নাম </একটি> "); করুন
  • একটি HTTP ক্লায়েন্ট সংযোগ পরীক্ষা করা হয়েছে, যেমন (ব্রাউজারে http: // localhost: 8089 / ফোল্ডার নাম ) এবং সঠিক রিটার্ন পান
  • একটি HTTPS ক্লায়েন্ট সংযোগ পরীক্ষা করা হয়েছে, যেমন (একটি ব্রাউজারে http: // localhost: 8090 / ফোল্ডারে ) এবং "ডেটা ট্রান্সফার বাধাপ্রাপ্ত" ( ফায়ারফক্সে)
  • ভিজ্যুয়াল স্টুডিওতে ডিবাগিং দেখায় যে, অনুরোধ গ্রহণকারী শ্রোতা কলব্যাকটি কখনই আঘাত পায় না যখন HTTPS সংযোগ শুরু হয় - আমি কোনও স্থানে দেখতে পাই না যে আমি আগে অন্য কোনও কিছু ধরার জন্য ব্রেকপয়েন্ট সেট করতে পারি।
  • নেটস্ট্যাট দেখায় যে শোনা পোর্টটি উভয় HTTPS এবং HTTP এর জন্য উন্মুক্ত। একটি সংযোগ চেষ্টা করার পরে HTTPS পোর্ট TIME_WAIT- এ যায়।
  • ফেক্ডার এবং HTTPAnalyzer কোনও ট্র্যাফিক ধরেন না, আমি অনুমান করি যে এটি HTTP বিশ্লেষণের সরঞ্জামগুলি দেখাতে প্রসেসে যথেষ্ট পরিমাণে পাওয়া যায় না </লি>

এ প্রশ্নাবলী

  • সমস্যা কি হতে পারে? করুন
  • আমি কি নোট কোডের একটি অংশ হারিয়েছি (অর্থাৎ আমি কেবলমাত্র একটি উপসর্গ যোগ করার জন্য অন্য যেটি করতে চেয়েছি সেটি হল, HTTPS নির্দেশ করে যা আমি করেছি)
  • কোথাও কোথাও কোন কনফিগারেশনের পদক্ষেপ নেওয়া হয়েছে? করুন
  • সমস্যাটির বিশ্লেষণ করার জন্য আমি আর কি করতে পারি?
  • সিস্টেম ইভেন্টের ত্রুটি বার্তা সমস্যা একটি চিহ্ন লগ ইন করুন? যদি তাই হয় তাহলে কিভাবে তা স্থির করা হবে?
0
ro fr hi

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 সঙ্গে চালানো, বা   উৎস কোড থেকে তৈরি করা যাবে   প্ল্যাটফর্ম SDK- এ উপলব্ধ।

প্রথম নোট দ্বিতীয় দ্বারা ব্যাখ্যা করা হয়? প্রশ্ন হিসাবে উল্লিখিত, আমি একটি নির্দিষ্ট পোর্ট থেকে সার্টিফিকেট বাঁধার জন্য httpcfg.exe ব্যবহার। যদি তারা এই ছাড়া অন্য কিছু মনস্থ করা, নোট অস্পষ্ট হয়।

0
যোগ

আপনি কেবল একটি আইপি পোর্ট থেকে একটি সার্টিফিকেট বাঁধাই আছে এবং তারপর একটি https: // প্রিফিক্স সঙ্গে আপনার শ্রোতা খুলুন। 0.0.0.0 সমস্ত আইপি এর প্রযোজ্য। appid কোন র্যান্ডম GUID, এবং certhash শংসাপত্রের হ্যাশ হয় (কখনও কখনও একটি thumprint বলা)।

Cmd.exe এর সাহায্যে administrator privileges ব্যবহার করুন।

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 শংসাপত্র তৈরির উপর আরো নিয়ন্ত্রণ চান opensl একটি মহান হাতিয়ার এবং জানালা জন্য একটি পোর্ট আছে। আমি makecert হাতিয়ার তুলনায় এটি সঙ্গে আরো অনেক সাফল্য আছে করেছি।


এটি অত্যন্ত গুরুত্বপূর্ণ যে যদি আপনি একটি এসএসএল সতর্কীকরণের কোড থেকে একটি 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

তারপর শংসাপত্র দেখুন থাম্বপ্রিন্ট , এটি ক্লিপবোর্ডে অনুলিপি করুন এবং স্থানগুলি সরান। এটি পরবর্তী কমান্ডে- h পরে একটি প্যারামিটার হবে:

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 প্রজন্মের সময়সীমার মত হবে যেহেতু থাম্বপ্রিন্ট নিবন্ধিত হয়নি। যদি কেউ জানেন কেন - plz মন্তব্য

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 (এক্সপি) বা netsh.exe (ভিস্তা +) ব্যবহার না করেই আইপি / পিআরআরসি সমন্বয়ের জন্য এসএসএল সার্টিফাইয়েটকে বাঁধার একটি বিকল্প উপায়।

http://dotnetcodebox.blogspot.com .au / 2012/01 / কিভাবে-থেকে-কাজ-সঙ্গে-SSL-certificate.html

এটির যৌক্তিকতা হলো আপনি C ++ HttpSetServiceConfiguration API- এ কমান্ড লাইনের সাহায্যে programatically এটি করার জন্য উইন্ডোতে অন্তর্ভূক্ত করা হয়েছে, সুতরাং OS এর নির্ভরতা মুছে ফেলার এবং httpcfg ইনস্টল থাকা অবস্থায়।

0
যোগ
আমি এই কোডটি একটি Nuget প্যাকেজ হিসাবে প্রকাশ করেছি। এটি ব্যবহার করতে বিনা দ্বিধায়
যোগ লেখক Serghei Gorodetki, উৎস