使用swanctl
配置,是否有办法让 strongSwan 接受任何由特定 CA 签名的 IKEv2 连接的证书?我的意思是,在客户端回复 stongSwan 发送的证书请求并发送所有证书后,无需在服务器上安装所有可能证书的公钥。
我尝试了这样的事情:
local {
auth = pubkey
certs = server.pem
id = fqdn:strongSwan
}
remote {
auth = pubkey
cacerts = my_ca.pem
id = fqdn:cert
}
但这似乎不起作用(是的,客户端确实发送了cert
ID)。我也尝试id = %any
让客户端发送证书标识符,但这没有任何区别。
发送的证书肯定与 CA 证书相符,my_ca.pem
并swanctl --list-certs
显示服务器和 CA 证书,因此 strongSwan 找到了文件。我仍然得到no trusted RSA public key found for ...
标识符。
这个想法是,只要客户端已经签名,那么客户端发送的任何证书都是完全没问题的my_ca.pem
。因此,新客户端只需发送证书签名请求,获得签名证书,即可立即使用 VPN,而无需更改 VPN 配置,也不必先将证书放在 VPN 服务器上。
更新 1
以下是日志摘录(我不能发布原始日志,因为我不能在这里暴露 IP 地址、公司名称或用户证书详细信息):
charon-systemd[31259]: verifying message structure
charon-systemd[31259]: found payload of type NOTIFY
charon-systemd[31259]: found payload of type NOTIFY
charon-systemd[31259]: found payload of type NOTIFY
charon-systemd[31259]: found payload of type NOTIFY
charon-systemd[31259]: found payload of type AUTH
charon-systemd[31259]: found payload of type ID_INITIATOR
charon-systemd[31259]: found payload of type CERTIFICATE
charon-systemd[31259]: found payload of type ID_RESPONDER
charon-systemd[31259]: found payload of type SECURITY_ASSOCIATION
charon-systemd[31259]: found payload of type TS_INITIATOR
charon-systemd[31259]: found payload of type TS_RESPONDER
charon-systemd[31259]: found payload of type CONFIGURATION
charon-systemd[31259]: parsed IKE_AUTH request 1 [ IDi CERT N(INIT_CONTACT) IDr AUTH CPRQ(ADDR MASK DHCP DNS ADDR6 DHCP6 DNS6 DOMAIN) N(ESP_TFC_PAD_N) N(NON_FIRST_FRAG) SA TSi TSr N(MOBIKE_SUP) ]
charon-systemd[31259]: received end entity cert "E=<user-email>, CN=<user-name>"
charon-systemd[31259]: looking for peer configs matching <serverIP>[strongSwan]..<clientIP>[cert]
charon-systemd[31259]: selected peer config 'cert'
charon-systemd[31259]: IDx' => 8 bytes @ 0x7ffa369a2970
0: 02 00 00 00 63 65 72 74 ....cert
charon-systemd[31259]: SK_p => 32 bytes @ 0x7ff9fc0126d0
0: B4 36 B4 D5 CE 09 CE 98 FD 41 75 35 45 9E AD 98 .6.......Au5E...
16: DA BF D3 EB 4C 39 C0 46 5A 23 E1 A0 EB 85 05 6B ....L9.FZ#.....k
charon-systemd[31259]: octets = message + nonce + prf(Sk_px, IDx') => 668 bytes @ 0x7ffa1400eac0
0: 94 83 EA 26 E3 16 36 8D 00 00 00 00 00 00 00 00
<entire packet follows below>
charon-systemd[31259]: no trusted RSA public key found for 'cert'
<user-email>
并<user-name>
显示用户证书中的邮件和姓名,因此客户端已发送用户证书,否则 strongSwan 怎么会知道这些?<serverIP>
并且<clientIP>
还涉及正确的 IP 地址。
更新 2
id = %any
我还尝试在服务器端更改配置,然后在客户端发送E=<user-email>, CN=<user-name>
id,该 id 与证书中的值完全匹配。但日志显示:
charon-systemd[31978]: no trusted RSA public key found for 'E=<user-email>, CN=<user>'
我注意到的一件事是用户证书没有 SAN(主题备用名称)。到目前为止,这些证书已用于 OpenVPN 连接和 SSTP 连接,并且它们在这两个用途上都运行良好。我真的想摆脱 OpenVPN/SSTP,因为我认为两者都是糟糕的 VPN 协议,与我使用 IPsec 和 strongSwan 获得的吞吐量相比,它们的性能简直是笑话。
答案1
经过一整天的反复试验,结果发现用户证书确实需要主题备用名称 (SAN),在这种情况下是用户电子邮件地址,并且标识符必须%any
在配置中,并且客户端发送的标识符必须与 SAN 匹配(标识符类型似乎被忽略,只有字符串值是相关的)。
显然,strongSwan 会构建一个已配置的所有本地证书列表,并将客户端发送的所有证书也添加到该列表中(RFC 规定客户端可以发送至少 4 个不同的证书),然后在该列表中搜索 SAN 与发送的标识符匹配的任何证书。没有 SAN 的证书永远无法匹配,并且在搜索过程中始终会被跳过。最后一部分是问题所在,因为我们的用户证书都没有 SAN 值。
答案2
strongswan 似乎有以下选项:
left|rightca = <issuer dn> | %same
the distinguished name of a certificate authority which is required to lie in the trust path going from the
left|right participant's certificate up to the root certification authority.
%same means that the value configured for the other participant should be reused.
https://wiki.strongswan.org/projects/strongswan/wiki/connsection
在这种情况下,我会直接使用 strongswan 配置并放弃 swanctl