Schannel是Windows内置的TLS协议实现。这允许在没有任何外部库的情况下支持安全连接。
回购包含:
SChannel.Utils.pas具有运输不足的助手功能的单元,可轻松通过Windows Schannel实施TLS通信。
SChannel.SyncHandshake.pas使用回调函数进行真实通信
SChannel.Jwa*.pas -API声明从绝地武士项目中借来
SChannel.IcsWSocket.pas执行TLS通信的ICS Twsocket后代
Demo - 通过安全连接执行任何文本(主要是HTTPS)请求的演示项目
Enable TLS 1.1 and 1.2 for W7.reg注册表补丁,该补丁可以在Windows 7上启用TLS 1.1和1.2(这些是默认情况下未在W7上启用的实际协议版本)
没有可安装的组件 - 您只需下载源,添加路径和使用单元即可。但是,如果您喜欢包装,则有两个用RAD XE2创建的。只需在IDE中打开其中一个即可将软件包升级到当前版本。
SChannel_XE2.dproj包含除ICS插座以外的所有单元。如果您没有安装ICS,请使用它SChannel_XE2_ICS.dproj包含所有单元,包括SChannel.IcsWSocket.pas中的ICS插座。需要安装IC这两个软件包均配置为将单位构建为..Bin$(Config)$(Platform)以减少烂摊子,并避免每次构建项目时重新编译Schannel单位。因此,您可以将SChannelBinRelease$(Platform)添加到搜索路径和SChannelSource中。在这种情况下,不要忘记为您使用的所有平台构建包装。在该安装完成之后。
还可以通过Delphinus软件包管理器安装。但是,这是一个具有一些局限性的初始版本:
该项目之所以开始,是因为我需要Delphi应用程序中的TLS,并且不喜欢运送两个OpenSSL libs。初始版本是在Internet中找到的Schannel样本的1:1重写。目前,它用于我的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 CIPERES)。为了解决这个问题,采取了几项措施:
增加握手的缓冲区数量(卷曲团队所做的) - 无济于事
添加了IsWinHandshakeBug到SChannel.Utils.pas ,该功能允许在DoClientHandshake Call的except中方便检查该错误。只是一个助手来进行特殊处理
...
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 ;
...来自IcsSChannelSocket.pas和PerformClientHandshake函数的TSChannelWSocket类来自SChannel.SyncHandshake.pas 。
从ICS TWSocket降下的插座类为您带来许多事情。关键功能:
Secure属性启动/完成; OnTLSDone和OnTLSShutdown事件将信号通道状态SessionData.SharedCreds属性之间共享多个插座之间。当分享会议时,握手变短了,所以值得