1

C で Mongoose Web サーバー 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

このマニュアルによると、マングースはキーと証明書を 1 つのファイルに収めたいと考えています。

また、NS_ENABLE_SSLコンパイル フラグを設定して、mongoose の ssl 部分を有効にしました。

マングースを初期化するには、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最初の 3 つ (null) は、オプションの設定中に問題が発生しなかった場合の mg_set_option からの戻り値です。

ここで何がうまくいかないのですか?

4

1 に答える 1

2
  1. サーバーへの接続時に「 https://my.ip:80 」を使用していることを確認してください。そうしないと、ブラウザーは HTTP プロトコルを使用し、mongoose は SSL ハンドシェークを期待してプレーンな HTTP データを取得するため、接続を拒否します。それが起こっていることだと思います。

  2. イベントに戻りMG_FALSEMG_AUTHマングースに「接続が認証されていません。すぐに閉じてください」と伝えます。

解決:

  • イベントでMG_TRUE復帰。MG_AUTHその他のイベントは返却MG_FALSEOKです。
  • listen_port 443 を使用https://し、サーバーへの接続時に
于 2014-09-12T13:25:02.280 に答える