c++ - Excepción en ejecución boost asio ssl ejemplo
linux boost-asio (2)
Estoy tratando de ejecutar los ejemplos SSL de boost :: asio y obtengo una excepción de "Argumento no válido" cuando los ejecuto. Estoy en Linux x86_64.
http://www.boost.org/doc/libs/1_46_1/doc/html/boost_asio/example/ssl/client.cpp
http://www.boost.org/doc/libs/1_46_1/doc/html/boost_asio/example/ssl/server.cpp
Compilado con
g++ server.cpp -o server -lboost_system -lssl
g++ client.cpp -o client -lboost_system -lssl
Corre como
$ ./server
Usage: server <port>
$ ./server 10000
Exception: Invalid argument
$ ./server 1000
Exception: Permission denied
$ sudo ./server 1000
Exception: Invalid argument
No estoy seguro de cuál es el problema :( Cualquier ayuda sería muy apreciada.
¡Gracias!
De acuerdo, para cualquier persona que encuentre esto en el futuro, debe crear sus certificados y firmarlos adecuadamente. Aquí están los comandos para Linux:
// Generar una clave privada
openssl genrsa -des3 -out server.key 1024
// Generar solicitud de firma de certificado
openssl req -new -key server.key -out server.csr
// Firmar certificado con clave privada
openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt
// Eliminar el requisito de contraseña (necesario por ejemplo)
cp server.key server.key.secure
openssl rsa -in server.key.secure -out server.key
// Generar archivo dhparam
openssl dhparam -out dh512.pem 512
Una vez que hayas hecho eso, necesitas cambiar los nombres de los archivos en server.cpp y client.cpp.
server.cpp
context_.use_certificate_chain_file("server.crt");
context_.use_private_key_file("server.key", boost::asio::ssl::context::pem);
context_.use_tmp_dh_file("dh512.pem");
client.cpp
ctx.load_verify_file("server.crt");
¡Entonces todo debería funcionar!
Ejecute las pruebas nuevamente con strace para ver qué syscall obtiene el EINVAL
, como un bono podrá ver los argumentos para la llamada que falla. Es probable que sea parte de la configuración del contexto de seguridad que está fallando, a menos que tenga los archivos y datos correctos del ejemplo:
context_.use_certificate_chain_file("server.pem");
context_.use_private_key_file("server.pem", boost::asio::ssl::context::pem);
context_.use_tmp_dh_file("dh512.pem");
EPERM
porque intentaba enlazar a un puerto TCP privilegiado (uno cuyo valor es inferior a 1024). Es por eso que ./server 10000
no obtiene EPERM
.