2019年4月25日木曜日


■目的

TLS1.3を最優先とし、以下優先度でサーバに対して、TLS通信を試みる。

優先1. TLS1.3
優先2. TLS1.2
優先3. TLS1.1
優先4. TLS1.0

TLS通信のコネクションが確立したTLSバージョンで、サーバと通信を行なう。
■調査結果

[調査1]
SSL_CTX_newにセットする関数は?

[結果]
TLS_client_method()をセットする。
前述の関数は、SSLv3、TLSv1、TLSv1.1、TLSv1.2、TLSv1.3を使えるようになる。

 参考サイト
https://www.openssl.org/docs/man1.1.1/man3/SSLv23_client_method.html

[調査2]
特定のTLSバージョンのみでTLS通信を試みるには?

[結果]
TLS_client_method()をそのまま使うと、SSLv3、TLSv1、TLSv1.1、TLSv1.2、TLSv1.3でTLS通信を試みる。そのため、特定のTLSバージョンのみでTLS通信を試みる場合、以下の手順で使用可能なプロトコルを制限する。

例えば、TLSv1.3のみを利用したい場合、

// TLSv1.3
long flags=SSL_OP_NO_SSLv3 | SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1 | SSL_OP_NO_TLSv1_2;
SSL_CTX *m_sslContext = SSL_CTX_new(TLS_client_method());
SSL_CTX_set_options(m_sslContext, flags);

// TLSv1.2
// long flags=SSL_OP_NO_SSLv3 | SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1;

// TLSv1.1
// long flags=SSL_OP_NO_SSLv3 | SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_2;

// TLSv1.0
// long flags=SSL_OP_NO_SSLv3 | SSL_OP_NO_TLSv1_1 | SSL_OP_NO_TLSv1_2;

参考サイト
https://www.openssl.org/docs/manmaster/man3/SSLv23_client_method.html

以下のOpenSSLの関数を用いて、SSL/TLS通信処理時にサポートするTLSのバージョンの最小バージョン、最大バージョンを指定できる。

SSL_CTX_set_min_proto_version()
SSL_CTX_set_max_proto_version()
https://www.openssl.org/docs/manmaster/man3/SSL_CTX_set_min_proto_version.html

[調査3]
調査1,2以外でTLS1.3を使うために何か特別な処理は実装する必要があるか?

[結果]
SSL/TLS通信処理に用いるOpenSSLの関数について、TLS1.3に関する記載がないかOpenSSLのmanualを調べた。

・SSL_CTX_new
TLS1.3の記載有り。TLS_method(), TLS_server_method(), TLS_client_method()を使えって書いてる。
https://www.openssl.org/docs/manmaster/man3/SSL_CTX_new.html

・SSL_CTX_set_verify
TLS1.3の記載無し。
https://www.openssl.org/docs/manmaster/man3/SSL_CTX_set_verify.html

・SSL_CTX_set_options
TLS1.3の記載有り。
https://www.openssl.org/docs/manmaster/man3/SSL_CTX_set_options.html

・SSL_new
TLS1.3の記載なし。
https://www.openssl.org/docs/manmaster/man3/SSL_new.html

・SSL_set_connect_state
TLS1.3の記載なし。
https://www.openssl.org/docs/manmaster/man3/SSL_set_connect_state.html

・SSL_set_fd
TLS1.3の記載なし。
https://www.openssl.org/docs/manmaster/man3/SSL_set_fd.html

・SSL_connect
TLS1.3の記載有り
https://www.openssl.org/docs/manmaster/man3/SSL_connect.html

■TCPとSSL/TLSの関係
[階層]
OSI階層というもので、TCPとSSL/TLSのレイヤーが違うみたい。
HTTPSの通信はTCP/IPプロトコルスイートとして、
TCPの上層にSSL/TLSがあり、
アプリケーションプロトコルのHTTPプロトコルが載って通信する。

コネクションとセッションは通信の概念として別になり、
TCPでクライアントからWebサーバに対してコネクション(経路)が確立され、
その上でセッション(ブラウザでログイン~ログアウト)があります
イメージ的には以下の感じ。

↑(高階層)

│HTTPプロトコル
│SSLハンドシェイクプロトコル
│TLSレコードプロトコル
│TCP/IP

↓(低階層)

[処理順]
1.3ウェイ・ハンドシェイクでコネクション(論理的な通信路)を確立。(TCP)
2.TLSハンドシェイクプロトコルのネゴシエーションを行なう。(SSL/TLS)
3.クライアントとサーバ間で実際のhttps通信を行なう。
https://qiita.com/Brutus/items/1015cc01d2e1eb82a526

■セッションとコネクションの違い
https://www.infraexpert.com/study/networking4.html
説明
セッション
 セッションは、通信の開始から終了までを管理する1つの単位のことです。
 例えば端末の間でセッションが確立すると、通信で使用するアプリケーションが
 データ転送可能な状態になります。OSI 7階層の第5層「セッション層」の機能です。

コネクション
 コネクションは、セッションでデータ転送を行うための論理的な回線のことです。
 一般的に、OSI 7階層の第4層「トランスポート層」のTCPコネクションを指します。


■参考サイト
・SSL/TLSについてまとめ2018
https://qiita.com/Brutus/items/1015cc01d2e1eb82a526

・【図解】TLSv1.3の仕組みとシーケンス ~QUICに向けた0-RTT, key_shareやHelloRetryRequest, NewSessionTicketとPSKの関係, コネクションとセッションの違い~
https://milestone-of-se.nesuke.com/nw-basic/tls/tls-version-1-3/

OpenSSLライブラリに詳しい
https://techblog.yahoo.co.jp/infrastructure/ssl-session-resumption/

細かすぎて伝わらないSSL/TLS
https://techblog.yahoo.co.jp/infrastructure/ssl-session-resumption/

[C言語] HTTPSクライアントを作ってみる
https://qiita.com/edo_m18/items/41770cba5c166f276a83

OpenSSLライブラリを使ってプログラミング(1)
https://lemniscus.hatenablog.com/entry/20090730/1248970407

sakura editor

sakura editorの備忘録を記載する。

--------------------------------------------------------------------------------------------
ショートカット
--------------------------------------------------------------------------------------------
■日付の挿入
Alt+;

■時刻の挿入
Alt+:

--------------------------------------------------------------------------------------------
小ネタ
--------------------------------------------------------------------------------------------
■grep実行時、初期状態からリアルタイムで表示する設定

メニューバー > 共通設定 > 検索 > Grep
「リアルタイムで表示する」チェックボックスをOnにする。

■複数のソースファイルから一斉置換する
[手順]
1.sakura editorを起動する
2.上部のメニュー>検索>grep置換を押下する
3.Grep置換Popupで諸条件を設定する
4.バックアップ作成のチェックボックスをチェックする
5.置換ボタンを押下する