Schannel es la implementación incorporada de Windows de los protocolos TLS. Esto permite admitir conexiones seguras sin ninguna biblioteca externa.
Repo contiene:
SChannel.Utils.pas - Unidad con funciones auxiliares agnósticas de transporte para una fácil implementación de la comunicación TLS por medio de Windows Schannel.
SChannel.SyncHandshake.pas - Muestra de apretón de manos TLS sincrónico de transporte usando funciones de devolución de llamada para comunicación real
SChannel.Jwa*.pas - API Declaraciones tomadas del proyecto Jedi
SChannel.IcsWSocket.pas - ICS Twsocket Descendente que realiza la comunicación TLS
Proyecto de Demo de demostración para realizar cualquier solicitud textual (principalmente https) a través de una conexión segura
Enable TLS 1.1 and 1.2 for W7.reg - Parche de registro que habilita TLS 1.1 y 1.2 en Windows 7 (estas son versiones de protocolo reales que no están habilitadas de forma predeterminada en W7)
No hay componentes instalables: solo puede descargar fuentes, agregar rutas y usar unidades. Pero si prefiere paquetes, hay dos de ellos creados con RAD XE2. Simplemente abra uno de ellos en IDE y debería actualizar el paquete a la versión actual.
SChannel_XE2.dproj contiene todas las unidades excepto ICS Socket. Úselo si no tiene IC instaladosSChannel_XE2_ICS.dproj contiene todas las unidades, incluida el socket ICS en SChannel.IcsWSocket.pas . Requiere ICS instalado Ambos paquetes están configurados para construir unidades a ..Bin$(Config)$(Platform) para reducir el desorden y evitar recompilar unidades Schannel cada vez que se construye un proyecto. Por lo tanto, puede agregar SChannelBinRelease$(Platform) a su ruta de búsqueda y SChannelSource a la ruta de navegación. En este caso, no olvide construir el paquete para todas las plataformas que usa. Después de esa instalación está completa.
La instalación a través de Delphinus Package Manager también es posible. Sin embargo, es una versión inicial que tiene algunas limitaciones:
Este proyecto se inició porque necesitaba TLS en mis aplicaciones de Delphi y no me gustó enviar dos libres OpenSSL. La versión inicial fue 1: 1 Reescritura de la muestra de Schannel encontrada en Internet. Actualmente se usa en mis proyectos 24*7, pero implementé solo aquellas funciones que necesitaba. No estoy familiarizado con todo este cryptostuff, así que no espere validaciones de certificados avanzados, servidores seguros, etc. Pero si desea agregar algo que falta, consideraré su PR con placer :).
Hay un error de Schannel que causa funciones raramente y devuelve aleatoriamente SEC_E_BUFFER_TOO_SMALL o SEC_E_MESSAGE_ALTERED Status durante el apretón de manos. Una buena descripción del problema se puede encontrar aquí (en resumen: solo sucede en Windows 7 y 8, con TLSV1.2 y TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 y TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 CIPHER). Para abordar el problema, se tomaron varias medidas:
Mayor número de buffers para apretón de manos (lo que hizo el equipo de curl) - no ayudó
Función agregada IsWinHandshakeBug a SChannel.Utils.pas que permite verificar convenientemente el error en except sección de una llamada DoClientHandshake . Solo un ayudante para hacer un procesamiento especial como
...
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 ;
... Clase TSChannelWSocket de IcsSChannelSocket.pas y PerformClientHandshake función desde SChannel.SyncHandshake.pas ya implementan volver de reintento invisiblemente a una persona que llama.
La clase de socket descendiendo de ICS TWSocket que hace muchas cosas por usted. Características clave:
Secure ; Los eventos OnTLSDone y OnTLSShutdown indicarán el estado del canalSessionData.SharedCreds . Cuando se comparten las sesiones, el apretón de manos se vuelve significativamente más corto, por lo que vale la pena