読書会(Javaで作って学ぶ暗号技術 - RSA,AES,SHAの基礎からSSLまで)第4回議事録

[ 戻る ]


==========================================================================================
Java読書会BOF 「Javaで作って学ぶ暗号技術 - RSA,AES,SHAの基礎からSSLまで」を読む会 第4回
==========================================================================================

.. csv-table:: 開催概要

   "日時","2017年12月16日 10:00 - 17:00"
   "場所","川崎市教育文化会館 第3会議室"
   "出席者(敬称略)","高橋(智)、高橋(徹)、遠藤、芝村、吉本、常念、平山、岩室(書記)"

第6章 ミニチュアSSLをつくってみよう!
==================================================

6.1 SSLとは何か?
--------------------------------------------------

(p.167 3行目から)

- クライアント証明書は利用されているのか? ⇒ それなりに事例はある。
    - 業務システムでユーザ認証に使用。
    - クラウドのポータル画面アクセス。
    - SSLの機能を使っているわけではないが、sshの鍵管理はクライアント証明書の管理に類似。
    - (追記) e-Taxでは、マイナンバーカードのICチップに格納されたクライアント証明書を用いて署名を行っている。

- SSLのハンドシェイクは重いため、keep alive を用いず毎回繋ぎ直すと以下のような問題が生じ得る。
    - パフォーマンスに悪影響がある。
    - TIME_WAIT が溢れる。
    - ファイルディスクリプタが枯渇する。

6.2 JavaでSSL通信をやってみる
--------------------------------------------------

6.2.1 鍵や証明書の準備
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

- Unix系ならopensslがあるが、Windowsは?
    - Win32 OpenSSL がある模様。
      https://slproweb.com/products/Win32OpenSSL.html

- opensslのコマンドがわかり辛い。

- keytoolも同様。
    - KeyStore Explorer なるGUIツールがあるとのこと。
      http://keystore-explorer.org/

- p.171 「公開鍵と秘密鍵を見ることができます」
    - リストには秘密鍵しか含まれていないように見えるので、「秘密鍵を見ることができます」が正しいのでは。

- 秘密鍵から公開鍵を生成することができるのでは?
    - できる。opensshだと、「ssh-keygen -y -f 秘密鍵 > 公開鍵」で公開鍵を再生成できる。

6.2.2 通信を開始する
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

- p.173 掲載されているソースコードにいろいろ疑問点が多い ⇒ 別途配布されているサンプルコードだと内容が異なっている模様。
    - KeyStoreのインスタンスが使われていない。(インスタンス化すること自体に意味がある? ⇒ サンプルコードでは使われているので、そうではない模様)
    - キー名を渡していないが、デフォルトで決まる?

- サンプルコードをIDEに取り込むといろいろエラーが出る。
    - closeReader()、 closeWriter() メソッドが無かったり、BigIntegerをスペルミス(Iが小文字になっていた)していたり。

6.2.3 SSLハンドシェイクの中身
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

- 時刻は32bitだが、2038年問題は生じないのか?
    - 軽くぐぐった範囲では、問題があるかどうか自体が不明。
    - TSLv1.2でも32bitのままの模様。

- p.176「表6.2」はp.166に記載。

- p.178 SessionIDを取られるとSessionハイジャックされそうな気がするが大丈夫か?
    - 軽くぐぐった範囲ではよくわからず。
    - 双方共有鍵をもっているはずなので、それだけでハイジャックはされないのでは?

6.3 mini SSL の実装
--------------------------------------------------

6.3.1 miniSSL クライアントの実装
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

- 毎回 new SecureRandom() してよいか?
    - 乱数作る度ならまずいが、セッション毎なら問題ないのではないか?
    - SecureRundomはスレッドセーフか?
        - スレッドセーフなようだが、JavaDocに明記されたのはJava9以降で、記述が変わっただけなのか、コードも変わっているのかは不明。Java8以前には記載なし。(Randomクラスには以前からスレッドに関する記載がある)

- "A", "BB", "CCC" には何の意味があるのか?
    - SSLv3 のプロトコルで決まっている。(TLSではまた異なる関数になる模様)
    - 同じ値を入力しても違うハッシュ値が出るようにするためではないか?

- ソースコードでは、16進文字列とbyte[]の相互変換を行っているが、生のbyte[]を扱った方が読み易いのではないか?
    - 確かに、パディングまわりの記述で可読性が落ちているように思われる。

6.3.2 miniSSL サーバの実装
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

(以上)


[ 戻る ]