از HttpWebRequest استفاده کردم و همه چیز به نظر درست میومد. اما برنامه دقیقاً در هنگام فراخوانی متد GetResponse، با خطای ذیل مواجه میشد:
The remote certificate is invalid according to the validation procedure
پس از چند ساعت زیر و رو کردن سایت ها و امتحان کردن روش های مختلف، در نهایت به این نتیجه ی جالب رسیدم که…
در انتقال اطلاعات، مهمترین بحث، امنیت هست. پیغام ها در بستر شبکه به طور پیش فرض به صورت متن ساده رد و بدل میشن. بنابراین یک هکر می تونه با قرار دادن برنامه های Sniffer در جلوی پکت های ارسالی، اونها رو دریافت و مشاهده کنه.
راه حلی که عموماً برای جلوگیری از قابل فهم بودن محتوای ارسالی در بستر شبکه به کار میره، استفاده از (HTTPS (SSL به جای HTTP هست. در این حالت، محتوای داده های ارسالی رمزنگاری میشن.
برای اینکه بتونید در بستر اینترنت از SSL استفاده کنید، نیاز به داشتن یک گواهینامه ی امنیتی و نصب اون بر روی سرور دارید که توسط برخی شرکت ها به شما اعطا میشه.
وقتی که وارد سایتی میشید که از پروتوکل HTTPS استفاده می کنه، معمولاً کادری توسط مرورگر ظاهر میشه که از شما برای تایید اعتبار سایت و اطمینان به اون سوالی می پرسه. بنابراین، پذیرش این نکته که آیا SSL اون سایت معتبر شناخته بشه یا خیر بر عهده ی کاربر گذاشته میشه.
مشکلی که در رابطه با ارسال درخواست با برنامه نویسی به یک پروتوکل HTTPS وجود داره اینه که در این حالت کادری وجود نداره که از شما بابت تایید صلاحیت SSL اون سایت اجازه بخواد! و در نتیجه، خطایی که پیشتر به اون اشاره کردم رخ میده. البته ممکنه با خطاهای دیگه ای از جمله خطای ذیل نیز مواجه بشید:
The underlying connection was closed: Could not establish trust relationship with remote server.
راه حلی که برای حل این مشکل میشه ارائه داد، تغییر رفتار برنامه در هنگام برخورد با یک پروتوکل HTTPS، با استفاده از ایمپلمنت کردن اینترفیس ICertificatePolicy هست.
این اینترفیس، یک متد با نام CheckValidationResult داره که مقدار bool رو بر میگردونه. کافیه در بدنه ی این متد، مقدار برگشتی رو برابر با true تنظیم کنید تا تعیین اعتبار همیشه با موفقیت انجام بگیره.
public class TrustAllCertificatePolicy : System.Net.ICertificatePolicy
{
public TrustAllCertificatePolicy()
{ }
#region ICertificatePolicy Members
bool System.Net.ICertificatePolicy.CheckValidationResul t(System.Net.ServicePoint srvPoint, System.Security.Cryptography.X509Certificates.X509 Certificate certificate, System.Net.WebRequest request, int certificateProblem)
{
return true;
}
#endregion
}
و سپس قبل از اینکه درخواستی رو به پروتوکل HTTPS بفرستید، مقدار خاصیت CertificatePolicy کلاس ServicePointManager رو برابر با کلاس ایجاد شده قرار بدید:
ServicePointManager.CertificatePolicy = new TrustAllCertificatePolicy();
کلاس ServicePointManager مجموعه رفتارهایی رو مشخص می کنه که در ارتباط با یک سرور تعریف میشن.
این گفته ها در مورد برقراری ارتباط با یک وب سرویس با پروتوکل HTTPS هم صدق می کنه.
با تستی که انجام دادم، متوجه شدم که کلاس WebClient این مشکل رو نداره. احتمالاً در پیاده سازی اون به طور ضمنی همیشه گواهینامه معتبر شناخته میشه.