pinning(証明書のピン留め)とも呼ばれる「Public Key Pinning Extension for HTTP(HPKP)」は、SSL/TLS証明書の不正利用を防止する方法です。
HPKPが設定されたサーバーは、鍵交換時に公開鍵のハッシュ値をブラウザに渡します。
HPKPに対応しているブラウザ(Crome, Firefox)は、サーバーが指定した期間このハッシュ値を保持します。
ブラウザは、サーバーが指定した期間内に再度アクセスがあった際、保持しているハッシュ値と一致する公開鍵をサーバーが提供しない場合、不正なサーバ証明書が利用されていると判断します。
※最新の情報は以下のため、こちらも併せてご覧ください。
「証明書のピンニングはやめましょう」
https://rms.ne.jp/wp/sslserver/basis/pinning2/
HTTPヘッダとして「Public-Key-Pins」あるいは「Public-Key-Pins-Report-Only」を返します。
Public-Key-Pinsの場合HPKPが有効になります。
Public-Key-Pins-Report-Onlyの場合、公開証明書の認証に失敗した場合でもreport-uriにレポートされるだけで、接続は維持されます。
SHA-256ハッシュアルゴリズムで公開鍵のハッシュ値を取得します。
ハッシュ値をBase64エンコードします。
ブラウザがハッシュ値を保持するべき時間を指定します。単位は秒です。
オプションです。指定されると、サブドメインも対象となります。
オプションです。指定されると、指定されたURIにエラーを報告します。
証明書に公開鍵が含まれていますので、以下のコマンドを実行し、SSL/TLS証明書から公開鍵のハッシュ値を取得しBase64エンコードします。
openssl x509 -in your.crt -pubkey -noout | openssl rsa -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64
証明書要求 (CSR) にも公開鍵が含まれていますので、以下のコマンドを実行し、CSRから公開鍵のハッシュ値を取得しBase64 エンコードします。
openssl req -in your.csr -pubkey -noout | openssl rsa -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64
指定できる公開鍵は、ドメインのSSL/TLSサーバ証明書から、その証明書のrootにいたる階層に含まれる公開鍵であればどれでも利用できます。
以下の事例についてそれぞれの意味と指定の注意事項を説明します。
Public-Key-Pins: HPKP が有効になります。
上記で説明したコマンドで取得した、公開鍵のSHA-256 ハッシュアルゴリズムハッシュ値Base64 エンコードが「si41AizREkLvvft0IRW4u3XMFR2Yg7bvrF7padyCJgF=」です。
「Public Key Pinning Extension for HTTP (HPKP)」を規定している RFC 7469 で「オペレーターはバックアップ・キーのペアをオフラインに保ち、それにピンを設定します」と記載されています。これは利用中の証明書に何らかの事故が起きた場合もすぐに証明書を切り替え、サイトを安全に運営するためのものです。バックアップ用の公開鍵のSHA-256 ハッシュアルゴリズムハッシュ値Base64 エンコードが「EVw989IlUxkcjRcE2SO2ISTXIsInsdj3x7K8QrZbHec=」です。
5184000秒は2か月間です。ブラウザは最大2か月間pinningのデータを保持します。この値はテストを繰り返しながら順次長時間にしていくのが安全です。
このpinningが全サブドメインで有効になります。
pinningでエラーが起きるとブラウザはhttps://nydomain/hpkp-reportにレポートを送ります。
mod_headersモジュールがインストールされている必要があります。Webサーバーのconfigの該当VirtualHostディレクティブに以下のように記述します。
ngx_http_headers_moduleがインストールされている必要があります。以下をVirtualHostの設定に加えます。
Web.configファイルに以下を追加してください。