Eu escrevi programas C simples, que usam soquetes ('cliente' e 'servidor'). (Uso UNIX / Linux)
O lado do servidor simplesmente cria um soquete:
sockfd = socket(AF_INET, SOCK_STREAM, 0);
E então o vincula ao sockaddr:
bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr));
E ouve (e aceita e lê):
listen(sockfd,5);
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
read(newsockfd,buffer,255);
O cliente cria o soquete e grava nele.
Agora, eu quero converter essa conexão simples em uma conexão SSL, da maneira mais simples, idílica, organizada e rápida.
Tentei adicionar OpenSSL ao meu projeto, mas não consigo encontrar uma maneira fácil de implementar o que desejo.
stunnel
ostunnel4
pacote está em distros baseadas em Debian e é fácil de usar. Existem algumas limitações em comparação com a adição de suporte SSL adequado em seu servidor, mas pode ser bom para uma solução rápida. Gosto do stunnel porque parece se adequar à abordagem de ferramentas de software UNIX.Respostas:
Existem várias etapas ao usar o OpenSSL. Você deve ter feito um certificado SSL que pode conter o certificado com a chave privada, certifique-se de especificar a localização exata do certificado (este exemplo tem na raiz). Existem muitos bons tutoriais por aí.
Alguns incluem:
Você precisará inicializar o OpenSSL:
Agora, para a maior parte da funcionalidade. Você pode querer adicionar um loop while nas conexões.
Você pode ler ou escrever usando:
Atualizar O
SSL_CTX_new
deve ser chamado com o método TLS que melhor se adapta às suas necessidades para oferecer suporte às versões mais recentes de segurança, em vez deSSLv23_server_method()
. Veja: OpenSSL SSL_CTX_new descriçãofonte
if
está errado. Deve serif (ssl_err <= 0) {
só então é um erro.SSL_accept()
retorna1
em caso de sucesso,0
em "falha controlada" e-1
em "falha fatal". Veja a página do manual.SSL_CTX_set_tmp_dh[_callback]()
não forem chamadas. Acabei de descobrir da maneira mais difícil que as cifras NULL não funcionam sem ele, produzindo o alerta número 40.SSLv23_server_method()
estados que o servidor entende SSLv2 e v3 e agora está obsoleto. Para oferecer suporte a TLS 1.1 e 1.2, substitua esse método porTLS_server_method()
. fonteOpenSSL é bastante difícil. É fácil desperdiçar acidentalmente toda a sua segurança ao não fazer a negociação exatamente da maneira certa. (Caramba, fui pessoalmente mordido por um bug em que curl não estava lendo os alertas do OpenSSL exatamente da maneira certa e não conseguia falar com alguns sites.)
Se você realmente quer algo rápido e simples, coloque o stud antes do seu programa e ligue-o um dia. Ter SSL em um processo diferente não deixará você lento: http://vincent.bernat.im/en/blog/2011-ssl-benchmark.html
fonte
Para outros como eu:
Era uma vez um exemplo na fonte SSL no diretório
demos/ssl/
com código de exemplo em C ++. Agora está disponível apenas por meio do histórico: https://github.com/openssl/openssl/tree/691064c47fd6a7d11189df00a0d1b94d8051cbe0/demos/sslVocê provavelmente terá que encontrar uma versão funcional. Originalmente, postei esta resposta em 6 de novembro de 2015. E tive que editar a fonte - não muito.
Certificados: .pem em
demos/certs/apps/
: https://github.com/openssl/openssl/tree/master/demos/certs/appsfonte
Aqui, meu exemplo de encadeamentos de servidor de soquete ssl (conexão múltipla) https://github.com/breakermind/CppLinux/blob/master/QtSslServerThreads/breakermindsslserver.cpp
fonte