Exception running boost asio ssl example

18

Я пытаюсь запустить примеры SSL из boost :: asio, и при запуске я получаю исключение «Invalid argument». Я нахожусь в Linux x86_64.

Ссылка

Ссылка

Скомпилировано с помощью

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

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

Спасибо!

    
задан Shootfast 23.06.2011 в 12:43
источник

2 ответа

40

Хорошо, для тех, кто найдет это в будущем, вам необходимо создать свои сертификаты и подписать их соответствующим образом. Вот команды для 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");

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

    
ответ дан Shootfast 06.12.2011 в 23:22
  • Работает с перфекционизмом, опция -des3 может быть ограничена, поэтому мы делаем noet необходимость удаления пароля. Все файлы находятся в формате pem, поэтому мы можем создать один файл server.pem, объединив server.crt server.key и dh512.pem. –  fantastory 15.10.2012 в 20:41
  • вы не получили ошибку asio.ssl: 336027804. –  Gabe Rainbow 30.01.2013 в 00:45
  • Кстати, на шаге «Сгенерировать запрос подписи сертификата» задаются некоторые вопросы. Из panoptic.com/wiki/aolserver/... Я смог узнать, что единственной необходимой информацией является «Общее имя», которое должно соответствовать имени хоста. –  Tarc 08.05.2014 в 12:11
  • Я оставляю этот комментарий, потому что кто-то столкнется с сообщением об ошибке вроде меня. (Не удалось выполнить рукопожатие: asio.ssl: 336077172). это означает, что (Handshake не удалось: клавиша dh слишком мала). вы можете проверить это сообщение в error.message (); и это из-за dh512.pem. 512 бит слишком мал. недавно ограничение было изменено, мы должны использовать более 512 бит. > openssl dhparam -out dh1024.pem 1024 –  JungJik Lee 16.07.2015 в 03:36
3

Повторите тесты снова с помощью strace, чтобы узнать, какой syscall получает 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 .

    
ответ дан Brian Cain 29.10.2011 в 07:03
  • Спасибо за ответ. Ошибок EPERM в выводе strace нет, но есть все: open ("server.pem", O_RDONLY) = -1 ENOENT (нет такого файла или каталога) прямо перед печатью исключений. Googling далее я думаю, что мне, возможно, придется создать несколько SSL-сертификатов. Что имеет смысл: P Спасибо за кончик strace, я всегда забываю об этом! –  Shootfast 08.11.2011 в 07:37