Como estabelecer uma conexão segura usando o Synapse?
-
27-10-2019 - |
Pergunta
Estou testando o Synapse e gostaria de saber como posso estabelecer uma conexão segura. Percebi que ele suporta SSL, mas não tenho certeza se atende às minhas necessidades. Não tenho um certificado da CA. Eu só quero criptografar todos os dados entre meu programa servidor e o programa cliente. Claro, posso criptografar os dados sozinho antes de enviar. Mas se SSL pode criptografar os dados, talvez eu possa apenas usá-lo. Pelo que eu sei, SSL é para "criptografia" e "autenticação". O que eu preciso é apenas de "criptografia". É possível com o Synapse?
< PaulUPDATE:
Obrigado pela ajuda de daemon_x e do autor de Synapse, Lukas Gebauer, acho que finalmente consegui fazer funcionar. Aqui está o que eu fiz:
Lado do servidor :
1) Usa ssl_openssl em sua unidade e coloca 'libeay32.dll' e 'ssleay32.dll' no mesmo diretório do arquivo exe
2) Depois que uma conexão for aceita, adicione as seguintes linhas de código para o soquete recém-criado.
fclient.SSLAcceptConnection;
Lado do cliente :
1) Usa ssl_openssl em sua unidade e coloca 'libeay32.dll' e 'ssleay32.dll' no mesmo diretório do arquivo exe
2) Após conectar ao servidor, adicione a seguinte linha.
fclient.SSLDoConnect;
Se nenhum erro ocorreu, a conexão está segura agora. Mas quando você executa seu código, conforme dito no documento da Synapse, você pode notar que o SSLAcceptConnection demora um pouco para retornar. Portanto, se você quiser acelerar as coisas, é melhor criar um arquivo de certificado e um arquivo de chave privada antecipadamente. E adicione o seguinte código antes de SSLAcceptConnection
fclient.SSL.CertificateFile := 'bs-cert';
fclient.SSL.PrivateKeyFile := 'bs-privatekey';
Se você não tiver um certificado e uma chave privada, consulte "CreateSelfSignedCert" em ssl_openssl para obter um certificado autoassinado e uma chave privada. Você pode salvar, por WriteStrToStream, por exemplo, FCertificate e FPrivatekey em arquivos e usá-los posteriormente.
Solução
Sim, é; você pode usar um dos os plug-ins fornecidos com o Synapse. Como também é mencionado lá, o melhor é usar ssl_openssl.pas . Se decidir seguir este, você precisará, exceto Sysapse e também o Biblioteca OpenSSL . O autor recomenda OpenSSL 0.9.7 , mas como ele disse em nosso fórum parece funcionar também com OpenSSL 1.0.0d.
Observe que se você estiver usando o D2009 ou superior, precisará de um suporte Unicode, que não é totalmente compatível na versão. Faça download da versão mais recente .
O exemplo de código a seguir recebe os primeiros 1024 bytes como resposta ao método HTTP GET
de um site seguro usando criptografia SSL. Usei para ele OpenSSL 0.9.8h com a versão mais recente do Synapse . Observe que você precisa colocar libssl32.dll
e libeay32.dll
do pacote OpenSSL
em seu diretório de saída para que funcione corretamente. Vamos ter um formulário com um botão e um memorando onde recebemos um resultado.
uses blcksock, synautil, synsock, ssl_openssl, ssl_openssl_lib;
procedure TForm1.Button1Click(Sender: TObject);
var Socket: TTCPBlockSocket;
begin
Socket := TTCPBlockSocket.Create;
try
Socket.Connect('www.yousendit.com', '443'); // connect to the host
Socket.SSLDoConnect; // start SSL connection; only server has a certificate
if Socket.LastError = 0 then
begin
Socket.SendString('GET' + CRLF); // request GET method
Memo1.Text := Socket.RecvBufferStr(1024, 1000); // receive 1024 bytes
end;
finally
Socket.Free;
end;
end;