OpenSSL

O OpenSSL é uma biblioteca de software para aplicações que protegem comunicações em redes de computadores contra interceptação ou que precisam identificar a parte na outra extremidade. É amplamente usado por servidores de Internet, incluindo a maioria dos sites HTTPS.

 

Esta biblioteca é necessária para componentes baseados na Indy Library quando uma conexão segura é necessária. Se a sua aplicação requer OpenSSL, você deve ter os arquivos necessários no seu sistema de arquivos antes de implantar sua aplicação:

 

Atualmente, o sgcWebSockets suporta as versões 1.0.2, 1.1 e 3.0 a 3.3 do openSSL.

 

Platform API 1.0 API 1.1 API 3.* Linkagem Estática/Dinâmica
Windows (32-bit e 64-bit) libeay32.dll e ssleay32.dll libcrypto-1_1.dll e libssl-1_1.dll libcrypto-3.dll e libssl-3.dll Dynamic
OSX libcrypto.dylib, libssl.dylib libcrypto.1.1.dylib, libssl.1.1.dylib libcrypto.3.dylib, libssl.3.dylib Dynamic
iOS Device (32-bit and 64-bit) libcrypto.a e libssl.a libcrypto.a e libssl.a libcrypto.a e libssl.a Static
iOS Simulator libcrypto.dylib, libssl.dylib libcrypto.1.1.dylib, libssl.1.1.dylib libcrypto.3.dylib, libssl.3.dylib Dynamic
Android Device libcrypto.so, libssl.so libcrypto.so, libssl.so libcrypto.so, libssl.so Dynamic

 

 

Veja abaixo como configurar o OpenSSL para cada plataforma:

 

 

Configurações do openSSL

Os componentes do sgcWebSockets baseados em Indy permitem que você configure algumas propriedades do OpenSSL. Acesse as seguintes propriedades:

 

 

API Version

 

A biblioteca Indy padrão permite carregar apenas bibliotecas OpenSSL 1.0.2; essas bibliotecas foram descontinuadas e as versões mais recentes do OpenSSL usam a API 1.1.1.

O sgcWebSockets Enterprise permite que você carregue as bibliotecas openSSL 1.1.1; você pode configurar nesta propriedade qual versão da openSSL API será carregada. Apenas uma versão da API pode ser carregada por processo (portanto, você não pode misturar bibliotecas openSSL 1.0.2 e 1.1.1 na mesma aplicação).

 

 

LibPath

 

Esta propriedade permite que você defina a localização das bibliotecas openSSL. Isto é útil para projetos Android ou OSX, onde a localização das bibliotecas openSSL deve ser definida.

Aceita os seguintes valores:

 

 

 

Load Additional OpenSSL Functions

Utilize um callback para carregar funções adicionais do OpenSSL não definidas por padrão. Você pode ler mais em OpenSSL Load Additional Functions.

 

Ciphers

Se você quiser fornecer suporte a TLS 1.2 e 1.3 no seu servidor usando a melhor segurança e desempenho, use a seguinte configuração:

 

SSLOptions.Version := tls1_3;

SSLOptions.OpenSSL_Options.VersionMin := tls1_2;

SSLOptions.OpenSSL_Options.APIVersion := oslAPI_3_0;

 

E defina a seguinte lista de cifras.

 

AEAD-AES128-GCM-SHA256:AEAD-AES256-GCM-SHA384:AEAD-CHACHA20-POLY1305-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384

 

Certificados Autoassinados

Você pode utilizar certificados autoassinados para fins de teste. Você só precisa executar o seguinte comando para criar um certificado autoassinado:

 

openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout key.pem -out cert.pem

Isso criará 2 arquivos: cert.pem (certificado) e key.pem (chave privada). Você pode combinar ambos os arquivos em um único. Basta criar um novo arquivo e copiar o conteúdo de ambos os arquivos para ele. Assim, você terá uma estrutura como esta:

 

-----BEGIN PRIVATE KEY-----

....

-----END PRIVATE KEY-----

-----BEGIN CERTIFICATE-----

....

-----END CERTIFICATE-----

 

Erros Comuns

SSL_GET_RECORD: wrong version number

 

Este erro significa que o servidor e o cliente estão utilizando versões diferentes do protocolo SSL/TLS. Para corrigi-lo, tente definir a versão correta no componente servidor e/ou cliente.

 

Server.SSLOptions.Version

Client.TLSOptions.Version

 

SSL3_GET_RECORD: decryption failed or bad record mac

 

Geralmente este erro é gerado quando:

 

1. Verifique se você está usando a versão mais recente do OpenSSL. Se for muito antiga, atualize para a versão suportada mais recente.

2. Se este erro aparece aleatoriamente, geralmente é porque mais de uma thread está acessando a conexão OpenSSL. Você pode tentar definir NotifyEvents = neNoSync, o que significa que os eventos: OnConnect, OnDisconnect, OnMessage... serão disparados no contexto da thread de conexão; isto evita alguns problemas de sincronização e proporciona melhor desempenho. Como desvantagem, se, por exemplo, você estiver atualizando um controle visual em um formulário quando receber uma mensagem, deverá implementar seus próprios métodos de sincronização, porque os controles visuais não são thread-safe.