术语表 /开发者参考
PP pki data
- PP pki data 是什么?
- PP pki data 是 BIP70 支付请求中的一个字段,用于承载商户的证书,采用 DER 编码,叶证书在前,其后是任何中间证书(如有),不包含根证书。
规定于 BIP-70。
没有用于验证的公钥,签名就毫无价值,而 BIP70 是把这把公钥放在证书里一并发送,而不是单独发送。该字段是一个小型 protobuf 封装,内含一个原始 DER 证书列表,按从商户向外的顺序排列。其内容决定了钱包显示的是公司名称,还是一条单纯的警告。
运作方式
状态:已成历史。PP pki data 是 PaymentRequest 消息五个字段中的第3个,Bitcoin Core 在0.20.0版本中删除了读取该字段的代码,该版本发布于2020年6月3日。
这些字节中包含一个名为 X509Certificates 的 protobuf 消息,只有一个重复字段,每个条目都是一份完整的二进制证书。其顺序是明确规定的,而不是随意安排:先是商户自己的证书,然后是到达公共根证书所需的中间证书(如有)。
根证书本身被有意省略,这一道理的适用范围远不止 BIP70。从您要验证的一方那里收到的根证书什么也证明不了,因为任何人都可以生成根证书,并用它签署任何内容。信任必须来自您的设备上已有的列表。
DER 是所用的编码,是 ASN.1的规范二进制形式:一种结构,只对应唯一合法的字节序列。常见的 PEM 格式带有 BEGIN CERTIFICATE 行,其内容就是这些相同的字节经 base64 编码后的结果,会多占约三分之一的空间,因此传输格式始终是原始二进制。
证书占据了请求的大部分体积。输出、时间戳和备注合计可能只有一两百字节,而仅一份 RSA-2048证书就带有256字节的模数和256字节的签名,这还没有计入任何名称或扩展项,两份证书依次相连就达到数千字节。当 pki type 为 "none" 时,该字段为空,钱包除了收款目的地外没有任何内容可以显示。
在哪里会遇到它
您建立的每一个 HTTPS 连接,都会收到同样的证书列表,顺序也相同,叶证书在前。
TLS 服务器先发送自己的证书,再发送各中间证书,并因上述原因省略根证书。您只需一条命令 openssl s_client -showcerts -connect example.com:443 就能读取任何网站发送的完整列表,打印出的内容与 BIP70 所承载的材料完全相同,只是以 PEM 而非二进制显示。
对购买比特币的人来说,教训在于这些字节没有告诉您什么。有效的证书链只证明某个机构在签发时核实了对某个域名的控制权。它不能说明公司归谁所有,页面是否是交易所的仿冒页面,也不能说明该交易所能否兑付提现。钓鱼网站同样持有完全有效的证书,这些证书免费获取,只需几秒钟,它们显示的挂锁图标与真实网站的毫无区别。
因此,请看域名,不要看挂锁。请通过您曾保存的书签访问交易所,而不是通过搜索广告,并且在持有您资金的网站上,将证书警告视为必须停下的信号,而不是一个可以忽略的提示。
PP pki data vs 证书链
PP pki data 是容器,证书链是放进容器里的内容。只有在阅读 BIP70 文档或已归档的钱包源代码时,提到 pki data 才有意义,因为除此之外从未有人使用这个术语。证书链则不同,它是您每天都在依赖的现行事物,BIP70 写明的排序规则(叶证书在前,省略根证书)正是 TLS 至今仍遵循的规则。