我可以看到 Android 原生 VPN 客户端支持 IKEv2/MSCHAPv2,因此理论上可以从 Android 连接到 Strongswan VPN 服务器,而无需安装额外的软件(如 Strongswan VPN 客户端)。
然而:在实践中,让它发挥作用并不是那么容易。
我的服务器使用 FreeRadius 作为后端,并且运行良好:
- iPhone 原生 VPN 客户端
- Windows 10/11 原生 VPN 客户端
- 适用于 Android 的 StrongVPN 客户端。
所以我认为强行支持 Android 原生客户端应该很容易,因为上述内容并不难。
但事实证明事情并没有那么简单。
阅读日志以找出所需内容,我发现了这一行:
14[CFG] received proposals:
IKE:AES_CBC_256/AES_CBC_128/HMAC_SHA2_512_256/HMAC_SHA2_384_192/HMAC_SHA2_256_128/HMAC_SHA1_96/PRF_HMAC_SHA2_512/PRF_HMAC_SHA2_384/PRF_HMAC_SHA2_256/PRF_HMAC_SHA1/MODP_2048_256/ECP_384/ECP_256/MODP_2048/MODP_1536,
IKE:AES_GCM_16_256/AES_GCM_16_128/PRF_HMAC_SHA2_512/PRF_HMAC_SHA2_384/PRF_HMAC_SHA2_256/PRF_HMAC_SHA1/MODP_2048_256/ECP_384/ECP_256/MODP_2048/MODP_1536
据我所知,这是 Android 告诉 Strongswan 它支持哪种加密密码。
使用:StrongSwans 密码套件文档我发现我应该提出一个包含以下内容的密码提案:
aes256/aes128
、sha512/sha384/sha256/sha1
和prfsha512/prfsha384/prfsha256/prfsha1
的组合modp2048s256/ecp384/ecp256/modp2048/modp1536
。
或者:
aes256gcm16/aes128gcm16
、prfsha512/prfsha384/prfsha256/prfsha1
和的组合modp2048s256/ecp384/ecp256/modp2048/modp1536
。
这使我想到这个针对 IKE 传输的建议:aes256-sha512-prfsha512-modp2048s256
。
我的Android配置文件配置如下:
conn-defaults {
local_addrs = SERVER.IP.ADDRESS
local {
auth = pubkey
certs = example.com-ecdsa.cer
id = example.com
}
version = 2
send_certreq = no
send_cert = always
unique = never
fragmentation = yes
encap = yes
dpd_delay = 60s
rekey_time = 0s
}
# Default login method
eap-defaults {
remote {
auth = eap-radius
id = %any
eap_id = %any
}
}
eap-android : eap-default {
remote {
# Do NOT define eap_id, since Radius won't get triggered on login.
auth = eap-radius
id = *@example.com
}
}
connections
{
conn-android : conn-defaults, eap-android {
children {
net {
local_ts = 0.0.0.0/0
}
esp_proposals = aes256-sha512-prfsha512-modp2048s256
}
pools = IkeVPN-ipv4
proposals = aes256-sha512-prfsha512-modp2048s256
}
conn-windows : conn-defaults, eap-defaults {
children {
net {
local_ts = 0.0.0.0/0
}
esp_proposals = aes256-sha256-prfsha256-modp1024
}
proposals = aes256-sha256-prfsha256-modp1024
pools = IkeVPN-ipv4
}
conn-ios : conn-defaults, eap-defaults {
local {
auth = pubkey
certs = example.com-rsa.cer
id = example.com
}
children {
net {
local_ts = 0.0.0.0/0
}
esp_proposals = aes256-sha256
}
pools = IkeVPN-ipv4
proposals = aes256-sha256-prfsha256-modp2048
}
}
pools
{
IkeVPN-ipv4 {
addrs = 192.168.201.0/24
#My DNS server is hosted on another internal net.
dns = 192.168.200.1
}
}
关于我的 VPN 服务器上的证书的简要说明。我安装了 2 个 Let's Encrypt 证书。
2048 位 RSA 证书(iPhone 用户使用,因为他们无法连接到 ECDSA 证书?)。
256 位 ECDSA 证书,所有支持 ECDSA 的操作系统都使用该证书。
经过一点点的反复尝试,我找到了该eap-android
部分的配置,但从那时起,我有点不知所措。
首先:在配置 Andoid VPN 期间,我很快了解到我必须定义,ipsec identifier
尽管我有点不确定它在登录期间用于什么。
我确实注意到,无论我在 中用作值,都会与 部分中的属性ipsec identifier
匹配。因此,我只是将内容从复制到 中。id
remote
username
ipsec identifier
然而,当我尝试登录 VPN 服务器 Android 原生客户端时,我在日志中看到了以下输出(略有删减):
14[CFG] looking for peer configs matching SERVER.IP.ADDRESS[%any]...CLIENT.IP.ADDRESS[[email protected]]
14[CFG] selected peer config 'conn-android'
14[CFG] sending RADIUS Access-Request to server '192.168.200.1'
14[CFG] received RADIUS Access-Challenge from server '192.168.200.1'
14[IKE] initiating EAP_TTLS method (id 0x01)
14[IKE] peer supports MOBIKE
14[IKE] authentication of 'example.com' (myself) with ECDSA_WITH_SHA256_DER successful
14[IKE] sending end entity cert "CN=EXAMPLE.COM"
14[IKE] sending issuer cert "C=US, O=Let's Encrypt, CN=R3"
14[ENC] generating IKE_AUTH response 1 [ IDr CERT CERT AUTH EAP/REQ/TTLS ]
14[NET] sending packet: from SERVER.IP.ADDRESS[4500] to CLIENT.IP.ADDRESS[6727] (3056 bytes)
07[NET] received packet: from SERVER.IP.ADDRESS[6727] to CLIENT.IP.ADDRESS[4500] (96 bytes)
07[ENC] parsed INFORMATIONAL request 2 [ N(AUTH_FAILED) ]
07[ENC] generating INFORMATIONAL response 2 [ N(AUTH_FAILED) ]
07[NET] sending packet: from SERVER.IP.ADDRESS[4500] to CLIENT.IP.ADDRESS[6727] (96 bytes)
通过进一步运行 FreeRadius,freeradius -X
我发现 Freeradius 收到了用户名并将挑战发送回 VPN 客户端,但它从未收到来自 VPN 客户端对挑战的响应。
有谁知道用户名验证在登录过程中挂断是怎么回事?
更新:
感谢@AryaS 提供的提示adb logcat
。
这确实让我了解了正在发生的事情。
我通过无线调试连接到我的手机,以下是来自adb logcat -s charon:*
W charon : 10[CFG] selected proposal: IKE:AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_2048
W charon : 10[IKE] local host is behind NAT, sending keep alives
W charon : 10[IKE] remote host is behind NAT
W charon : 10[IKE] sending cert request for "C=US, O=Internet Security Research Group, CN=ISRG Root X1"
E charon : 10[IKE] establishing CHILD_SA android{1}
W charon : 10[ENC] generating IKE_AUTH request 1 [ IDi CERTREQ CPRQ(ADDR DNS) SA TSi TSr N(MOBIKE_SUP) N(ADD_6_ADDR) N(ADD_6_ADDR) N(MULT_AUTH) N(EAP_ONLY) N(MSG_ID_SYN_SUP) ]
W charon : 10[NET] sending packet: from 192.168.0.175[56045] to SERVER.IP.ADDRESS[4500] (400 bytes)
W charon : 11[NET] received packet: from SERVER.IP.ADDRESS[4500] to 192.168.0.175[56045] (2720 bytes)
W charon : 11[ENC] parsed IKE_AUTH response 1 [ IDr CERT CERT AUTH EAP/REQ/ID ]
W charon : 11[IKE] received end entity cert "CN=example.com"
W charon : 11[IKE] received issuer cert "C=US, O=Let's Encrypt, CN=R3"
W charon : 11[CFG] using certificate "CN=example.com"
W charon : 11[CFG] using untrusted intermediate certificate "C=US, O=Let's Encrypt, CN=R3"
W charon : 11[CFG] using trusted intermediate ca certificate "C=US, O=Internet Security Research Group, CN=ISRG Root X1"
W charon : 11[CFG] no issuer certificate found for "C=US, O=Internet Security Research Group, CN=ISRG Root X1"
W charon : 11[CFG] issuer is "O=Digital Signature Trust Co., CN=DST Root CA X3"
W charon : 11[IKE] no trusted ECDSA public key found for 'example.com'
W charon : 11[CFG] closed tun device due to charon will be shutdown
W charon : 11[CFG] created abort file after scheduled shutdown job
W charon : 11[ENC] generating INFORMATIONAL request 2 [ N(AUTH_FAILED) ]
W charon : 11[NET] sending packet: from 192.168.0.175[56045] to SERVER.IP.ADDRESS[4500] (80 bytes)
W charon : 00[DMN] signal of type SIGTERM received. Shutting down
...所以我想一切都归结为DST Root CA X3
Let's Encrypt 的证书不属于我手机的受信任证书列表?
答案1
抱歉,我没有足够的要点来评论,所以我不知道正确的后续方法。我还没有测试 Let's Encrypt,似乎我甚至不应该费心。但你们都说三星 Android charon 确实接受自签名用户 CA 证书,但我的只是在 adb 日志中说它没有找到颁发机构证书,尽管我确信签名颁发机构证书已安装并在 IKE VPN 配置中选择。