0

Qt c++ を使用して Telegram ボットを開発していますが、Webhook を設定しようとして問題が発生しています。

SSL サーバー

まず、QTcpServer と QSslSocket を使用して ssl サーバーを作成しました。これに関するいくつかの説明はQSslSocket docにあります。また、次のコマンドを使用して、Telegram doc で説明されているように、自己署名証明書を生成しました

openssl req -newkey rsa:2048 -sha256 -nodes -keyout YOURPRIVATE.key -x509 -days 365 -out YOURPUBLIC.pem -subj "/C=US/ST=New York/L=Brooklyn/O=Example Brooklyn Company/CN=YOURDOMAIN.EXAMPLE"

その結果、private.key ファイルと public.pem ファイルのペアが作成されます。そのため、接続を保護するために QSslSockets でそれらを使用しました。

その結果、接続をリッスンして受け入れることができる SSL サーバーになります。ブラウザーを使用して SSL サーバーに接続すると、自己署名証明書の使用に関する警告が表示されます (これは正常だと思います) が、サーバーには接続できます。サーバーから、ブラウザが送信したデータを読み取ることができます。だから、サーバー側はいいと思います。

setWebhook のリクエスト

setWebhook API メソッドのリクエストを実行するために、QHttpMultipartクラスを使用して MIME Multipart リクエストを作成します。API メソッドには、接続する URL と公開証明書が必要です。したがって、このコードを使用して url パラメータを生成します。

QList<QHttpPart> parameters;
QHttpPart urlPart;
urlPart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("text/plain"));
urlPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"url\""));
urlPart.setBody(_url.toLatin1());
parameters.append(urlPart);

そして、このコードは証明書パラメータを生成します:

QHttpPart filePath;
    filePath.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"certificate\""));
    QFile *file = new QFile(_filePath);
    file->open(QIODevice::ReadOnly);
    filePath.setBodyDevice(file);
    file->setParent(this);
    parameters.append(filePath);

「webhook が設定されました」というメッセージが表示され、正しい応答が返されます。しかし、Telegram が ssl サーバーに接続すると、ssl ハンドシェイクが正しく終了しません (encrypted() シグナルも sslError() シグナルも発行されません)。問題は、公開証明書をアップロードする方法だと思います。ご覧のとおり、ファイル QHttpPart については、使用する値がわからないため、コンテンツ タイプ ヘッダーを設定しません。これが問題になるかどうかはわかりません。URL に「text/plain」を使用していますが、証明書ファイルに何を使用すればよいかわかりません。

だから、何が私の問題なのかわかりません。でも、それがファイルのアップロードであるかどうかはわかりません。自己署名証明書を使用することは問題ではありません。これは、ドキュメントがこれを有効な方法として示しているためです。どんな助けでも大歓迎です。

前もって感謝します。

4

1 に答える 1