Escribí programas simples en C, que utilizan sockets ('cliente' y 'servidor'). (Uso de UNIX / Linux)
El lado del servidor simplemente crea un socket:
sockfd = socket(AF_INET, SOCK_STREAM, 0);
Y luego lo une a sockaddr:
bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr));
Y escucha (y acepta y lee):
listen(sockfd,5);
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
read(newsockfd,buffer,255);
El cliente crea el socket y luego escribe en él.
Ahora, quiero convertir esta simple conexión en una conexión SSL, de la manera más sencilla, idílica, ordenada y rápida.
Intenté agregar OpenSSL a mi proyecto, pero no encuentro una manera fácil de implementar lo que quiero.
stunnel
, por ejemplo , elstunnel4
paquete está en distribuciones basadas en Debian y es fácil de usar. Existen algunas limitaciones en comparación con agregar el soporte SSL adecuado en su servidor, pero puede ser bueno para una solución rápida. Me gusta stunnel porque parece encajar con el enfoque de las herramientas de software de UNIX.Respuestas:
Hay varios pasos al utilizar OpenSSL. Debe tener un certificado SSL hecho que pueda contener el certificado con la clave privada asegúrese de especificar la ubicación exacta del certificado (este ejemplo lo tiene en la raíz). Hay muchos buenos tutoriales por ahí.
Algunos incluyen:
Necesitará inicializar OpenSSL:
Ahora, la mayor parte de la funcionalidad. Es posible que desee agregar un bucle while en las conexiones.
Luego podrá leer o escribir usando:
La actualización se
SSL_CTX_new
debe llamar con el método TLS que mejor se adapte a sus necesidades para admitir las versiones más recientes de seguridad, en lugar deSSLv23_server_method()
. Ver: OpenSSL SSL_CTX_new descripciónfuente
if
embargo, el último está mal. Debería serif (ssl_err <= 0) {
solo entonces es un error.SSL_accept()
devuelve1
el éxito,0
el "fallo controlado" y-1
el "fallo fatal". Consulte la página de manual.SSL_CTX_set_tmp_dh[_callback]()
no se llaman. Acabo de descubrir por las malas que los cifrados NULL no funcionarán sin él, lo que genera la alerta número 40.SSLv23_server_method()
indica que el servidor comprende SSLv2 y v3 y ahora está obsoleto. Para admitir TLS 1.1 y 1.2, reemplace ese método conTLS_server_method()
. fuenteOpenSSL es bastante difícil. Es fácil deshacerse accidentalmente de toda su seguridad al no negociar exactamente correctamente. (Diablos, personalmente me ha picado un error en el que curl no estaba leyendo las alertas de OpenSSL exactamente correctamente y no podía hablar con algunos sitios).
Si realmente quiere algo rápido y sencillo, coloque Stud delante de su programa y llámelo un día. Tener SSL en un proceso diferente no lo ralentizará: http://vincent.bernat.im/en/blog/2011-ssl-benchmark.html
fuente
Para otros como yo:
Una vez hubo un ejemplo en la fuente SSL en el directorio
demos/ssl/
con código de ejemplo en C ++. Ahora está disponible solo a través del historial: https://github.com/openssl/openssl/tree/691064c47fd6a7d11189df00a0d1b94d8051cbe0/demos/sslProbablemente tendrás que encontrar una versión que funcione. Originalmente publiqué esta respuesta el 6 de noviembre de 2015. Y tuve que editar la fuente, no mucho.
Certificados: .pem en
demos/certs/apps/
: https://github.com/openssl/openssl/tree/master/demos/certs/appsfuente
Aquí mi ejemplo de subprocesos de servidor de socket ssl (conexión múltiple) https://github.com/breakermind/CppLinux/blob/master/QtSslServerThreads/breakermindsslserver.cpp
fuente