Schannel هو تطبيق Windows المدمج لبروتوكولات TLS. هذا يسمح بدعم الاتصالات الآمنة دون أي مكتبة خارجية.
الريبو يحتوي على:
SChannel.Utils.pas - وحدة مع وظائف المساعد النقل النقل لسهولة تنفيذ الاتصالات TLS عن طريق Windows Schannel.
SChannel.SyncHandshake.pas - عينة من مصافحة TLS المتزامنة النقل - باستخدام وظائف رد الاتصال للاتصال الحقيقي
SChannel.Jwa*.pas - إعلانات API المستعارة من مشروع Jedi
SChannel.IcsWSocket.pas - ics twsocket descendant التي تؤدي الاتصالات TLS
Demo - مشروع تجريبي لأداء أي طلبات نصية (بشكل رئيسي HTTPS) عبر اتصال آمن
Enable TLS 1.1 and 1.2 for W7.reg - تصحيح التسجيل الذي يتيح TLS 1.1 و 1.2 على Windows 7 (هذه إصدارات بروتوكول فعلية لا يتم تمكينها افتراضيًا على W7)
لا توجد مكونات قابلة للتثبيت - يمكنك فقط تنزيل المصادر وإضافة المسارات واستخدام الوحدات. ولكن إذا كنت تفضل الحزم ، فهناك اثنان منهم تم إنشاؤهما باستخدام RAD XE2. ما عليك سوى فتح واحد منهم في IDE ويجب عليه ترقية الحزمة إلى الإصدار الحالي.
SChannel_XE2.dproj يحتوي على جميع الوحدات باستثناء مقبس ICS. استخدمه إذا لم يكن لديك ICS مثبتةSChannel_XE2_ICS.dproj على جميع الوحدات بما في ذلك مقبس ICS في SChannel.IcsWSocket.pas . يتطلب ICS مثبتة تم تكوين كلتا الحزمتين لإنشاء وحدات إلى ..Bin$(Config)$(Platform) لتقليل الفوضى وتجنب وحدات schannel إعادة ترجمة في كل مرة يتم فيها بناء المشروع. حتى تتمكن من إضافة SChannelBinRelease$(Platform) إلى مسار البحث الخاص بك و SChannelSource إلى مسار التصفح. في هذه الحالة ، لا تنسى إنشاء الحزمة لجميع المنصات التي تستخدمها. بعد اكتمال هذا التثبيت.
التثبيت عبر Delphinus Package Manager ممكن أيضًا. ومع ذلك ، فهي نسخة أولية لها بعض القيود:
بدأ هذا المشروع لأنني كنت بحاجة إلى TLS في تطبيقات Delphi الخاصة بي ولم أحب شحن اثنين من libs OpenSSL. كان الإصدار الأولي 1: 1 إعادة كتابة عينة Schannel الموجودة في الإنترنت. يتم استخدامه حاليًا في مشاريعي 24*7 لكنني قمت بتنفيذ تلك الوظائف التي احتاجها فقط. لست على دراية بكل هذا Cryptostuff ، لذلك لا تتوقع التحقق من صحة الشهادة المتقدمة والخوادم الآمنة وما إلى ذلك. ولكن إذا كنت ترغب في إضافة شيء مفقود ، فسوف أفكر في العلاقات العامة بسرور :).
هناك خطأ schannel الذي يسبب وظائف نادراً ما يتم إرجاعها بشكل عشوائي SEC_E_BUFFER_TOO_SMALL أو SEC_E_MESSAGE_ALTERED أثناء المصافحة. يمكن العثور على وصف جيد للمشكلة هنا (باختصار: يحدث فقط في Windows 7 و 8 ، مع TLSV1.2 و TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 و TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 CIPHERE). للتعامل مع القضية ، تم اتخاذ العديد من التدابير:
زيادة عدد المخازن المؤقتة للمصافحة (ما فعله فريق Curl) - لم يساعد
وظيفة إضافية IsWinHandshakeBug إلى SChannel.Utils.pas التي تسمح بالتحقق من الخطأ في القسم except قسم من مكالمة DoClientHandshake . مجرد مساعد لإجراء معالجة خاصة مثل
...
try
DoClientHandshake(FSessionData, FHandShakeData);
except on E: ESSPIError do
// Hide Windows handshake bug and restart the process
if (FHandShakeData.Stage = hssReadSrvHello) and IsWinHandshakeBug(E.SecStatus) then
begin
Log(Format( ' Handshake bug: "%s", retrying ' , [E.Message]));
DeleteContext(FHandShakeData.hContext);
DoHandshakeStart;
Exit;
end
else
raise E;
end ;
... TSChannelWSocket فئة من IcsSChannelSocket.pas PerformClientHandshake وظيفة من SChannel.SyncHandshake.pas بالفعل تنفيذ إعادة المحاولة لمرة واحدة بشكل غير مرئي إلى المتصل.
فئة المقبس تنحدر من ICS TWSocket التي تقوم بأشياء كثيرة لك. الميزات الرئيسية:
Secure ؛ ستشير أحداث OnTLSDone و OnTLSShutdownSessionData.SharedCreds . عندما تتم مشاركة الجلسات ، تصبح المصافحة أقصر بكثير لذلك تستحق ذلك