Исключение работает boost asio ssl пример

Я пытаюсь запустить примеры SSL из boost:: asio, и я получаю исключение "недопустимый аргумент" при их запуске. Я на 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

составлен с:

g++ server.cpp -o server -lboost_system -lssl
g++ client.cpp -o client -lboost_system -lssl

Run как:

$ ./server 
Usage: server <port>
$ ./server 10000
Exception: Invalid argument
$ ./server 1000
Exception: Permission denied
$ sudo ./server 1000
Exception: Invalid argument

Не уверен, что проблема есть :( Любая помощь будет очень признательна.

спасибо!

2 ответов


хорошо, для тех, кто найдет это в будущем, вам нужно создать свои сертификаты и подписать их соответствующим образом. Вот команды для linux:

/ / создать закрытый ключ

openssl genrsa -des3 -out server.key 1024

/ / создать запрос подписи сертификата

openssl req -new -key server.key -out server.csr

//подписать сертификат с закрытым ключом

openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt

/ / удалить требование пароля (требуется, например)

cp server.key server.key.secure
openssl rsa -in server.key.secure -out server.key

//создать файл dhparam

openssl dhparam -out dh512.pem 512

как только вы закончите что нужно изменить имена файлов на сервер.cpp и клиента.СРР.

сервер.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");

клиент.cpp

ctx.load_verify_file("server.crt");

тогда все должно работать!


выполните тесты снова со strace, чтобы увидеть, какой syscall получает EINVAL, в качестве бонуса вы увидите args для неудачного вызова. Вероятно, это часть настройки контекста безопасности, которая терпит неудачу, если у вас нет правильных файлов и данных из примера:

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 потому что вы пытались привязаться к привилегированному TCP-порту (значение которого меньше 1024). Вот почему ./server 10000 не получается EPERM.