VPN 包要发给正确的接收者,而不是只发一个密钥
用未经验证的密钥加密数据包,只能一路保护到错误的所有者手里。验证指纹,并且只交付设备真正需要的材料。
合作方发来一个公钥,并要求一份加密的数据包。加密会生效,但它可能把一份受到完美保护的凭据送到不该持有它的人手里。机密性与接收者身份是两个不同的问题,由不同的机制来回答。在数据包离开你的机器之前,两个问题都要回答。
两个不同的问题:机密性与接收者
加密回答的是假设密钥属于预期对象时,谁能够读取文件。签名回答的是谁生成了它,而对机密性一无所知,因为已签名的文件依然可能被读取。指纹标识一个密钥,只有独立的核对才把这个指纹与某个人或角色绑定起来。把其中任何一项当成另一项,就是一次看似谨慎的交接中最常见的失误。
文件还有生命周期:会过期的链接限制了之后的获取,但无法撤销已经下载的凭据。
在带外验证指纹
从一条不依赖于那条要求你加密的消息的渠道,取得预期的指纹。然后把它与本地密钥环里保存的内容作比较。
gpg --fingerprint [email protected]
gpg --list-keys --with-fingerprint [email protected]指纹行才是要比较的值,第二条命令会把同样的身份连同完整指纹再展示一次,便于二次核对。要通过电话、已签名的清单或受管理的登记记录确认完整字符串;熟悉的显示名称证明不了任何事。如果密钥就是在要求交付的那条消息里送来的,它的指纹就不是独立证据。只有在核对之后才导入密钥,并且加密到已验证的指纹,而不是加密到一个名字。
只交付设备真正需要的材料
在选择传输方式之前先盘点数据包。公开的网关设置和公开的信任证书属于配置,客户端的私钥是秘密,而签发者的签名密钥则是完全不同的资产。在登记模型允许的地方,把私钥留在设备上,只交付能完成登记的部分。VPN 客户端验证服务器并不需要 CA 的签名密钥,而且 合作方之间共用一个长期有效的密钥,会让单独撤销变得不可能。
当接收者必须能发现替换时,也要对产物签名,并在说明里把两项操作分开。把多文件的数据包放在同一个归档里,这样接收者就不会只安装一半配置,然后报告网关拒绝该身份。
交付之后关闭生命周期
记下接收者、设备、配置修订号和撤销路径,但绝不记录私密值本身。确认预期对象能够完成登记,而另一个身份会被拒绝。如果数据包落入错误之手,要通过签发者更换或撤销已被接受的秘密,因为删除附件不会让任何已经下载的内容失效。密码在同一个对话里传递的加密归档,同样不是独立的核对。
交接完成的标志是正确的身份在正确的设备上生效,而不是加密文件上传成功。