我可以让 strongSwan 接受任何由特定 CA 签名的证书吗?

我可以让 strongSwan 接受任何由特定 CA 签名的证书吗?

使用swanctl配置,是否有办法让 strongSwan 接受任何由特定 CA 签名的 IKEv2 连接的证书?我的意思是,在客户端回复 stongSwan 发送的证书请求并发送所有证书后,无需在服务器上安装所有可能证书的公钥。

我尝试了这样的事情:

    local {
        auth = pubkey
        certs = server.pem
        id = fqdn:strongSwan
    }
    
    remote {
        auth = pubkey
        cacerts = my_ca.pem                     
        id = fqdn:cert                                              
    }

但这似乎不起作用(是的,客户端确实发送了certID)。我也尝试id = %any让客户端发送证书标识符,但这没有任何区别。

发送的证书肯定与 CA 证书相符,my_ca.pemswanctl --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

相关内容