[3] [DFN[[RUBYB[既知ピン付きホスト]@en[Known Pinned Host]]]]は、
以前のアクセスで得られた[[ピン]]の情報を[[利用者エージェント]]が保持している[[ホスト]]です。

* 仕様書

[REFS[
- [1] [CITE@en[RFC 7469 - Public Key Pinning Extension for HTTP]] ([TIME[2015-05-05 21:00:37 +09:00]] 版) <https://tools.ietf.org/html/rfc7469>
-- [4] [CITE@en[RFC 7469 - Public Key Pinning Extension for HTTP]] ([TIME[2015-05-05 21:00:37 +09:00]] 版) <https://tools.ietf.org/html/rfc7469#section-2.5>
-- [5] [CITE@en[RFC 7469 - Public Key Pinning Extension for HTTP]] ([TIME[2015-05-05 21:00:37 +09:00]] 版) <https://tools.ietf.org/html/rfc7469#section-2.7>
-- [7] [CITE@en[RFC 7469 - Public Key Pinning Extension for HTTP]] ([TIME[2015-05-05 21:00:37 +09:00]] 版) <https://tools.ietf.org/html/rfc7469#section-2.8>
-- [14] [CITE@en[RFC 7469 - Public Key Pinning Extension for HTTP]] ([TIME[2015-05-05 21:00:37 +09:00]] 版) <https://tools.ietf.org/html/rfc7469#section-4.5>
-- [17] [CITE@en[RFC 7469 - Public Key Pinning Extension for HTTP]] ([TIME[2015-05-05 21:00:37 +09:00]] 版) <https://tools.ietf.org/html/rfc7469#section-5>
-- [20] [CITE@en[RFC 7469 - Public Key Pinning Extension for HTTP]] ([TIME[2015-05-05 21:00:37 +09:00]] 版) <https://tools.ietf.org/html/rfc7469#section-7>
]REFS]

* 意味

[2] [RUBYB[既知ピン付きホスト]@en[Known Pinned Host]]は、
[[PKP]] [[ヘッダー]]で得られた情報を一定期間[[利用者エージェント]]において保持しておくものです。

[63] [[PKP-RO]] [[ヘッダー]]の情報を[[キャッシュ]]しては[['''なりません''']] [SRC[>>5]]。

* 状態

[54] [[既知ピン付きホスト]]の[[キャッシュ]]
([DFN[[[Pinning Metadata]]]] [SRC[>>4]]) は、次の状態を持ちます。
[FIG(list members)[
:[[ドメイン名]]:[RUBYB[ピン付きホスト]@en[Pinned Host]]の[[ドメイン名]]です [SRC[>>5]]。
:[DFN[[RUBYB[実効ピン日付]@en[Effective Pin Date]]]]:
[[利用者エージェント]]が[[ホスト]]に関する[RUBYB[妥当なピン付けヘッダー]@en[Valid Pinning Header]]を観測した[[時刻]]です [SRC[>>5]]。
:[DFN[[RUBYB[実効満期日付]@en[Effective Expiration Date]]]]:
[[実効ピン日付]]に [CODE(HTTP)@en[[[max-age]]]] を足したものです [SRC[>>5]]。
:[CODE(HTTP)@en[[[includeSubDomains]]]]:[CODE(HTTP)@en[[[includeSubDomains]]]]
[[指令]]が指定されたかどうかです [SRC[>>5]]。
:[CODE(HTTP)@en[[[report-uri]]]]:[CODE(HTTP)@en[[[report-uri]]]]
[[指令]]が指定された場合、その値です [SRC[>>5]]。
:[[ピン]]群:0個以上の[[ピン]]のリストです。
]FIG]

[12] なお [CODE[[[report-uri]]]] で指定された [[URL]] に送信される [[JSON]]
では、 [DFN[[CODE[[[effective-expiration-date]]]]]] に[[実効満期日付]]を記述します。

;; [CODE[[[report-uri]]]] を参照。

* ドメイン名

[57] [[既知ピン付きホスト]]は、[[ドメイン名]]により識別します。
[[IPアドレス]]は使いません。 [SRC[>>5]]

[58] [[対象URL]]の[[ホスト]]が [[IPアドレス]]なら、
[[利用者エージェント]]はその[[ホスト]]を[[既知ピン付きホスト]]として記録しては[['''なりません''']] [SRC[>>5]]。

;; [59] [[RFC]] では [[Request-URI]] としています [SRC[>>5]] が、[[Request-URI]]
に[[ホスト]]を指定したとは限りませんから、[[対象URL]] ([[実効要求URL]])
のものを使うべきと思われます。また [[RFC]] は [[RFC 3986]] [[URI]]
を使っているので [CODE(ABNF)@en[[[IP-literal]]]] または [CODE(ABNF)@en[[[IPv4address]]]]
といっています [SRC[>>5]] が、実際の [[URL]] はそれ以外の構文で 
[[IPアドレス]]が指定されるかもしれず、その場合でも[[既知ピン付きホスト]]とするのは不適当と思われます。

[28] [[利用者エージェント]]は、[[ドメイン名]]の [[IDNA]] [[正準化]]を行わなければ[['''なりません''']] [SRC[>>5]]。

;; [29] [[RFC]] は [[HSTS]] の [[RFC]] の方法を参照しています。 [[IDNA]]
参照。

[60] [[ドメイン名]]は、[[既知HSTSホストドメイン名一致]]により比較します [SRC[>>5]]。

;; [13] 複数一致するものが見つかる場合 ([CODE(HTTP)@en[[[includeSubDomains]]]]
が使われている場合にあり得ます。) にどう処理するべきかは定かではありません。
すべてにそれぞれ [[Pin Validation]] を行う必要があるのでしょうか。

[62] (完全一致ではなく) [[超ドメイン一致]]する[[既知ピン付きホスト]]のキャッシュを編集しては[['''なりません''']] [SRC[>>5]]。

* 満期

[55] [[既知ピン付きホスト]]が[DFN[[RUBYB[満期]@en[expired]]]]であるとは、
[[実効満期日付]]が[[過去]]の[[日付]]であることをいいます [SRC[>>5]]。

[61] [[利用者エージェント]]は [CODE(HTTP)@en[[[max-age]]]] 値に上限を設けても構いません。
上限を超える値が指定された場合は、上限が指定されたものとして扱って構いません。 [SRC[>>5]]

[56] [[利用者エージェント]]は、[[キャッシュ]]中の[[満期]]の[[既知ピン付きホスト]]を無視しなければ[['''なりません''']] [SRC[>>5]]。

* preloaded pin list

[6] [[利用者エージェント]]は、 [[PKP]] 仕様に基づき[[応答]]から得た[[既知ピン付きホスト]]の他に、
実装組み込みなどの方法で[[ピン付きホスト]]の情報を得て構いません。
[[既知ピン付きホスト]]と衝突する場合にどちらを優先するかは実装定義です。 [SRC[>>5]]

[15] preload は、不正な方法で発行された[[証明書]]を使って攻撃者が [[PKP]]
を[[利用者エージェント]]に与えることを防ぐために有用かもしれません [SRC[>>14]]。

;; [16] そのような使い方をするなら[[利用者エージェント]]の組み込み (preload) の
[[PKP]] が優先される必要がありそうです。

[REFS[
- [9] [CITE@en[SecurityEngineering/Public Key Pinning/Implementation Details - MozillaWiki]] ([TIME[2015-06-04 12:05:21 +09:00]] 版) <https://wiki.mozilla.org/SecurityEngineering/Public_Key_Pinning/Implementation_Details>
- [11] [CITE[Issue 415689 - chromium - Add an HSTS and key pin preload rule for chrome.com - An open-source project to help move the web forward. - Google Project Hosting]] ([TIME[2015-06-04 17:07:50 +09:00]] 版) <https://code.google.com/p/chromium/issues/detail?id=415689>
- [10] [CITE[Issue 158883 - chromium - Support enterprise policy HSTS and key pinning preloads - An open-source project to help move the web forward. - Google Project Hosting]] ([TIME[2015-06-04 17:07:17 +09:00]] 版) <https://code.google.com/p/chromium/issues/detail?id=158883>
- [23] [CITE[http/transport_security_state_static.json - chromium/src/net - Git at Google]] ([TIME[2015-06-06 23:45:40 +09:00]] 版) <https://chromium.googlesource.com/chromium/src/net/+/master/http/transport_security_state_static.json>
- [21] [CITE[Monica at Mozilla: Firefox 32 supports Public Key Pinning]] ([TIME[2015-06-06 19:41:20 +09:00]] 版) <http://monica-at-mozilla.blogspot.de/2014/08/firefox-32-supports-public-key-pinning.html>
- [22] [CITE@en[SecurityEngineering/Public Key Pinning - MozillaWiki]] ([TIME[2015-06-06 18:41:53 +09:00]] 版) <https://wiki.mozilla.org/SecurityEngineering/Public_Key_Pinning>
]REFS]

* 自己署名証明書の扱い

[8] [[利用者エージェント]]は、
[[自己署名末端実体証明書]]による[[認証]]を受け入れる場合には、
そのような[[証明書]]に関する[[ピン]]も認めても構いません [SRC[>>5]]。

* fingerprinting

[18] [[既知ピン付きホスト]]の情報は [[fingerprinting vector]] となります。

[19] [[利用者エージェント]]は[[既知ピン付きホスト]]の情報を消去する仕組み [SRC[>>17, >>20]]
や現在の状態を表示する仕組み [SRC[>>20]]
を[[利用者]]に提供しても[RUBYB[よいかもしれません]@en[advisable]]。

* 関連

[24] [[HSTS]]の[[既知HSTSホスト]]に相当します。