Mac VPN 证书:身份选择器为何一直为空
客户端需要带有私钥的证书,并把它放在自己能够读取的钥匙串中。先检查身份是否可用,再检查网关是否接受它。
你安装了证书,它在“钥匙串访问”中带着友好的名称出现,可 VPN 客户端的身份选择器依然是空的。客户端找的不是证书。它找的是身份:一个与私钥配对、能证明持有权的证书,存放在客户端获准读取的位置。
客户端要的是身份
Apple 的安全框架把证书和身份视为两种不同的对象。证书是公开数据。身份是该证书加上它的私钥,只有身份才能完成质询。而受信任的 CA 证书让客户端可以评估签发者;它并不会让这台机器成为已签发的客户端凭据的持有者。
| Item | What it can do | What it cannot do |
|---|---|---|
| CA or server certificate | Validate the gateway's chain | Authenticate this client |
| Client certificate without key | Nothing for authentication | Prove possession of anything |
| Identity (cert plus key) | Answer the authentication challenge | Guarantee the gateway accepts it |
正因如此,导入 .cer 文件永远不会生成可用的客户端身份。该文件只包含公开材料。无论你如何改名或给予信任,它都不会变成密钥对。
选择器为空的三个原因
第一是缺少私钥,也就是注册或导入流程没有交付任何私钥。第二是客户端不查询的存储位置:用户范围的配置文件只看用户的钥匙串,放在系统存储区里的条目对它可能不可见。第三是用途或策略不匹配,证书虽然存在,但按部署规则并不适用于客户端认证。
security find-identity -v -p ssl-client
此命令列出系统认为可用于客户端认证的身份。如果数量为零,问题出在 VPN 客户端之前,改配置文件也无济于事。如果身份出现在这里却不在客户端里,差别就在客户端的存储位置或范围。
私钥存在哪里,谁能使用它
通过“钥匙串访问”导入身份时,导入对话框会让你选择目标钥匙串。哪个目标正确,取决于客户端以及配置文件是用户范围还是设备范围。建议使用系统钥匙串的旧答案并非通用规则,而在存储位置之间复制条目也不是修复。
System Roots 是一个信任集合。把证书放在那里改变的是系统信任哪些签发者;它不会创建私钥,也不是身份存储区。为了让选择器有内容而搬动无关证书,只会让这台机器的信任集合被永久扩大。
私钥的访问权限是另一项控制。 允许每个应用都使用该私钥 能解决某个客户端的选择问题,却把同样的能力交给了机器上其他所有东西。只授予需要它的客户端,并检查私钥是否由硬件保护或被标记为不可导出;如果是,就必须使用受支持的提供程序,而不是导出的副本。
配置文件如何指向凭据
在受管理的原生 IKEv2 配置中,配置文件通过 PayloadCertificateUUID 引用其凭据负载。真正重要的是被引用的身份以及它是如何配置的;在配置文件里改显示名称,并不能修复指向错误负载或指向从未交付私钥的负载的引用。
第三方提供程序可能使用完全不同的选择机制,例如它自己的存储区或系统提示。请阅读该提供程序的文档,而不要照搬原生配置文件的假设,并且要在实际安装的配置文件里核对引用,而不是管理控制台里的草稿。
选择与接受是两个不同的里程碑
选择器有内容只说明客户端能找到并使用某个身份。它并不说明网关是否会接受。服务器仍会检查签发者、有效期、吊销状态以及 把该凭据映射到账户的规则。
按这个顺序分别测试两个阶段。确认身份被提供、建立连接,然后请网关的所有者确认实际出示了哪个凭据、由哪条映射规则消费。如果客户端提供了身份而服务器拒绝,剩下的工作就在服务器一侧。重装 Mac 上的证书不会改变这个结果,无论重复多少次。