你安装了证书,它在“钥匙串访问”中带着友好的名称出现,可 VPN 客户端的身份选择器依然是空的。客户端找的不是证书。它找的是身份:一个与私钥配对、能证明持有权的证书,存放在客户端获准读取的位置。

客户端要的是身份

Apple 的安全框架把证书和身份视为两种不同的对象。证书是公开数据。身份是该证书加上它的私钥,只有身份才能完成质询。而受信任的 CA 证书让客户端可以评估签发者;它并不会让这台机器成为已签发的客户端凭据的持有者。

ItemWhat it can doWhat it cannot do
CA or server certificateValidate the gateway's chainAuthenticate this client
Client certificate without keyNothing for authenticationProve possession of anything
Identity (cert plus key)Answer the authentication challengeGuarantee the gateway accepts it

正因如此,导入 .cer 文件永远不会生成可用的客户端身份。该文件只包含公开材料。无论你如何改名或给予信任,它都不会变成密钥对。

选择器为空的三个原因

第一是缺少私钥,也就是注册或导入流程没有交付任何私钥。第二是客户端不查询的存储位置:用户范围的配置文件只看用户的钥匙串,放在系统存储区里的条目对它可能不可见。第三是用途或策略不匹配,证书虽然存在,但按部署规则并不适用于客户端认证。

security find-identity -v -p ssl-client

此命令列出系统认为可用于客户端认证的身份。如果数量为零,问题出在 VPN 客户端之前,改配置文件也无济于事。如果身份出现在这里却不在客户端里,差别就在客户端的存储位置或范围。

私钥存在哪里,谁能使用它

通过“钥匙串访问”导入身份时,导入对话框会让你选择目标钥匙串。哪个目标正确,取决于客户端以及配置文件是用户范围还是设备范围。建议使用系统钥匙串的旧答案并非通用规则,而在存储位置之间复制条目也不是修复。

System Roots 是一个信任集合。把证书放在那里改变的是系统信任哪些签发者;它不会创建私钥,也不是身份存储区。为了让选择器有内容而搬动无关证书,只会让这台机器的信任集合被永久扩大。

私钥的访问权限是另一项控制。 允许每个应用都使用该私钥 能解决某个客户端的选择问题,却把同样的能力交给了机器上其他所有东西。只授予需要它的客户端,并检查私钥是否由硬件保护或被标记为不可导出;如果是,就必须使用受支持的提供程序,而不是导出的副本。

配置文件如何指向凭据

在受管理的原生 IKEv2 配置中,配置文件通过 PayloadCertificateUUID 引用其凭据负载。真正重要的是被引用的身份以及它是如何配置的;在配置文件里改显示名称,并不能修复指向错误负载或指向从未交付私钥的负载的引用。

第三方提供程序可能使用完全不同的选择机制,例如它自己的存储区或系统提示。请阅读该提供程序的文档,而不要照搬原生配置文件的假设,并且要在实际安装的配置文件里核对引用,而不是管理控制台里的草稿。

选择与接受是两个不同的里程碑

选择器有内容只说明客户端能找到并使用某个身份。它并不说明网关是否会接受。服务器仍会检查签发者、有效期、吊销状态以及 把该凭据映射到账户的规则。

按这个顺序分别测试两个阶段。确认身份被提供、建立连接,然后请网关的所有者确认实际出示了哪个凭据、由哪条映射规则消费。如果客户端提供了身份而服务器拒绝,剩下的工作就在服务器一侧。重装 Mac 上的证书不会改变这个结果,无论重复多少次。

相关文章