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
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿