strongSwan:密钥类型、加载器与错误的后端
PEM 是容器,不是密钥类型。先比较证书的公钥与私钥,再通过真正读取它的后端来加载。
文件扩展名并不能识别密钥算法,而 .pem 外壳里既可能是 RSA,也可能是 ECDSA 材料。PEM 描述字节如何封装,RSA 和 ECDSA 则是两种不同算法的名字,PKCS12 文件又是另一回事。strongSwan 通过插件和配置后端加载凭据,因此证书可能出现在列表里,而私钥却始终不可用。编辑任何机密之前,先把这些层次分开。
编码、算法与打包是三个层次
密钥文件有编码、算法,通常还有容器。PEM 是常见的 base64 外壳;DER 是它的二进制对应形式;PKCS12 把证书与其密钥和证书链打包在一起。证书链文件又是另一种容器,通常根本不含私钥。这些名称都不能说明里面的材料是 RSA 还是 ECDSA。
从对象本身读取算法。供应商的营销名称或文件扩展名都不是证据,因为同一签发者可以签发不同类型的密钥。
先比较公钥,再归咎于加载器
证书能被加载,只能证明证书解析成功,不能证明其私钥存在或可用。分别从证书和候选私钥导出公钥,然后比较两个摘要。任何一侧提取失败就到此为止,因为空输出的摘要证明不了任何事。摘要一致只能证明两者属于同一对,并不能说明证书是否适合这项任务。
openssl x509 -in server.crt -pubkey -noout |
openssl pkey -pubin -outform DER |
openssl dgst -sha256
openssl pkey -in server-key.pem -pubout -outform DER |
openssl dgst -sha256
第二条命令会接触本机的私密材料,但只输出公开的那一半。请保持如此,永远不要把私钥粘贴到工单里。如果密钥已加密,让受支持的工具提示输入口令,而不是把它放在命令行上,任由进程列表暴露。
旧式 ipsec.secrets 还是 swanctl 凭据
strongSwan 有两条常用的凭据路径。旧的 starter 栈从ipsec.secrets读取按类型区分的条目,并且每个条目都必须为材料指明正确的类型。swanctl 与 vici 栈则从自己的凭据目录、按自己的配置加载密钥。编辑正在运行的后端根本不读的文件,什么也不会改变。
: ECDSA "/etc/ipsec.d/private/server-key.pem"
先查明实际运行的是哪个后端,再把密钥放到该后端查看的位置。strongSwan 5.9 旧手册定义了按类型区分的机密条目,它不是 swanctl 的文档。把两者混在一起,就会得到一个忽略管理员所信任文件的守护进程。重新加载不报错,只说明配置解析成功。
读取加载事件与认证结果
受控重新加载后,针对具体密钥读取守护进程自身的加载输出。状态转储中列出的证书,并不表示私钥已与之匹配。
如果客户端仍然失败,请把服务端事件和客户端错误分开。证书链校验、身份匹配以及方法兼容性是后面带有各自证据的问题。把结果连同确切的密钥路径和你比较过的摘要一起记下来,否则下一班人会重复同样的重新加载。面对加载器不匹配,更换 CA 并不是第一反应。