我使用 C 语言中的 Mongoose 网络服务器 API 来实现一个小型 HTTP API。到目前为止它工作正常,但如果我想使用 SSL,服务器会拒绝请求。
为了生成 ssl 密钥和证书,我使用了以下方法:
# openssl version
OpenSSL 1.0.0-beta2 21 Apr 2009
# openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 1000 -nodes
# cat key.pem > ssl.pem; cat cert.pem >> ssl.pem
根据本手册,猫鼬希望将密钥和证书放在一个文件中。
我还设置了NS_ENABLE_SSL
编译标志以启用 mongoose 的 ssl 部分。
要初始化 mongoose,我在 C 源代码中执行以下操作:
struct mg_server *server;
server = mg_create_server(NULL, ev_handler);
printf("%s",mg_set_option(server, "document_root", "/var/www"));
printf("%s",mg_set_option(server, "listening_port", "80"));
printf("%s",mg_set_option(server, "ssl_certificate", "ssl.pem"));
我的事件处理程序现在只在控制台上记录请求:
static int ev_handler(struct mg_connection *conn, enum mg_event ev) {
switch(ev){
case MG_AUTH: printf("MG_AUTH event handler called with uri = '%s'\n", conn->uri);
break;
case MG_REQUEST:
printf("MG_REQUEST event handler called with uri = '%s'\n", conn->uri);
break;
case MG_POLL:
printf("MG_POLL event handler called with uri = '%s'\n", conn->uri);
break;
case MG_HTTP_ERROR:
printf("MG_HTTP_ERROR event handler called with uri = '%s'\n", conn->uri);
break;
default:
DBG("MG_CLOSE event handler called with uri = '%s'\n", conn->uri);
break;
}
return MG_FALSE;
}
如果我尝试从浏览器中的文档根目录打开 HTML 文件,服务器会关闭连接而不传递内容。
控制台输出:
(null)
(null)
(null)
MG_POLL event handler called with uri = '(null)'
MG_CLOSE event handler called with uri = '(null)'
前三个(null)是 mg_set_option 的返回值,NULL
如果在设置选项时没有出现问题。
这里出了什么问题?