クライアント証明書を中継するClient-Certヘッダの提案仕様

Client-Cert HTTP Header」という提案仕様が、IETF HTTP WGのWGアイテムとして採用されそうなので、予習しておきます。

背景

f:id:ASnoKaze:20210518014202p:plain

TLSレイヤでクライアントの証明書を用いてクライアントを認証することができます。この、クライアント認証はもちろんTLSレイヤで行われます。

一方で、Webサービスを提供するとき、ロードバランサでTLSを終端することはよくあります。このとき、クライアント証明書に基づくアクセス制御を、ロードバランサではなくバックエンドのサーバで行いたい場合があります。そのためには、ロードバランサからバックエンドにクライアント証明書の情報を伝達する必要があります。その方法を標準化するのが「Client-Cert HTTP Header」という提案仕様です。

一つのユースケースとしては「RFC 8705 OAuth 2.0 Mutual-TLS Client Authentication and Certificate-Bound Access Tokens」のような例が挙げられるでしょう。

Client-Certヘッダ

Client-Certヘッダは、TLSの終端を行う中間装置がHTTPリクエストを中継する際に追加されます。

値としては、DERエンコード証明書をBase64エンコードしたものになります。

   Client-Cert: MIIBqDCCAU6gAwIBAgIBBzAKBggqhkjOPQQDAjA6MRswGQYDVQQKDBJM
    ZXQncyBBdXRoZW50aWNhdGUxGzAZBgNVBAMMEkxBIEludGVybWVkaWF0ZSBDQTAeFw0y
    MDAxMTQyMjU1MzNaFw0yMTAxMjMyMjU1MzNaMA0xCzAJBgNVBAMMAkJDMFkwEwYHKoZI
    zj0CAQYIKoZIzj0DAQcDQgAE8YnXXfaUgmnMtOXU/IncWalRhebrXmckC8vdgJ1p5Be5
    F/3YC8OthxM4+k1M6aEAEFcGzkJiNy6J84y7uzo9M6NyMHAwCQYDVR0TBAIwADAfBgNV
    HSMEGDAWgBRm3WjLa38lbEYCuiCPct0ZaSED2DAOBgNVHQ8BAf8EBAMCBsAwEwYDVR0l
    BAwwCgYIKwYBBQUHAwIwHQYDVR0RAQH/BBMwEYEPYmRjQGV4YW1wbGUuY29tMAoGCCqG
    SM49BAMCA0gAMEUCIBHda/r1vaL6G3VliL4/Di6YK0Q6bMjeSkC3dFCOOB8TAiEAx/kH
    SB4urmiZ0NX5r5XarmPk0wmuydBVoU4hBVZ1yhk=

TLSの終端装置が受け取った時点ですでにこのClient-Certがあった場合は一旦消してから、ヘッダを追加します。