1

我使用 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如果在设置选项时没有出现问题。

这里出了什么问题?

4

1 回答 1

2
  1. 确保在连接服务器时使用“ https://my.ip:80 ”。否则,浏览器将使用 HTTP 协议,mongoose 将拒绝连接,因为它需要 SSL 握手,并获取纯 HTTP 数据。我认为这就是正在发生的事情。

  2. 您正在返回MG_FALSE事件MG_AUTH,它告诉猫鼬“连接未经过身份验证,立即关闭它。”

解决方案:

  • 返回MG_TRUE事件MG_AUTH。对于其他事件,返回MG_FALSE很好。
  • 使用监听端口 443,并https://在连接到服务器时
于 2014-09-12T13:25:02.280 回答