关于c ++:运行boost asio ssl示例的异常

Exception running boost asio ssl example

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

编译:

1
2
g++ server.cpp -o server -lboost_system -lssl
g++ client.cpp -o client -lboost_system -lssl

运行像:

1
2
3
4
5
6
7
8
$ ./server
Usage: server <port>
$ ./server 10000
Exception: Invalid argument
$ ./server 1000
Exception: Permission denied
$ sudo ./server 1000
Exception: Invalid argument

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

谢谢!


好的,对于以后发现此问题的任何人,您都需要创建证书并对其进行适当的签名。
这是Linux的命令:

//生成私钥

1
openssl genrsa -des3 -out server.key 1024

//生成证书签名请求

1
openssl req -new -key server.key -out server.csr

//用私钥签名证书

1
openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt

//删除密码要求(例如,需要)

1
2
cp server.key server.key.secure
openssl rsa -in server.key.secure -out server.key

//生成dhparam文件

1
openssl dhparam -out dh512.pem 512

完成此操作后,您需要更改server.cpp和client.cpp中的文件名。

server.cpp

1
2
3
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

1
ctx.load_verify_file("server.crt");

然后,它应该一切正常!


使用strace再次执行测试,以查看哪个syscall获得EINVAL,作为奖励,您将看到失败调用的args。除非您拥有示例中正确的文件和数据,否则很可能是安全上下文设置失败的一部分:

1
2
3
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的原因。