Schannel é a implementação interna do Windows dos protocolos TLS. Isso permite suportar conexões seguras sem nenhuma biblioteca externa.
Repo contém:
SChannel.Utils.pas - unidade com funções auxiliares agnósticas de transporte para facilitar a implementação da comunicação do TLS por meio do Windows Schannel.
SChannel.SyncHandshake.pas - amostra de handshake de Handbon Síncrono Agnóstico do Transporte usando funções de retorno de chamada para comunicação real
SChannel.Jwa*.pas - Declarações da API emprestadas do projeto Jedi
SChannel.IcsWSocket.pas - ICS TWSocket Descendente que executa a comunicação TLS
Projeto de Demo para executar qualquer solicitação textual (principalmente https) por meio de conexão segura
Enable TLS 1.1 and 1.2 for W7.reg - patch de registro que permite que o TLS 1.1 e 1.2 no Windows 7 (essas são versões reais de protocolo que não são ativadas por padrão no W7)
Não há componentes instaláveis - você pode simplesmente baixar fontes, adicionar caminhos e usar unidades. Mas se você preferir pacotes, há dois deles criados com RAD XE2. Basta abrir um deles no IDE e ele deve atualizar o pacote para a versão atual.
SChannel_XE2.dproj contém todas as unidades, exceto o soquete do ICS. Use -o se você não tiver ICS instaladoSChannel_XE2_ICS.dproj contém todas as unidades, incluindo soquete de ICS em SChannel.IcsWSocket.pas . Requer ICS instalado Ambos os pacotes estão configurados para criar unidades para ..Bin$(Config)$(Platform) para reduzir a bagunça e evitar recompilar as unidades schannel sempre que um projeto for construído. Assim, você pode adicionar SChannelBinRelease$(Platform) ao seu caminho de pesquisa e SChannelSource ao caminho da navegação. Nesse caso, não se esqueça de criar o pacote para todas as plataformas que você usa. Após essa instalação estiver concluída.
A instalação via Delphinus Package Manager também é possível. No entanto, é uma versão inicial que possui algumas limitações:
Este projeto foi iniciado porque eu precisava do TLS nos meus aplicativos Delphi e não gostava de enviar duas Libs OpenSSL. A versão inicial foi 1: 1 reescrita da amostra de Schannel encontrada na Internet. Atualmente, é usado nos meus projetos de 24*7, mas implementei apenas as funções que eu precisava. Não estou familiarizado com todo esse CryptStuff, portanto, não espere validações avançadas de certificação, servidores seguros e assim por diante. Mas se você deseja adicionar algo faltando, considero seu PR com prazer :).
Há um bug schannel que causa funções raramente e aleatoriamente retornar SEC_E_BUFFER_TOO_SMALL ou SEC_E_MESSAGE_ALTERED Status durante o handshake. Boa descrição da questão pode ser encontrada aqui (em resumo: acontece apenas no Windows 7 e 8, com TLSV1.2 e TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 e TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 Para lidar com a questão, foram tomadas várias medidas:
Aumento do número de buffers para handshake (o que a equipe de curl fez) - não ajudou
Função adicionada IsWinHandshakeBug a SChannel.Utils.pas que permitem verifique convenientemente o bug, except a seção de uma chamada de DoClientHandshake . Apenas um ajudante para fazer processamento 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 ;
... TSChannelWSocket Classe de IcsSChannelSocket.pas e função de PerformClientHandshake de SChannel.SyncHandshake.pas já implementam repetir invisivelmente para um chamador.
A classe de soquete descendo do ICS TWSocket que faz muitas coisas para você. Principais recursos:
Secure ; OnTLSDone e OnTLSShutdown Events sinalizarão o estado do canalSessionData.SharedCreds . Quando as sessões são compartilhadas, o aperto de mão fica significativamente mais curto, então vale a pena