Qt Tech. OpenSSL通信、HTTPS通信を行うプログラムが簡単じゃない!対処方法 新しいページはコチラ

提供: yonewiki
移動: 案内, 検索
(本題)
(概要)
 
1行: 1行:
 
[[Qt#Qtテクニカルノート|Qtテクニンカルノート]]へ戻る
 
[[Qt#Qtテクニカルノート|Qtテクニンカルノート]]へ戻る
 
== '''概要''' ==
 
== '''概要''' ==
 説明書を読んでHTTP通信のプログラムを勉強しようとしたのですが、説明書が古くて、HTTP通信とかやってるんすよ。今どきはhttp://のような通信プロトコルは、あまり使わない。https://これです。暗号化ですね。通信ログっていろいろな部分で確認できるようになっていて、暗号化していないと途中に待ち構えているルーティングの中にいるサーバの主が、悪意を持ってパスワードの入力や個人情報が飛んでくるのを待っていることがあります。これを防ぐのが暗号化です。
+
 OpenSSLは数々の国々で武器輸出管理法の対象になることもあり、拠点を米国に置いていません。そして、Qtはフィンランドエスポーを拠点においていて、主要株主はフィンランドのノキアやデジアとなっています。開発の拠点はノルウェーのオスロという構造から、OpenSSLを抱き合わせる訳にはいかない技術になっています。( ゚д゚)ポカーン ソンナニスゴインダネ。でもQtだから使いやすいハズ。というわけで。
 +
 
 +
 
 +
 説明書を読んでHTTP通信のプログラムを勉強しようとしたのですが、手に出来る説明書が古くて、HTTP通信とかやってるんすよ。今どきはhttp://のような通信プロトコルは、あまり使わない。https://これです。暗号化ですね。通信ログっていろいろな部分で確認できるようになっていて、暗号化していないと途中に待ち構えているルーティングの中にいるサーバの主が、悪意を持ってパスワードの入力や個人情報が飛んでくるのを待っていることがあります。これを防ぐのが暗号化です。
  
  
114行: 117行:
  
  
 そういうことなので、Qtのリファレンスを読んでみました。[https://doc.qt.io/qt-5/windows-requirements.html]。するとやっぱり、自分でOpenSSLをセットアップしないとダメなんだそうな。ヘ(゚д゚)ノ ナンジャソリャ?
+
 そういうことなので、Qtのリファレンスを読んでみました。[https://doc.qt.io/qt-5/windows-requirements.html https://doc.qt.io/qt-5/windows-requirements.html]。するとやっぱり、自分でOpenSSLをセットアップしないとダメなんだそうな。ヘ(゚д゚)ノ ナンジャソリャ?
  
  
 上記のリンクの記事の見出し辺りを読むと、スグにオープンソースの本家[https://github.com/openssl/openssl]のWinows版([https://slproweb.com/products/Win32OpenSSL.html])を提供しているサイトに出向いて、インストールしたくなりますが、実際はQtの追加コンポーネントとして、最適なOpenSSLが入手できるとなっています。そして、Qtのコンポーネントとして導入するOpenSSLは、最も最適化されているという文献を見つけたりしたのです。
+
 上記のリンクの記事の見出し辺りを読むと、スグにオープンソースの本家[https://github.com/openssl/openssl https://github.com/openssl/openssl]のWinows版([https://slproweb.com/products/Win32OpenSSL.html https://slproweb.com/products/Win32OpenSSL.html])を提供しているサイトに出向いて、インストールしたくなりますが、実際はQtの追加コンポーネントとして、最適なOpenSSLが入手できるとなっています。そして、Qtのコンポーネントとして導入するOpenSSLは、最も最適化されているという文献を見つけたりしたのです。
  
  
129行: 132行:
  
  
 ここからが難しそうだな。
+
 ここからが難しそうだなと思ったのですが、<span style = "background:linear-gradient(transparent 75%, #ff7f7f 75%); font-weight:bold; ">開発しているプログラムの実行ファイルが配置されるディレクトリと同じディレクトリに*1_1.dllを配置すると有効になりました。</span>
  
 +
 
 +
 +
<syntaxhighlight2 lang="cpp">
 +
qDebug() << QSslSocket::supportsSsl();
 +
</syntaxhighlight2>
 +
出力結果
 +
<syntaxhighlight2 lang="cpp">
 +
true
 +
</syntaxhighlight2>
 +
 +
 +
 とくに、SSL通信をするための準備をする必要も無くQNetworkAccessManageクラスだけで通信できるようになります。
 +
 +
 +
 簡単なプログラムの流れは以下になると思います。
  
 
 
 
 
 +
 +
===''' 処理の流れ '''===
 +
<syntaxhighlight2 lang="Cpp">
 +
void CqApp::Init() //CqApp は QObject を継承したQtの機能的クラスの派生クラス(QSystemTrayIcon,QPlainTextEdit,とか
 +
                  //QNetworkAccessMangeの機能を使う以上は引数thisポインタが必要なので
 +
                  //QObjectから派生しているクラスである必要がある。
 +
{
 +
  //ここでのInitメンバ関数は初期化とかコンストラクタのような処理
 +
 +
  qNetworkAcessManager_Data = new QNetworkAccessManager(this);
 +
      //QNetworkAccessManagerクラスのオブジェクトを生成します。左辺は自分で決めていいです。任意でどうぞ。
 +
      //QNetworkAccessManager* qNetworkAcessManager_Data;のようなメンバ変数としての宣言が事前に必要です。
 +
 +
 +
  connect(qNetworkAcessManager_Data, SIGNAL(finished(QNetworkReply*)),
 +
            this, SLOT(readData(QNetworkReply*)));
 +
 +
      //こんな感じでQt独特のシグナルとスロットという考え方の関数で
 +
      //qNetworkAcessManager_Dataのfinishedという通知(引数は内部的にQNetworkRply*型)を受け取ると
 +
      //このクラスのreadDataメンバ関数を(内部的にQNetworkRply*型を引数として)呼び出すことを宣言します。
 +
      //イベント駆動のやり方です。
 +
 +
  qDebug() << QSslSocket::supportsSsl();
 +
  //SSL通信ができるか確認できる。true(=正常) or false(=ちゃんと設定出来ていない)。
 +
 +
  CqApp::request();
 +
 +
}
 +
 +
void CqApp::request()
 +
{
 +
 +
  qNetworkAcessManager_Data->get( QNetworkRequest(QUrl(QStringLiteral("https://xxx.xx/data.xml"))));
 +
      //メンバ変数を利用してget関数に指定したアドレスの内容を読み込みます。
 +
      //通信が終わったらシグナルスロットの仕組みによりthis::readData関数が呼び出されます。
 +
 +
}
 +
 +
void CqApp::readData(QNetworkReply *qNetworkReply_Reply)
 +
{
 +
  …
 +
  if(qNetworkReply_Reply->error() != QNetworkReply::NoError) {
 +
      // この区間でSSL通信エラーが発生した時の処理
 +
  }
 +
  else{
 +
      // この区間で通信成功時の処理
 +
  }
 +
 +
}
 +
</syntaxhighlight2>
 +
 
 +
 大まかな流れは、こんな感じですね。具体的なサンプルじゃなくて申し訳ない。
 +
 +
 
 +
 +
===''' 発展的な内容 '''===
 +
 dll(動的リンク)で動作するのはわかった。じゃぁ静的リンクはどうなんだ?C:\Qt\Tools\OpenSSL\Win_x86\libにlibcrypt.libとlibssl.libの二つのライブラリがありました。これで取り込まれるようにできるのかなって思った。静的リンクに変更できるか確認をしてみたいと思います。もうちょっと時間かかるかもな。管理人にとっては割かし複雑な構造をしていると感じるQt手強い。
  
 
 
 
 
  
 
[[Qt#Qtテクニカルノート|Qtテクニンカルノート]]へ戻る
 
[[Qt#Qtテクニカルノート|Qtテクニンカルノート]]へ戻る

2021年3月5日 (金) 00:00時点における最新版



個人用ツール
名前空間

変種
操作
案内
ツールボックス