Исключительный запуск boost asios ssl example
Я пытаюсь запустить примеры SSL из boost:: asio, и при запуске я получаю исключение "Invalid argument". Я нахожусь в 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
Не знаю, в чем проблема:(
Любая помощь будет принята с благодарностью.
Спасибо!
Ответы
Ответ 1
Хорошо, для тех, кто найдет это в будущем, вам необходимо создать свои сертификаты и подписать их соответствующим образом.
Вот команды для 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");
Тогда все должно работать!
Ответ 2
Выполните тесты снова с помощью 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
.