質問するログイン新規登録
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

SSL

SSL(Secure Sockets Layer)とは、暗号化されたプロトコルで、インターネット上での通信セキュリティを提供しています。

WebSocket

WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

Q&A

解決済

1回答

1942閲覧

ウェブソケットサーバ(libwebsockets)でwss通信を受け付けたい(SSL証明証指定周り)

mememe

総合スコア15

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

SSL

SSL(Secure Sockets Layer)とは、暗号化されたプロトコルで、インターネット上での通信セキュリティを提供しています。

WebSocket

WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

1グッド

0クリップ

投稿2023/07/05 01:37

編集2023/07/10 05:44

1

0

実現したいこと

お世話になります。
libwebsocketsを使用しているwebsocketサーバがあります。
本websocketサーバはwsでのリクエスト受付に成功しています。
このプログラムにSSL証明証の類を指定してwssでのリクエストを受け付けれるようにしたいです。

前提

同一サーバ機内でapacheにSSL証明証の類のファイルを読み込ませています。
・公開鍵証明書
SSLCertificateFile ****.crt
・中間証明書
SSLCertificateChainFile ****..crt
・秘密鍵
SSLCertificateKeyFile ****..key

下記対応でwss通信を受信できるとの認識で合っていますでしょうか。
・上記のSSL証明証の類をwebsocketサーバに読み込ませる
・秘密鍵のパスワードをwebsocketサーバに認識させる
・websocketサーバにのポート番号を443に指定
現状中間証明書のwebsocketサーバへの読み込ませ方が分かっていない状態です。(もちろんwss通信は受信できていません)

調査したこと・試したこと

ウェブソケットサーバのws受信成功時のソースコードへ下記を変更、追加しました。
・ポート番号を443に変更
・SSL証明書のパス指定のコードを追加
・秘密鍵のパス指定のコードを追加
・秘密鍵パスワード指定のコードを追加
※下記の該当ソースコードのコメントを書いている部分の変更をしています。

クライアントからwssのリクエストをしましたが正常に通信できません。

js

1new WebSocket("wss://***.***.***.***:443");

該当のエラー

WebSocket connection to 'wss://***.***.***.***/' failed: (anonymous) @ VM56:1

該当のソースコード

C

1#include <libwebsockets.h> 2#include <string.h> 3#include <stdio.h> 4 5//#define EXAMPLE_PORT 50765 6#define EXAMPLE_PORT 443 // ポート番号を443に変更 7#define MAX_CLIENTS 100 8 9struct ClientData 10{ 11 char walletAddr[50]; 12}; 13 14static struct ClientData globalClientData[MAX_CLIENTS]; 15 16static int callback_echo(struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len) 17{ 18[省略] 19 20 return 0; 21} 22 23static struct lws_protocols protocols[] = { 24 { 25 "echo-protocol", 26 callback_echo, 27 sizeof(struct ClientData), 28 256, 29 0, 30 NULL, 31 sizeof(struct ClientData) 32 }, 33 {NULL, NULL, 0, 0, 0, NULL, 0} 34}; 35 36int main() 37{ 38 struct lws_context_creation_info info; 39 struct lws_context *context; 40 struct lws_vhost *vhost; 41 struct lws *wsi; 42 int n = 0; 43 int ret = 0; 44 45 memset(&info, 0, sizeof(info)); 46 info.port = EXAMPLE_PORT; 47 info.protocols = protocols; 48 info.ssl_cert_filepath = "****"; // SSL証明書のパス追加 49 info.ssl_private_key_filepath = "****"; // 秘密鍵のパス追加 50 info.ssl_private_key_password = "****"; // 秘密鍵パスワード追加 51 52 context = lws_create_context(&info); 53 if(context == NULL) 54 { 55 printf("Could not create libwebsocket context\n"); 56 return 1; 57 } 58 59 memset(globalClientData, 0, sizeof(globalClientData)); 60 61 printf("Starting server...\n"); 62 while(n >= 0 && ret >= 0) 63 { 64 ret = lws_service(context, 0); 65 } 66 67 lws_context_destroy(context); 68 69 return 0; 70}

補足情報(FW/ツールのバージョンなど)

その他必要な情報があればお声がけください。
よろしくお願いいたします。

SaitoAtsushi👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mememe

2023/07/08 08:20

ご指摘ありがとうございます。 本件分かりやすいように質問を修正しました。
guest

回答1

0

自己解決

自己解決しました。

50行目の次の行に下記行を追加することで正常にwssの受付が出来ました。
info.options |= LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;

投稿2023/07/15 07:14

mememe

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問