异常运行提升asio ssl的例子

时间:2011-06-23 10:43:16

标签: c++ linux boost ssl boost-asio

我正在尝试从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

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

谢谢!

3 个答案:

答案 0 :(得分:44)

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

然后它应该全部工作!

答案 1 :(得分:3)

使用strace再次执行测试以查看哪个系统调用获取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

答案 2 :(得分:0)

当按照 @Shootfast 的回答进行操作时,出现错误:'错误的 SSL 配置:use_certificate_chain_file:ee 密钥太小'

改变第一行:

openssl genrsa -des3 -out server.key 1024

到:

openssl genrsa -des3 -out server.key 2048

帮我修好了。

之后我得到了错误:'bad SSL configuration: use_private_key_file: no start line' 这里解释了这个原因和解决方案:solution(这或多或少是 { 的最后一个命令的原因{3}} 个答案。)