Schannel est la mise en œuvre intégrée de Windows des protocoles TLS. Cela permet de prendre en charge les connexions sécurisées sans aucune bibliothèque externe.
Repo contient:
SChannel.Utils.pas - unité avec des fonctions d'assistance transport-agnostique pour une mise en œuvre facile de la communication TLS au moyen de Windows Schannel.
SChannel.SyncHandshake.pas - Échantillon de poignée de main TLS synchrone à transport-agnostique à l'aide de fonctions de rappel pour une véritable communication
SChannel.Jwa*.pas - Déclarations API empruntées au projet Jedi
SChannel.IcsWSocket.pas - descendant Ics Twsocket qui effectue une communication TLS
Demo - Demo Project pour effectuer toutes les demandes textuelles (principalement HTTPS) via une connexion sécurisée
Enable TLS 1.1 and 1.2 for W7.reg - Patch de registre qui permet les TLS 1.1 et 1.2 sur Windows 7 (ce sont des versions de protocole réelles qui ne sont pas activées par défaut sur W7)
Il n'y a pas de composants installables - vous pouvez simplement télécharger des sources, ajouter des chemins et utiliser des unités. Mais si vous préférez les packages, il y en a deux créés avec RAD XE2. Ouvrez simplement l'un d'eux dans IDE et il devrait mettre à niveau le package en version actuelle.
SChannel_XE2.dproj contient toutes les unités sauf la prise ICS. Utilisez-le si vous n'avez aucun ICS installéSChannel_XE2_ICS.dproj contient toutes les unités, y compris le socket ics dans SChannel.IcsWSocket.pas . Nécessite des ICS installés Les deux packages sont configurés pour créer des unités à ..Bin$(Config)$(Platform) pour réduire le gâchis et éviter de recompiller les unités de schanal chaque fois qu'un projet est construit. Ainsi, vous pouvez ajouter SChannelBinRelease$(Platform) à votre chemin de recherche et à SChannelSource to Browsing Path. Dans ce cas, n'oubliez pas de créer le package pour toutes les plateformes que vous utilisez. Une fois cette installation terminée.
L'installation via le gestionnaire de packages Delphinus est également possible. Cependant, c'est une version initiale qui a certaines limites:
Ce projet a été lancé parce que j'avais besoin de TLS dans mes applications Delphi et que je n'aimais pas expédier deux LIB OpenSSL. La version initiale était une réécriture 1: 1 de l'échantillon de schannel trouvé sur Internet. Actuellement, il est utilisé dans mes projets 24 * 7, mais je n'ai mis en œuvre que les fonctions dont j'avais besoin. Je ne connais pas tous ces cryptostuff, donc ne vous attendez pas à des validations de certificat avancées, à des serveurs sécurisés, etc. Mais si vous souhaitez ajouter quelque chose de manquant, je considérerai votre RP avec plaisir :).
Il y a un bug de Schannel qui provoque des fonctions rarement et au hasard SEC_E_BUFFER_TOO_SMALL ou SEC_E_MESSAGE_ALTERED STATURE pendant la poignée de main. Une bonne description du problème peut être trouvée ici (en bref: cela ne se produit que sur Windows 7 et 8, avec TLSV1.2 et TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 et TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 CIPHER Suites). Pour faire face au problème, plusieurs mesures ont été prises:
Un nombre accru de tampons pour la poignée de main (ce que l'équipe Curl a fait) - n'a pas aidé
Ajout de la fonction IsWinHandshakeBug à SChannel.Utils.pas qui permet de vérifier facilement le bug dans la section except un appel DoClientHandshake . Juste une aide pour faire un traitement spécial comme
...
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 ;
... Classe TSChannelWSocket de la fonction IcsSChannelSocket.pas et PerformClientHandshake de SChannel.SyncHandshake.pas implémentez déjà une réessayer invisible à un appelant.
Classe de socket descendant d'Ics TWSocket qui fait beaucoup de choses pour vous. Caractéristiques clés:
Secure ; Les événements OnTLSDone et OnTLSShutdown signalent l'état de la chaîneSessionData.SharedCreds . Lorsque les sessions sont partagées, la poignée de main devient nettement plus courte pour qu'elle la vaut