Exception Running Boost Asio SSL пример - PullRequest
19 голосов
/ 23 июня 2011

Я пытаюсь запустить примеры 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

Выполнить как:

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

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

Спасибо!

Ответы [ 2 ]

45 голосов
/ 07 декабря 2011

ОК, для любого, кто обнаружит это в будущем, вам нужно создать свои сертификаты и подписать их соответствующим образом.Вот команды для 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

Как только вы это сделаете, вынужно изменить имена файлов в server.cpp и 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");

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

3 голосов
/ 29 октября 2011

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

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.

...