Criptografia do tráfego TLS de acordo com os algoritmos GOST-2012 com Stunnel


Neste artigo, quero mostrar como configurar o Stunnel para usar algoritmos criptográficos russos no protocolo TLS. Como bônus, mostrarei como criptografar um canal TLS usando os algoritmos GOST implementados no núcleo criptográfico Rutoken EDS 2.0.


Mas primeiro, vamos descobrir para que serve o Stunnel. Em poucas palavras - este é um programa no qual você pode mudar toda a lógica da criptografia de tráfego entre o servidor e o cliente. Isso é feito da seguinte maneira: suponha que você tenha um cliente e um servidor que se comuniquem sem usar criptografia, autenticação e verificação de integridade. Você pode reescrever o cliente e o servidor para que todas as mensagens enviadas e recebidas sejam transmitidas entre si, levando em consideração todos esses pontos, mas por que essas dificuldades, se você pode simplesmente colocá-lo nos ombros de outro aplicativo? Para resolver esse problema, o Stunnel está certo.


Você só precisa configurar o cliente para que todo o tráfego seja transmitido ao cliente Stunnel, por sua vez, estabelece uma conexão segura com o servidor, enviando dados para o servidor Stunnel. O stunnel no servidor descriptografa o tráfego recebido e redireciona os dados para a entrada do servidor. O acima é mais fácil de entender olhando para este diagrama.



Vale ressaltar que o servidor não precisa ser exatamente Stunnel, para trabalhar com algoritmos criptográficos. É ótimo que existam bancas de demonstração prontas que suportem criptografia russa, cuja lista está na apresentação com RusCrypto'2019 .


Precisamos de servidores estáveis ​​que forneçam autenticação bidirecional.
Escolhemos os servidores CryptoPro como os mais confiáveis ​​com a implementação completa do padrão GOST TLS. Obrigado a eles por isso :)


Parece bastante simples, vamos tentar organizar esse processo.


Etapa preparatória


Vamos precisar de:


  1. Openssl
  2. Stunnel
  3. rtengine
  4. Acesso aos servidores de teste CryptoPro para verificar a conexão TLS

O OpenSSL para Windows pode ser obtido a partir daqui e para usuários do Linux - a partir de repositórios ou montado por meio do download da versão mais recente a partir daqui . Também pode ser obtido no Rutoken SDK , no diretório openssl \ openssl-tool-1.1 , esse arquivo será útil ainda mais, pois contém o mecanismo de interesse para nós. Stunnel pode ser encontrado aqui . Versão> = 5.56 é necessária para a operação.


Você pode baixar o rtengine a partir do Rutoken SDK , que fica no diretório openssl \ rtengine \ bin . Você precisa soltá-lo onde todos os mecanismos openssl estão armazenados. Você pode encontrar o caminho para eles usando


openssl.exe version -a 

Mas apenas mover o mecanismo para a pasta desejada não é suficiente; você ainda precisa configurar o openssl para trabalhar com ele. Descobrimos onde o arquivo de configuração openssl.cnf está com o mesmo comando acima (no stunnel do Windows vem com sua própria versão do openssl, portanto, o arquivo de configuração está no caminho \ to \ stunnel \ config \ openssl.cnf


 #   : openssl_conf = openssl_def ... #   : # OpenSSL default section [openssl_def] engines = engine_section [engine_section] rtengine = rtengine_section [rtengine_section] engine_id = rtengine dynamic_path = /path/to/rtengine.so MODULE_PATH = /usr/lib/librtpkcs11ecp.so default_algorithms = CIPHERS, DIGEST, PKEY, RAND 

Vamos verificar se o rtengine está conectado. Para isso, conectamos um token e listamos todos os algoritmos de criptografia:


 openssl ciphers -v 

Deixe-me lembrá-lo de que no Windows você precisa verificar o openssl, que fica ao lado do stunnel
Se entre eles nossos GOSTs estiverem presentes, tudo estará configurado corretamente.


Chegou a hora do mais interessante: verificar a conexão com os servidores de teste GOST CryptoPro. Uma lista desses servidores é descrita aqui ( https://www.cryptopro.ru/products/csp/tc26tls ). Cada um desses servidores trabalha com seus próprios algoritmos para autenticação e criptografia. Além disso, nas portas 443, 1443, 2443, ... são lançados serviços que aceitam apenas determinados parâmetros. Por exemplo, em http://tlsgost-256auth.cryptopro.ru , a criptografia é realizada com autenticação usando os algoritmos GOST2012-GOST8912-GOST8912 e uma chave de 256 bits. Além disso, a porta 443 usa XchA-ParamSet, a porta 1443 usa XchB-ParamSet, a porta 2443 usa A-ParamSet, etc.


Agora que sabemos qual chave precisamos, vamos obter o certificado raiz do servidor de teste, elaborar as chaves para o trabalho e assinar a solicitação do nosso certificado.


Maneira simples (funciona no Windows e Linux)


  1. Para obter o certificado raiz, iremos ao site do teste CA LLC "CRIPTO-PRO" . E clique no botão para obter um certificado. Uma nova guia será exibida, na qual você precisará selecionar o método de criptografia Base64 e clicar no botão "Baixar certificado CA" . O arquivo certnew.cer resultante é salvo.
  2. Siga o link . Instale todos os plugins solicitados por nós. Clicamos no botão "Criar chave" e selecionamos o algoritmo "GOST R 34.10-2012 de 256 bits" para geração. Em seguida, crie uma solicitação de certificado, na coluna "Aplicativo", você pode selecionar tudo. Na coluna Aplicativo Adicional: Autenticação de Cliente e Usuário do Centro de Registro CryptoPro.
  3. Novamente, abrimos o site da CA de teste, mas desta vez clicamos no botão "Enviar solicitação pronta PKCS # 10 ou PKCS # 7 codificada em Base64" . Colamos o conteúdo de nossa solicitação no campo, clique no botão "Emissão" e carregamos o certificado user.crt no formato Base64. O arquivo resultante é salvo.

Via linha de comando


  1. Para obter o certificado raiz, iremos ao site do teste CA LLC "CRIPTO-PRO" . E clique no botão para obter um certificado. Uma nova guia será exibida, na qual você precisará selecionar o método de criptografia Base64 e clicar no botão "Download do certificado CA" . O arquivo certnew.cer resultante é salvo.


  2. Agora gere as chaves.


     pkcs11-tool --module /usr/lib/librtpkcs11ecp.so --keypairgen --key-type GOSTR3410-2012-256:B -l --id 45 # 45 --   ASII id  (E) 

    Vale ressaltar que as chaves geradas no token não podem ser copiadas do token. Essa é uma das principais vantagens de seu uso.


  3. Crie uma solicitação de certificado:


     openssl req -engine rtengine -new -key="pkcs11:id=E" -keyform engine -out client.req 

  4. Novamente, abrimos o site da CA de teste, mas desta vez clicamos no botão "Enviar solicitação pronta PKCS # 10 ou PKCS # 7 codificada em Base64" . Colamos o conteúdo de nossa solicitação no campo, clique no botão Problema e carregue o certificado user.crt no formato Base64. O arquivo resultante é salvo.



Houve a última pergunta: Por que tudo isso ??? Por que recebemos todos esses certificados, chaves e solicitações?


O fato é que eles são necessários pelo protocolo TLS para autenticação bidirecional. Funciona de maneira muito simples.


Temos um certificado de servidor e consideramos confiável.


Nosso cliente verifica se o servidor com o qual trabalhamos tem um certificado semelhante.
O servidor deseja garantir que ele funcione com o usuário que conhece. Para isso, criamos uma solicitação de certificado para trabalhar com nossas chaves.


Enviamos essa solicitação e o servidor a assinou com sua assinatura digital. Agora podemos apresentar esse certificado todas as vezes, assinado pela CA raiz, confirmando assim que somos nós.


Configurando o Stunnel


Resta apenas configurar corretamente nosso túnel. Para fazer isso, crie um arquivo stunnel.conf com as configurações padrão do Stunnel e escreva o seguinte:


 ;      - debug = 7 output = /path/to/stunnel.log ;    TLSv1 sslVersion=TLSv1 ;  . engine=rtengine ;     [remote system] client=yes ;  engine,     engineId=rtengine ;   2 (  ) verify = 2 ;     CAFile = /path/to/certnew.cer ;     cert=/path/to/user.crt ;     . key=pkcs11:model=Rutoken%20ECP;manufacturer=Aktiv%20Co.;id=E ;   Stunnel      accept = localhost:8080 connect = tlsgost-256auth.cryptopro.ru:2443 

Agora, se tudo for feito corretamente, você poderá iniciar o Stunnel com nossa configuração e conectar-se ao servidor:


 stunnel.exe /path/to/stunnel.conf 

Abra o navegador e vá para localhost: 8080. Se tudo estiver correto, o seguinte será exibido:



Caso contrário, examinamos os logs e usamos o depurador para entender qual é o problema.


Se você tiver alguma dúvida, não hesite em comentar :)

Source: https://habr.com/ru/post/pt477650/


All Articles