Schannel คือการใช้งาน Windows ในตัวของโปรโตคอล TLS สิ่งนี้ช่วยให้การเชื่อมต่อที่ปลอดภัยโดยไม่มีไลบรารีภายนอกใด ๆ
repo ประกอบด้วย:
SChannel.Utils.pas - หน่วยที่มีฟังก์ชั่นผู้ช่วยการขนส่งแบบไม่เข้าใจ
SChannel.SyncHandshake.pas - ตัวอย่างของการขนส่งแบบซิงโครนัส TLS แบบซิงโครนัสการขนส่งโดยใช้ฟังก์ชั่นการโทรกลับเพื่อการสื่อสารจริง
SChannel.Jwa*.pas - ประกาศ API ที่ยืมมาจากโครงการเจได
SChannel.IcsWSocket.pas - ลูกหลาน ICS Twsocket ที่ทำการสื่อสาร TLS
Demo - โครงการสาธิตสำหรับการดำเนินการตามข้อความใด ๆ (ส่วนใหญ่ HTTPS) ผ่านการเชื่อมต่อที่ปลอดภัย
Enable TLS 1.1 and 1.2 for W7.reg - Registry Patch ที่เปิดใช้งาน 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 ของฉันและไม่ชอบการจัดส่ง OpenSSL Libs สองรายการ เวอร์ชันเริ่มต้นคือ 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 CIPHERISE) เพื่อจัดการกับปัญหามีมาตรการหลายอย่าง:
เพิ่มจำนวนบัฟเฟอร์สำหรับการจับมือกัน (ทีม 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 และ OnTLSShutdown จะส่งสัญญาณสถานะช่องสัญญาณSessionData.SharedCreds เมื่อมีการแบ่งปันเซสชันการจับมือจะสั้นลงอย่างมากดังนั้นมันจึงคุ้มค่า