DigiCert証明書の正規代理店株式会社アールエムエス
DigiCert サーバー証明書利用団体
  1. ホーム
  2. サポート
  3. 技術情報
  4. 「Public Key Pinning Extension for HTTP(HPKP)」で証明書の不正利用を防止する

「Public Key Pinning Extension for HTTP(HPKP)」で証明書の不正利用を防止する

pinning(証明書のピン留め)とも呼ばれる「Public Key Pinning Extension for HTTP(HPKP)」は、SSL/TLS証明書の不正利用を防止する方法です。
HPKPが設定されたサーバーは、鍵交換時に公開鍵のハッシュ値をブラウザに渡します。
HPKPに対応しているブラウザ(Crome, Firefox)は、サーバーが指定した期間このハッシュ値を保持します。
ブラウザは、サーバーが指定した期間内に再度アクセスがあった際、保持しているハッシュ値と一致する公開鍵をサーバーが提供しない場合、不正なサーバ証明書が利用されていると判断します。

WebサーバーでHPKPを有効にする

HTTPヘッダ

HTTPヘッダとして「Public-Key-Pins」あるいは「Public-Key-Pins-Report-Only」を返します。

Public-Key-Pins の例:
Public-Key-Pins: pin-sha256="base64=="; max-age=expireTime [; includeSubDomains][; report-uri="reportURI"]
Public-Key-Pins-Report-Only の例:
Public-Key-Pins-Report-Only: pin-sha256="base64=="; max-age=expireTime [; includeSubDomains][; report-uri="reportURI"]
  • Public-Key-Pins、Public-Key-Pins-Report-Only
    Public-Key-Pinsの場合HPKPが有効になります。
    Public-Key-Pins-Report-Onlyの場合、公開証明書の認証に失敗した場合でもreport-uriにレポートされるだけで、接続は維持されます。
  • pin-sha256
    SHA-256ハッシュアルゴリズムで公開鍵のハッシュ値を取得します。
  • base64
    ハッシュ値をBase64エンコードします。
  • max-age
    ブラウザがハッシュ値を保持するべき時間を指定します。単位は秒です。
  • includeSubDomains
    オプションです。指定されると、サブドメインも対象となります。
  • reportURI
    オプションです。指定されると、指定されたURIにエラーを報告します。

公開鍵のハッシュ値を取得しBase64エンコードする

証明書に公開鍵が含まれていますので、以下のコマンドを実行し、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にいたる階層に含まれる公開鍵であればどれでも利用できます。

HTTPヘッダの事例と指定の注意事項

以下の事例についてそれぞれの意味と指定の注意事項を説明します。

Public-Key-Pins: pin-sha256="si41AizREkLvvft0IRW4u3XMFR2Yg7bvrF7padyCJgF="; pin-sha256="EVw989IlUxkcjRcE2SO2ISTXIsInsdj3x7K8QrZbHec="; max-age=5184000; includeSubDomains; report-uri="https://nydomain/hpkp-report"
  • Public-Key-Pins:
    Public-Key-Pins: HPKP が有効になります。
  • pin-sha256="si41AizREkLvvft0IRW4u3XMFR2Yg7bvrF7padyCJgF=";
    上記で説明したコマンドで取得した、公開鍵のSHA-256 ハッシュアルゴリズムハッシュ値Base64 エンコードが「si41AizREkLvvft0IRW4u3XMFR2Yg7bvrF7padyCJgF=」です。
  • pin-sha256="EVw989IlUxkcjRcE2SO2ISTXIsInsdj3x7K8QrZbHec=";
    「Public Key Pinning Extension for HTTP (HPKP)」を規定している RFC 7469 で「オペレーターはバックアップ・キーのペアをオフラインに保ち、それにピンを設定します」と記載されています。これは利用中の証明書に何らかの事故が起きた場合もすぐに証明書を切り替え、サイトを安全に運営するためのものです。バックアップ用の公開鍵のSHA-256 ハッシュアルゴリズムハッシュ値Base64 エンコードが「EVw989IlUxkcjRcE2SO2ISTXIsInsdj3x7K8QrZbHec=」です。
  • max-age=5184000;
    5184000秒は2か月間です。ブラウザは最大2か月間pinningのデータを保持します。この値はテストを繰り返しながら順次長時間にしていくのが安全です。
  • includeSubDomains;
    このpinningが全サブドメインで有効になります。
  • report-uri="https://nydomain/hpkp-report"
    pinningでエラーが起きるとブラウザはhttps://nydomain/hpkp-reportにレポートを送ります。

Web サーバでの設定例

Apache

mod_headersモジュールがインストールされている必要があります。Webサーバーのconfigの該当VirtualHostディレクティブに以下のように記述します。

Header always set Public-Key-Pins "pin-sha256=\"si41AizREkLvvft0IRW4u3XMFR2Yg7bvrF7padyCJgF=\"; pin-sha256=\"EVw989IlUxkcjRcE2SO2ISTXIsInsdj3x7K8QrZbHec=\"; max-age=5184000; includeSubDomains"

Nginx

ngx_http_headers_moduleがインストールされている必要があります。以下をVirtualHostの設定に加えます。

add_header Public-Key-Pins 'pin-sha256="si41AizREkLvvft0IRW4u3XMFR2Yg7bvrF7padyCJgF="; pin-sha256="EVw989IlUxkcjRcE2SO2ISTXIsInsdj3x7K8QrZbHec="; max-age=5184000; includeSubDomains' always;

IIS

Web.configファイルに以下を追加してください。

<httpProtocol> <customHeaders> <add name="Public-Key-Pins" value="pin-sha256="si41AizREkLvvft0IRW4u3XMFR2Yg7bvrF7padyCJgF="; pin-sha256="EVw989IlUxkcjRcE2SO2ISTXIsInsdj3x7K8QrZbHec="; max-age=5184000; includeSubDomains" /> </customHeaders> </httpProtocol>
SSL サーバ証明書とは?
30日間テスト証明書
30日間返金保証制度あり!
コードサイニング証明書
ドキュメントサイニング証明書
デジタル証明書ニュース
HTTPS入門
digicert.comトピックス&ニュース