開発日記 その8に書いた「拡張の再利用」の問題に進展があったので、記録しておく。
生じた問題
SignatureSchemeに対する問題:
- TLS 1.3 クライアントが SignatureScheme に RSA PSS SHA256 を含める
- サーバは TLS 1.2 を選んでいるのに RSA PSS SHA256 を選択する
- TLS 1.3 クライアントの TLS 1.2 用の部分は RSA PSS SHA256 に対応していないのでエラーが発生
OpenSSL サーバがこのような挙動をする。
NamedGroupに対する問題:
- TLS 1.3 クライアントが NamedGroup に X25519 を含める
- サーバは TLS 1.2 を選んでいるのに X25519 を選択する
- TLS 1.3 クライアントの TLS 1.2 用の部分は X25519 に対応していないのでエラーが発生
www.google.com がこのような挙動をする。
対処
SignatureSchemeに関しては、TLS 1.3 のドラフトには以下のように書かれている。
Implementations that advertise support for RSASSA-PSS (which is mandatory in TLS 1.3), MUST be prepared to accept a signature using that scheme even when TLS 1.2 is negotiated. In TLS 1.2, RSASSA-PSS is used with RSA cipher suites.
NamedGroupに関しては、RFC 4492 bis で、X25519 と X448 が追加されている。
つまり、このオプションを独立に扱うのは筋が悪い。TLS 1.3 と TLS 1.2 の両方から、同じ拡張のコードを使うべき。
というわけで、まず Haskell tls ライブラリの master ブランチに、RSA PSS SHA256 たちと X25519 たちをサポートする pull request を出した。
TLS 1.3 ブランチは、マージされた後に rebase する(たぶん大変)。