前提知識

TLSでは、 鍵交換アルゴリズムを使って共通鍵の材料となる値を交換し、共通鍵を生成し、その鍵を用いて通信が暗号化されるわけですね。 鍵共有に使われる暗号を、公開鍵暗号と言いますね。共通鍵は、共通鍵暗号です。

公開鍵暗号

  1. RSA
  2. DH
  3. ECDH
  4. DEH = DH ephemeral
  5. ECDHE = ECDH epemeral

DHとECDHは離散対数問題を使っています g^x mod p = y で、y,p,gが与えられたとき、xが求められないってことね

共通鍵暗号

  1. RC4 (危殆化)
  2. DES = (危殆化)
  3. 3DES きたいか
  4. ChaCha20
  5. AES = 最も使われていて安全

RC4 = ストリーム暗号 AES = ブロック暗号

ハッシュ関数

  1. MD5
  2. SHA-1
  3. SHA-2
  4. SHA-3

TLSの暗号スイートについて

はい、これすごく大事なこと言います。TLSを使って通信が暗号化されるまでの流れですね。

  1. TLSハンドシェイク
  2. 実際にTLSの通信が始まる

でですよ。TLSハンドシェイクで何を決めているか?なんですが、以下を決めているわけですね。

  1. 鍵交換アルゴリズム
  2. 署名アルゴリズム
  3. 暗号アルゴリズム
  4. 暗号利用モード
  5. ハッシュ関数

鍵交換アルゴリズムは上に書いた、RSA,ECDHE,DHEです。 署名アルゴリズムは、RSA/ECDHEを指定できますが、ここは、発行したサーバ証明書の鍵の種類に依存します。ここすごく大事。

実は、鍵交換アルゴリズムで生成されたあたいは、さらにサーバ証明書の秘密鍵で暗号化され、公開鍵で復号されるんですね。で、真正性を確かめるんですよね。 ここ、知らんかった。すごく大事。

ただ覚えておきたいのが、RSAを用いた鍵交換では、署名がなされないということ。証明書の公開鍵は、クライアントが生成したプリマスターシークレットを暗号化するために使われる。そして、秘密鍵で復号するんだよね。 ECDHEでは、毎回公開鍵が生成されるんだよね。で、その公開鍵の正当性を証明するために秘密鍵で署名し、公開鍵で検証するんだよね。 RSAを用いた鍵交換では毎回同じ公開鍵と秘密鍵のペアで通信がなされるんだよね。プリマスターシクレットも含めてね。 だから、スノーデン事件の時みたいに、暗号化されたものをずっと溜めておいて、後でどうにか秘密鍵を入手して、プリマスターシクレットを特定、 からの通信内容を特定、といったことができてしまうんだよね。これ、前方特秘性がないって言いますね。

これに対して、ECDHE、DHEは、一回一回秘密鍵と公開鍵を生成するんだよね。はいそうだね。 でも、公開鍵から秘密鍵は、頑張れば何年かかければ、推測可能だよね?だから前方特秘性は、ないと思うんだけど。

これをchatGPTに聞いてみたらこう帰ってきました。

Q. 離散対数問題は時間をかければ解読可能です。各セッションで使われる公開鍵から秘密鍵を割り出すことも、原理上は可能です。 そこで、各セッションの公開鍵と、暗号化された通信全てを保存している人がいたとしましょう。そうすると、時間さえかければ、暗号文を解読できると思うのですがいかがでしょう。

A. あなたの指摘は、理論的には正しいです。離散対数問題は計算的に困難であるとされていますが、これは「現実的いな時間ん愛で解くのが難しい」という意味です。つまり、十分な計算資源と時間があれば理論的には解くことが可能です。しかし、いくつかの要因がこの門ん台を現実的には解決困難にしています。

  1. 計算資源の制約 現在のコンピュータ技術では、十分に大きな素数(2048bit以上)を使った離散対数問題を解くには膨大な計算資源が必要です。これは、非常に強力なコンピュータやスーパーコンピュータが必要で、現実的には非常に困難です。
  2. 時間の制約 仮に、計算資源が無制限であっっても、解くのに必要な時間が非常に長くなるため、実用的ではありません。多くの暗号プロトコルは、解読にかかる時間が実用的な範囲を超えるように設計されています。
  3. 前方特秘性の効果 ECDHEやDHEを使用することで、各セッションで異なる一時的な鍵が生成されます。これにより、仮にあるセッションの鍵が怪ドックされたとしても、他のセッションには影響を与えません。したがって、攻撃者が全てのセッションを解読するには、各セッションごとに個別の離散たい対数問題を解く必要があります。

ということなので、1,2は別にRSA暗号でも同じことだね。なので、結局、前方特秘性の効果は、一つの秘密鍵が漏れたとしても、全ての通信が破られるわけではない。ということ。セッションと秘密鍵、公開鍵が一対一に対応しているので、仮に秘密鍵が漏れても影響が部分的になること、という話ですね。完全理解です。

逆に、RSA暗号を使った鍵交換では、秘密鍵を使い回すので、秘密鍵が漏洩すると、その秘密鍵を使った過去の通信すべてが解読可能になってしまう。スノーデン事件みたいなことが起こるわけですわね。

話を暗号スイートに戻しますね。

暗号アルゴリズムが、共通鍵の話ですね。AESが使われることが一般的です。 暗号利用モードは、これも結構大事な概念ですね。

openssl ciphersでopensslで使える暗号化一覧が見られる。

TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES256-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES128-SHA:RSA-PSK-AES256-GCM-SHA384:DHE-PSK-AES256-GCM-SHA384:RSA-PSK-CHACHA20-POLY1305:DHE-PSK-CHACHA20-POLY1305:ECDHE-PSK-CHACHA20-POLY1305:AES256-GCM-SHA384:PSK-AES256-GCM-SHA384:PSK-CHACHA20-POLY1305:RSA-PSK-AES128-GCM-SHA256:DHE-PSK-AES128-GCM-SHA256:AES128-GCM-SHA256:PSK-AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:ECDHE-PSK-AES256-CBC-SHA384:ECDHE-PSK-AES256-CBC-SHA:SRP-RSA-AES-256-CBC-SHA:SRP-AES-256-CBC-SHA:RSA-PSK-AES256-CBC-SHA384:DHE-PSK-AES256-CBC-SHA384:RSA-PSK-AES256-CBC-SHA:DHE-PSK-AES256-CBC-SHA:AES256-SHA:PSK-AES256-CBC-SHA384:PSK-AES256-CBC-SHA:ECDHE-PSK-AES128-CBC-SHA256:ECDHE-PSK-AES128-CBC-SHA:SRP-RSA-AES-128-CBC-SHA:SRP-AES-128-CBC-SHA:RSA-PSK-AES128-CBC-SHA256:DHE-PSK-AES128-CBC-SHA256:RSA-PSK-AES128-CBC-SHA:DHE-PSK-AES128-CBC-SHA:AES128-SHA:PSK-AES128-CBC-SHA256:PSK-AES128-CBC-SHA

これがなにを表しているかを教えましょう。 例えば、

ECDHE-RSA-AES128-GCM-SHA256

まず前提として、サーバ証明書にはRSA暗号の公開鍵がおいてある、ということ。 そして、ECDHEは、クライアントとサーバでそれぞれ値を公開して計算すると共通鍵が得られる、という話でした。 では、RSA暗号がどこで使われるのか?という話ですが、 「サーバは一時的なECDHE公開鍵を生成し、それに対して自分のRSA秘密鍵で署名を行います」 ということですね。一時的なECDHE公開鍵というのは、共通鍵を作るための材料だと思ってください。 で、その材料から、共通鍵であるAESを生成するわけですね。AESはブロック暗号です。そして?GCMは、

次はこれです。

ECDHE-ECDSA-AES256-GCM-SHA384

これは、ECDHEで一時的な公開鍵が生成され、前方特日性が提供される。 そして、一時的に生成された公開鍵をECDSAで署名することで、セキュアな鍵交換が行われます。 じつはこれ、サーバ証明書がECDSA公開鍵を持っている必要があります。なるほどね。 持っている公開鍵によっても変わってくるってことよ。

RSAとECDSAでは後者の方が性能がいいからね。ここはパフォーマンスチューニングできるところかもしれないね。

TLS1.2ではRSAで鍵交換することもあったのです。

TLS_RSA_WITH_AES_256_GCM_SHA384
TLS_RSA_WITH_AES_128_GCM_SHA256
TLS_RSA_WITH_AES_256_CBC_SHA
TLS_RSA_WITH_AES_128_CBC_SHA
TLS_RSA_WITH_3DES_EDE_CBC_SHA

しかし、openssl1.1.1以降は、RSAを使った鍵交換は無くなりました。

でもよく見ると、これもありますね。

RSA-PSK-AES128-GCM-SHA256

鍵交換から、実際に暗号通信が始まるまでの流れ

  1. TLSハンドシェイク

  2. 実際に通信が始まる わけですが、1について、もう少し詳しく説明していきます。

  3. クライアントからサーバに、ClientHelloがいく ここでは、利用できる暗号スイートを提示するわけですね。

  4. サーバーからクライアントに、serverHelloがいく ここで、どの暗号スイートを使うか、決めるわけですね。

ここからRSAを用いた鍵交換とそれ以外で変わってくるわけですね。

RSA

  1. 鍵交換 (RSA) RSAを用いて鍵交換をする場合は、この時点でクライアントがサーバの公開鍵(証明書)を使ってプリマスターシークレットを暗号化、で、サーバに送ります。

  2. 共通鍵の生成 クライアントとサーバは、プリマスターシクレットを共有できました。 このプリマスターシクレットを使って、マスターシークレットが生成されます。このときPRFが使われます。 さらに、マスターシクレットから、共通鍵の生成には、PRF (Pseudo Random Function) が使われます。 AESなどが使われます。

ECDHE

  1. 鍵交換 (ECDHEやDHE) サーバとクライアントは、それぞれで秘密鍵と公開鍵を生成します。公開鍵を相手に渡します。

  2. 公開鍵(その他のパラメータも含む)への署名 ここで、サーバ証明書を使って、公開鍵へ署名するわけですね。ここでサーバ証明書が使われるわけです。面白い。すごく面白い。 で、相手の存在を確認できたら、プリマスターシクレットが交換されているわけですね。 そこから先は、おんなじです。プリマスターシクレットからマスターシークレットを生成して、共通鍵を生成します。 以上です。

—- ここまで、公開鍵暗号を完全に理解した —-

mTLSについて

mTLSについて、わからんですわね。名前は聞いたことあるんですけどね。

nginxのお話

nginxでも使える暗号スイートを指定できるんですね。ssl_cipersディレクティブでね。

ssl_cipers ECDHE-RSA-AES128-GCM-SHA256:hogehoge:hogehoge

みたいな感じでね。んでね、 ssl_cipersに書く順番は、適応される順番、つまり優先度を表す。 たとえば、クライアントがTLSハンドシェイクで使える暗号スイートを提示してきたとき、マッチするものが複数ある場合は、上から使うようになっている。 しかし、ここで気をつけないといけないのは、

ssl_prefer_server_cipers on

を入れることだね。これを入れないとダメっす。

nginxで最速の暗号スイート

cloud flareでおすすめされている暗号化スイートですが、

["ECDHE-ECDSA-AES128-GCM-SHA256", "ECDHE-ECDSA-CHACHA20-POLY1305", "ECDHE-RSA-AES128-GCM-SHA256", "ECDHE-RSA-CHACHA20-POLY1305", "ECDHE-ECDSA-AES256-GCM-SHA384", "ECDHE-RSA-AES256-GCM-SHA384"]

で見ている感じ、やっぱりRSAよりECDSAの方が早いみたいですね。

命令セットによっても速度変わってくるみたいで、例えばintelではopensslを高速化するための命令が入っているみたいですね。 自分のマシンで、opensslの書くアルゴリズムの速度を測定するには、以下のコマンドを叩きましょう

openssl speed

結果がこちらですね

OpenSSL 1.1.1f  31 Mar 2020
built on: Tue Jul 30 16:36:54 2024 UTC
options:bn(64,64) rc4(16x,int) des(int) aes(partial) blowfish(ptr) 
compiler: gcc -fPIC -pthread -m64 -Wa,--noexecstack -Wall -Wa,--noexecstack -g -O2 -fdebug-prefix-map=/build/openssl-lxGbY1/openssl-1.1.1f=. -fstack-protector-strong -Wformat -Werror=format-security -DOPENSSL_TLS_SECURITY_LEVEL=2 -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC -DOPENSSL_CPUID_OBJ -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DKECCAK1600_ASM -DRC4_ASM -DMD5_ASM -DAESNI_ASM -DVPAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DX25519_ASM -DPOLY1305_ASM -DNDEBUG -Wdate-time -D_FORTIFY_SOURCE=2
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes  16384 bytes
md2                  0.00         0.00         0.00         0.00         0.00         0.00 
mdc2                 0.00         0.00         0.00         0.00         0.00         0.00 
md4             116129.49k   354112.32k   816006.91k  1219016.70k  1416904.70k  1439498.24k
md5             162132.15k   367120.81k   641528.15k   792616.75k   846902.61k   850591.74k
hmac(md5)        68729.23k   207016.51k   479238.23k   691244.37k   830324.74k   843879.77k
sha1            185103.12k   430425.17k   833822.72k  1096286.55k  1209862.83k  1218734.76k
rmd160           58183.05k   137318.55k   249643.52k   309193.73k   338045.61k   341828.32k
rc4             826542.07k   862292.65k   708667.31k   674752.17k   664160.94k   662847.49k
des cbc          94001.91k    96677.48k    97341.53k    97560.92k    97654.10k    97643.18k
des ede3         36579.34k    36980.69k    37068.97k    37081.77k    37115.22k    37115.22k
idea cbc             0.00         0.00         0.00         0.00         0.00         0.00 
seed cbc        115900.26k   119858.54k   121019.22k   121255.94k   121391.79k   121350.83k
rc2 cbc          64480.87k    65677.08k    66106.20k    66185.22k    66196.82k    66229.59k
rc5-32/12 cbc        0.00         0.00         0.00         0.00         0.00         0.00 
blowfish cbc    161046.31k   172144.70k   175203.50k   175904.09k   176160.77k   176689.66k
cast cbc        148286.79k   159644.12k   162712.92k   163485.35k   163698.01k   163698.01k
aes-128 cbc     284399.06k   296815.42k   297800.28k   299718.66k   300528.98k   302123.15k
aes-192 cbc     247041.75k   256280.83k   256838.40k   258574.34k   258908.16k   258916.35k
aes-256 cbc     219349.67k   224339.46k   225086.55k   226124.12k   226749.10k   226945.71k
camellia-128 cbc   143085.78k   217348.97k   246241.11k   254408.02k   257329.83k   257245.18k
camellia-192 cbc   123841.18k   168729.39k   184740.95k   190165.67k   191703.72k   191610.88k
camellia-256 cbc   123763.95k   168707.09k   184877.57k   190126.08k   191758.34k   191676.42k
sha256          101813.68k   222879.81k   408848.73k   511186.94k   550595.24k   552594.09k
sha512           68205.94k   272634.84k   466259.80k   697115.31k   817517.91k   827757.91k
whirlpool        48344.53k   103060.14k   172338.86k   206503.94k   219531.95k   220616.02k
aes-128 ige     268799.65k   291588.80k   297284.44k   299335.34k   299756.20k   298762.24k
aes-192 ige     234034.87k   250889.15k   255072.60k   256491.18k   256797.35k   256562.52k
aes-256 ige     207278.42k   220514.01k   223803.39k   224845.82k   225047.89k   224761.17k
ghash          1734721.93k  6699872.87k 10365307.90k 11463595.35k 11866690.10k 11843633.15k
rand             16129.97k    61088.32k   203126.35k   458513.41k   764544.52k   799957.05k
                  sign    verify    sign/s verify/s
rsa  512 bits 0.000033s 0.000002s  30480.0 512383.2
rsa 1024 bits 0.000070s 0.000005s  14210.6 217307.5
rsa 2048 bits 0.000470s 0.000014s   2126.5  71609.7
rsa 3072 bits 0.001421s 0.000029s    703.6  34630.7
rsa 4096 bits 0.003185s 0.000049s    314.0  20267.7
rsa 7680 bits 0.029412s 0.000165s     34.0   6043.4
rsa 15360 bits 0.148971s 0.000638s      6.7   1566.3
                  sign    verify    sign/s verify/s
dsa  512 bits 0.000047s 0.000030s  21284.0  33131.1
dsa 1024 bits 0.000081s 0.000065s  12385.9  15452.9
dsa 2048 bits 0.000211s 0.000171s   4748.9   5853.5
                              sign    verify    sign/s verify/s
 160 bits ecdsa (secp160r1)   0.0002s   0.0002s   6049.2   6659.2
 192 bits ecdsa (nistp192)   0.0002s   0.0002s   4927.2   5629.9
 224 bits ecdsa (nistp224)   0.0000s   0.0001s  23855.1  10628.0
 256 bits ecdsa (nistp256)   0.0000s   0.0001s  55055.1  18378.7
 384 bits ecdsa (nistp384)   0.0008s   0.0006s   1249.0   1650.1
 521 bits ecdsa (nistp521)   0.0002s   0.0005s   4180.4   2113.1
 163 bits ecdsa (nistk163)   0.0002s   0.0004s   5367.6   2686.4
 233 bits ecdsa (nistk233)   0.0003s   0.0005s   3892.3   1957.8
 283 bits ecdsa (nistk283)   0.0004s   0.0009s   2277.7   1155.6
 409 bits ecdsa (nistk409)   0.0007s   0.0014s   1357.0    690.2
 571 bits ecdsa (nistk571)   0.0016s   0.0032s    611.3    311.0
 163 bits ecdsa (nistb163)   0.0002s   0.0004s   5148.9   2573.2
 233 bits ecdsa (nistb233)   0.0003s   0.0005s   3775.9   1893.6
 283 bits ecdsa (nistb283)   0.0005s   0.0009s   2172.4   1100.7
 409 bits ecdsa (nistb409)   0.0008s   0.0015s   1287.9    654.0
 571 bits ecdsa (nistb571)   0.0018s   0.0034s    570.8    291.7
 256 bits ecdsa (brainpoolP256r1)   0.0003s   0.0003s   3014.7   3407.0
 256 bits ecdsa (brainpoolP256t1)   0.0003s   0.0003s   3012.0   3564.7
 384 bits ecdsa (brainpoolP384r1)   0.0008s   0.0006s   1252.3   1569.6
 384 bits ecdsa (brainpoolP384t1)   0.0008s   0.0006s   1262.7   1686.9
 512 bits ecdsa (brainpoolP512r1)   0.0012s   0.0009s    868.6   1128.6
 512 bits ecdsa (brainpoolP512t1)   0.0011s   0.0008s    881.5   1205.4
                              op      op/s
 160 bits ecdh (secp160r1)   0.0002s   6303.4
 192 bits ecdh (nistp192)   0.0002s   5189.1
 224 bits ecdh (nistp224)   0.0001s  17171.2
 256 bits ecdh (nistp256)   0.0000s  24809.6
 384 bits ecdh (nistp384)   0.0008s   1311.0
 521 bits ecdh (nistp521)   0.0003s   3571.7
 163 bits ecdh (nistk163)   0.0002s   5593.4
 233 bits ecdh (nistk233)   0.0002s   4091.1
 283 bits ecdh (nistk283)   0.0004s   2398.0
 409 bits ecdh (nistk409)   0.0007s   1442.6
 571 bits ecdh (nistk571)   0.0016s    644.6
 163 bits ecdh (nistb163)   0.0002s   5361.5
 233 bits ecdh (nistb233)   0.0003s   3958.1
 283 bits ecdh (nistb283)   0.0004s   2275.9
 409 bits ecdh (nistb409)   0.0007s   1366.4
 571 bits ecdh (nistb571)   0.0017s    604.4
 256 bits ecdh (brainpoolP256r1)   0.0003s   3162.1
 256 bits ecdh (brainpoolP256t1)   0.0003s   3155.1
 384 bits ecdh (brainpoolP384r1)   0.0008s   1301.1
 384 bits ecdh (brainpoolP384t1)   0.0008s   1323.9
 512 bits ecdh (brainpoolP512r1)   0.0011s    898.9
 512 bits ecdh (brainpoolP512t1)   0.0011s    911.4
 253 bits ecdh (X25519)   0.0000s  36489.1
 448 bits ecdh (X448)   0.0004s   2426.8
                              sign    verify    sign/s verify/s
 253 bits EdDSA (Ed25519)   0.0000s   0.0001s  29309.4  10714.2
 456 bits EdDSA (Ed448)   0.0003s   0.0005s   3953.6   2205.1

ってことでね、

暗号スイート意外に気にしないといけないこと

OCSP stapling
Session resumption (tickets)
Session resumption (caching)
False Start (NPN needed)
HTTP/2

# 参考になる記事 yahooのsslのはなし

opensslを使って実際にサーバの証明書などをみてくる

証明書チェーンの取得方法

openssl s_client -connect blog.ingenboy.com:443 -showcerts

結果

openssl s_client -connect blog.ingenboy.com:443 -showcerts
CONNECTED(00000003)
depth=2 C = US, O = Internet Security Research Group, CN = ISRG Root X1
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = E6
verify return:1
depth=0 CN = blog.ingenboy.com
verify return:1
---
Certificate chain
 0 s:CN = blog.ingenboy.com
   i:C = US, O = Let's Encrypt, CN = E6
   a:PKEY: id-ecPublicKey, 256 (bit); sigalg: ecdsa-with-SHA384
   v:NotBefore: Sep 17 06:55:36 2024 GMT; NotAfter: Dec 16 06:55:35 2024 GMT
-----BEGIN CERTIFICATE-----
MIIDgzCCAwmgAwIBAgISBO2zWoks7TKkAN3OVtkSxBjbMAoGCCqGSM49BAMDMDIx
CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF
NjAeFw0yNDA5MTcwNjU1MzZaFw0yNDEyMTYwNjU1MzVaMBwxGjAYBgNVBAMTEWJs
b2cuaW5nZW5ib3kuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEYVnAV5ke
Gl7kJRmvAHm9mYwU35SdJXN5AF5mQZ46EdVAUqgKWhdLMdc8x7j7SVxBBzfnPEXI
db1HdUFqD7aPW6OCAhMwggIPMA4GA1UdDwEB/wQEAwIHgDAdBgNVHSUEFjAUBggr
BgEFBQcDAQYIKwYBBQUHAwIwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUM7dYklVE
sLo0tI0ErI4dg0KfIW0wHwYDVR0jBBgwFoAUkydGmAOpUWiOmNbEQkjbI79YlNIw
VQYIKwYBBQUHAQEESTBHMCEGCCsGAQUFBzABhhVodHRwOi8vZTYuby5sZW5jci5v
cmcwIgYIKwYBBQUHMAKGFmh0dHA6Ly9lNi5pLmxlbmNyLm9yZy8wHAYDVR0RBBUw
E4IRYmxvZy5pbmdlbmJveS5jb20wEwYDVR0gBAwwCjAIBgZngQwBAgEwggEEBgor
BgEEAdZ5AgQCBIH1BIHyAPAAdwDf4VbrqgWvtZwPhnGNqMAyTq5W2W6n9aVqAdHB
O75SXAAAAZH++XSRAAAEAwBIMEYCIQDr/Yv2U1FfnFfmADtT4nI7EOWJRTQ8zvmJ
O8HHn0SIogIhAKMZJ64xlCcwEVjrFGpjcd54+H9yGiUhsesiJmjbEIfDAHUA7s3Q
ZNXbGs7FXLedtM0TojKHRny87N7DUUhZRnEftZsAAAGR/vl0mgAABAMARjBEAiA+
FBy5NL5BcKZdUanzHmKLTYBoQjALxTj1Vg+L/0Av9wIgL5moUHT0tFVMt3eaok2f
aSyXMnXm3spOZdPse7M5YcMwCgYIKoZIzj0EAwMDaAAwZQIwZUC5APO9wc1hDdKK
ixcpZTBCIJiXUIVy9QdoJUD90/XrPw5fOfQyJ4/2aM7aXYCBAjEAxpv/cHCRmGNO
V4iJu/LJ1ogXy/A5fSxuEFcHvqEU7QQ5QkSe8SY06S87vaXsnHpC
-----END CERTIFICATE-----
 1 s:C = US, O = Let's Encrypt, CN = E6
   i:C = US, O = Internet Security Research Group, CN = ISRG Root X1
   a:PKEY: id-ecPublicKey, 384 (bit); sigalg: RSA-SHA256
   v:NotBefore: Mar 13 00:00:00 2024 GMT; NotAfter: Mar 12 23:59:59 2027 GMT
-----BEGIN CERTIFICATE-----
MIIEVzCCAj+gAwIBAgIRALBXPpFzlydw27SHyzpFKzgwDQYJKoZIhvcNAQELBQAw
TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjQwMzEzMDAwMDAw
WhcNMjcwMzEyMjM1OTU5WjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg
RW5jcnlwdDELMAkGA1UEAxMCRTYwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATZ8Z5G
h/ghcWCoJuuj+rnq2h25EqfUJtlRFLFhfHWWvyILOR/VvtEKRqotPEoJhC6+QJVV
6RlAN2Z17TJOdwRJ+HB7wxjnzvdxEP6sdNgA1O1tHHMWMxCcOrLqbGL0vbijgfgw
gfUwDgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcD
ATASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBSTJ0aYA6lRaI6Y1sRCSNsj
v1iU0jAfBgNVHSMEGDAWgBR5tFnme7bl5AFzgAiIyBpY9umbbjAyBggrBgEFBQcB
AQQmMCQwIgYIKwYBBQUHMAKGFmh0dHA6Ly94MS5pLmxlbmNyLm9yZy8wEwYDVR0g
BAwwCjAIBgZngQwBAgEwJwYDVR0fBCAwHjAcoBqgGIYWaHR0cDovL3gxLmMubGVu
Y3Iub3JnLzANBgkqhkiG9w0BAQsFAAOCAgEAfYt7SiA1sgWGCIpunk46r4AExIRc
MxkKgUhNlrrv1B21hOaXN/5miE+LOTbrcmU/M9yvC6MVY730GNFoL8IhJ8j8vrOL
pMY22OP6baS1k9YMrtDTlwJHoGby04ThTUeBDksS9RiuHvicZqBedQdIF65pZuhp
eDcGBcLiYasQr/EO5gxxtLyTmgsHSOVSBcFOn9lgv7LECPq9i7mfH3mpxgrRKSxH
pOoZ0KXMcB+hHuvlklHntvcI0mMMQ0mhYj6qtMFStkF1RpCG3IPdIwpVCQqu8GV7
s8ubknRzs+3C/Bm19RFOoiPpDkwvyNfvmQ14XkyqqKK5oZ8zhD32kFRQkxa8uZSu
h4aTImFxknu39waBxIRXE4jKxlAmQc4QjFZoq1KmQqQg0J/1JF8RlFvJas1VcjLv
YlvUB2t6npO6oQjB3l+PNf0DpQH7iUx3Wz5AjQCi6L25FjyE06q6BZ/QlmtYdl/8
ZYao4SRqPEs/6cAiF+Qf5zg2UkaWtDphl1LKMuTNLotvsX99HP69V2faNyegodQ0
LyTApr/vT01YPE46vNsDLgK+4cL6TrzC/a4WcmF5SRJ938zrv/duJHLXQIku5v0+
EwOy59Hdm0PT/Er/84dDV0CSjdR/2XuZM3kpysSKLgD1cKiDA+IRguODCxfO9cyY
Ig46v9mFmBvyH04=
-----END CERTIFICATE-----
---
Server certificate
subject=CN = blog.ingenboy.com
issuer=C = US, O = Let's Encrypt, CN = E6
---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: ECDSA
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 2398 bytes and written 399 bytes
Verification: OK
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 256 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---
---
Post-Handshake New Session Ticket arrived:
SSL-Session:
    Protocol  : TLSv1.3
    Cipher    : TLS_AES_256_GCM_SHA384
    Session-ID: 91E923B97DC125751DBF34B42AF92DBFFFE377BAE8B7E5CA4558AFBB69C0D0A3
    Session-ID-ctx: 
    Resumption PSK: 4C90C46829E58BB60E9E5E291F9FA49ABB736B48FB2FBC243EF96A208A43F1CEA54739EB6877BF97811207BB7F042DAB
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 300 (seconds)
    TLS session ticket:
    0000 - 7f 2a 61 68 9a d6 ca 93-4b 7a e3 53 5f a0 c4 51   .*ah....Kz.S_..Q
    0010 - d6 14 ff f2 3e a1 b9 b1-82 93 7c 4e 87 44 92 22   ....>.....|N.D."
    0020 - 32 59 8f 15 10 8d db 0b-31 d3 a7 d8 41 6b f0 ea   2Y......1...Ak..
    0030 - 9f 92 a9 d9 67 6c 46 b4-4a 02 b3 e9 f4 62 c4 53   ....glF.J....b.S
    0040 - 34 f5 be 5e c1 85 3a c0-92 b3 7c 96 09 4b d4 e2   4..^..:...|..K..
    0050 - 8d 13 37 75 db ff aa 19-c4 a2 88 66 74 2c b6 f1   ..7u.......ft,..
    0060 - 8b 57 55 69 c8 7e 7f 71-84 8d 9a 50 16 07 08 11   .WUi.~.q...P....
    0070 - c1 ff 5d b4 4e 4c a9 b6-2b 15 93 73 99 9e a4 64   ..].NL..+..s...d
    0080 - 8e 15 c9 1f 75 e5 30 47-f7 ee d7 d7 07 86 79 94   ....u.0G......y.
    0090 - a5 9d 46 2a d6 1f aa ba-72 63 97 3b 86 df f8 22   ..F*....rc.;..."
    00a0 - 74 b7 43 81 f3 df bc 9b-87 24 95 1c 83 de 23 ca   t.C......$....#.
    00b0 - 2e cb 26 df 48 5b 46 03-36 4f f9 ab 3c fb f3 e3   ..&.H[F.6O..<...
    00c0 - ba 51 73 03 3f e4 26 3c-ca 3d 57 83 16 7e ca 47   .Qs.?.&<.=W..~.G
    00d0 - ce 1d e0 c9 62 0b 13 42-41 64 8e eb a2 52 97 97   ....b..BAd...R..
    00e0 - 10 54 ec e6 a8 5c 95 54-9b ef b9 a3 88 91 24 3a   .T...\.T......$:

    Start Time: 1729580884
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
    Extended master secret: no
    Max Early Data: 0
---
read R BLOCK
---
Post-Handshake New Session Ticket arrived:
SSL-Session:
    Protocol  : TLSv1.3
    Cipher    : TLS_AES_256_GCM_SHA384
    Session-ID: D1EB0D9FECC3113502EF3C1FC9E91D5AF715E817649EEBC767028DD4D45FF92A
    Session-ID-ctx: 
    Resumption PSK: C1D0090E2F6433CE349BD9A3CA6ECF1A25335965ABF56012A7EB48187FB34161D3F38BCE1185BB016430A72270C116D9
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 300 (seconds)
    TLS session ticket:
    0000 - 7f 2a 61 68 9a d6 ca 93-4b 7a e3 53 5f a0 c4 51   .*ah....Kz.S_..Q
    0010 - 0f 1d 85 40 d4 e3 ff cc-42 73 05 82 be f9 9c 49   ...@....Bs.....I
    0020 - 47 2f 99 23 19 1d 4d 37-99 28 ea 84 fc 6c 2f 03   G/.#..M7.(...l/.
    0030 - cd fb 1d c3 c1 1d fa 6c-b2 df fb fd 11 98 ec 9d   .......l........
    0040 - 19 cb 3a 43 da f7 b5 d6-21 16 a8 a2 84 f9 8a 7a   ..:C....!......z
    0050 - 24 77 a8 36 ba 0e 7c 56-0e 37 e3 f9 de a0 8d 92   $w.6..|V.7......
    0060 - 7a 85 3e 77 34 75 3f 9e-46 c7 24 21 ea d3 65 58   z.>w4u?.F.$!..eX
    0070 - ac 34 a2 c8 54 a0 4c ce-59 2e b3 5a 7a a9 61 a1   .4..T.L.Y..Zz.a.
    0080 - 8d 60 80 86 a9 f5 b6 37-c0 a0 a8 ec 86 04 a4 68   .`.....7.......h
    0090 - d4 75 f5 ed 01 d2 4a bc-5f 10 6d 6d 07 5f d3 b5   .u....J._.mm._..
    00a0 - a5 dc 15 ed 8c 42 9e 08-64 ce c2 f7 ac 27 55 16   .....B..d....'U.
    00b0 - ae 9f c3 0f 53 00 c5 38-7d a8 10 6d 17 92 71 87   ....S..8}..m..q.
    00c0 - 11 6e ba d6 ec 15 94 40-6d c0 bf 05 f1 d4 34 c4   .n.....@m.....4.
    00d0 - 9c cf 17 e6 f3 07 b5 a7-2d 1a f3 bc 7a a8 be 14   ........-...z...
    00e0 - 60 e4 64 6f 46 59 71 00-e6 1e d5 1f 61 ec 17 94   `.doFYq.....a...

    Start Time: 1729580884
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
    Extended master secret: no
    Max Early Data: 0
---

ルート証明書は送られないみたいですが、これは一般手らしい。 ルート証明書は、OSやブラウザにあらかじめインストールされているらいし。 毎回送らずに済むから、データ量が削減できるらしい。

クライアント側から、利用可能なcipher (暗号スイート)を通知する方法

openssl s_client -connect 183.79.48.248:443 -servername auctions.yahoo.co.jp -cipher `AES256-SHA`

ちなみにこれは、RSAを使ってプリマスターシークレットを交換する方法になりますね。公開鍵を使って暗号化して、秘密鍵でオープンする感じです。 前方特日性はないです。マジで危ないです、これ。

クライアント側から、複数の暗号スイートを提示することもできる

openssl s_client -connect 183.79.48.248:443 -servername auctions.yahoo.co.jp -cipher `RC4-SHA,AES256-SHA,ECDHE-RSA-AES256-GCM-SHA384`

その中でどの暗号スイートを使うかは、サーバ側が指定してくるって話ですね。

以下、ゴミ

HTTPのレスポンスヘッダが満たすべき要件について

  1. 攻撃の参考になるような情報はセキュリティヘッダから落とす
  • ソフトウェアのバージョンなど
  1. クリックジャッキング攻撃への対応
  • x-frame-optionsをつける
  1. クロスサイトスクリプティング攻撃の防止
  • x-content-type-optioins “nosniff"をつける

TLSの要件について

  • Crime攻撃に対策するための、TLSでの圧縮は無効化しなければいけない

疑問

hpkpヘッダーの役割 htstヘッダの役割

豆知識