运行 boost asio ssl 示例时出现异常

问题描述 投票:0回答:4

我尝试从 boost::asio 运行 SSL 示例,但在运行它们时出现“无效参数”异常。我使用的是 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

不知道问题是什么:( 任何帮助将不胜感激。

谢谢!

c++ linux boost ssl boost-asio
4个回答
49
投票

好的,对于将来发现此问题的任何人,您需要创建证书并对其进行适当的签名。 以下是 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 中的文件名。

服务器.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");

然后一切都应该可以了!


3
投票

使用 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


0
投票

当遵循@Shootfast的答案时,出现错误:“错误的SSL配置:use_certificate_chain_file:ee密钥太小”

更改第一行:

openssl genrsa -des3 -out server.key 1024

至:

openssl genrsa -des3 -out server.key 2048

为我修好了。

之后我收到错误:“错误的 SSL 配置:use_private_key_file:无起始行”,其原因和解决方案如下所述:解决方案(这或多或少是 @Shootfast 答案的最后一个命令的原因.)


0
投票

对于未来的读者;对于遇到连接问题的人(例如客户端意外关闭):请确保在客户端 ssl 套接字上设置主机名:

sock.set_verify_callback(ssl::host_name_verification(“host.name”));

© www.soinside.com 2019 - 2024. All rights reserved.