RSA-PSS全称为:RSA Probabilistic Signature Scheme,在IKEv2协议的报文交互中,Authentication载荷可携带由RSA-PSS算法签名的验证数据。以下根据strongswan代码中的testing/tests/swanctl/rw-cert-pss/中的测试环境,来看基于X.509证书的RSA-PSS签名配置和认证流程。拓扑结构如下:
拓扑图中使用到的设备包括:虚拟主机carol和dave,以及虚拟网关moon。
虚拟主机配置
carol主机的配置文件:/etc/swanctl/swanctl.conf,内容如下。其中home连接中的本地local段配置中auth设置了rsa/pss-sha512的值。
connections {
home {
local_addrs = 192.168.0.100
remote_addrs = 192.168.0.1
local {
auth = rsa/pss-sha512
certs = carolCert.pem
id = carol@strongswan.org
}
remote {
auth = pubkey
id = moon.strongswan.org
}
children {
home {
remote_ts = 10.1.0.0/16
updown = /usr/local/libexec/ipsec/_updown iptables
esp_proposals = aes128gcm128-x25519
}
}
version = 2
proposals = aes128-sha256-x25519
}
}
secrets {
rsa-carol {
file = carolKey.pem
secret = "nH5ZQEWtku0RJEZ6"
}
}
dave主机的配置与carol基本相同,区别在于dave的验证数据使用rsa/pss-sha384签名算法,不同于carol使用的sha512哈希算法,这里使用sha384哈希算法。
connections {
home {
local_addrs = 192.168.0.200
remote_addrs = 192.168.0.1
local {
auth = rsa/pss-sha384
certs = daveCert.pem
id = dave@strongswan.org
}
remote {
auth = pubkey
id = moon.strongswan.org
}
children {
home {
remote_ts = 10.1.0.0/16
updown = /usr/local/libexec/ipsec/_updown iptables
esp_proposals = aes128gcm128-x25519
}
}
version = 2
proposals = aes128-sha256-x25519
}
}
网关配置
moon网关的配置文件:/etc/swanctl/swanctl.conf,内容如下。配置使用pubkey认证。
connections {
rw {
local_addrs = 192.168.0.1
local {
auth = pubkey
certs = moonCert.pem
id = moon.strongswan.org
}
remote {
auth = pubkey
}
children {
net {
local_ts = 10.1.0.0/16
updown = /usr/local/libexec/ipsec/_updown iptables
esp_proposals = aes128gcm128-x25519
}
}
version = 2
proposals = aes128-sha256-x25519
}
}
moon网关的配置文件:/etc/strongwan.conf,内容如下,字段rsa_pass设定为yes,表明使用RSA-PSS填充算法(PKCS #1 v2.1),而不是默认的RSA-PKCS #1 v1.5。前者比后者在数理上更具安全性,但是后者也是安全的。
swanctl {
load = pem pkcs1 x509 revocation constraints pubkey openssl random
}
charon-systemd {
load = random nonce sha1 sha2 mgf1 aes hmac pem pkcs1 x509 revocation constraints pubkey curve25519 gmp curl kernel-netlink socket-default updown vici
rsa_pss = yes
}
连接建立流程
操作流程如下,首先在两个虚拟主机carol和dave上,以及网关moon上启动strongswan进程。再者,在carol和dave上创建名称为home的子连接。
moon::systemctl start strongswan
carol::systemctl start strongswan
dave::systemctl start strongswan
moon::expect-connection rw
carol::expect-connection home
carol::swanctl --initiate --child home 2> /dev/null
dave::expect-connection home
dave::swanctl --initiate --child home 2> /dev/null
接下来,查看以下carol主机上strongswan进程的日志信息,可见carol自身使用的验证算法:RSA_EMSA_PSS_SHA2_512_SALT_64,以及网关moon使用的验证算法:RSA_EMSA_PSS_SHA2_256_SALT_32。
carol charon-systemd: 10[IKE] authentication of 'carol@strongswan.org' (myself) with RSA_EMSA_PSS_SHA2_512_SALT_64 successful
carol charon-systemd: 15[IKE] authentication of 'moon.strongswan.org' with RSA_EMSA_PSS_SHA2_256_SALT_32 successful
在看一下dave主机上strongswan进程的日志信息,与以上介绍的配置相同,dave使用了RSA-EMSA-PSS验证算法,其中采用SHA384哈希算法;而moon网关选择了SHA256算法。
dave charon-systemd: 08[IKE] authentication of 'dave@strongswan.org' (myself) with RSA_EMSA_PSS_SHA2_384_SALT_48 successful
dave charon-systemd: 16[IKE] authentication of 'moon.strongswan.org' with RSA_EMSA_PSS_SHA2_256_SALT_32 successful
在carol建立连接的初始IKE_SA_INIT请求报文中,SIGNATURE_HASH_ALGORITHMS载荷指定了本端可接受的签名哈希算法,包括:SHA2-256、SHA2-384、SHA2-512和Identity。在moon回复的IKE_SA_INIT请求报文中,具有相同的SIGNATURE_HASH_ALGORITHMS载荷。如下图所示:
以下为carol在IKE_AUTH请求报文中携带的Authentication认证载荷的值,其中认证方法为Digital Signature(14/0xe)。整个authentication载荷的长度为460字节,去掉头部的8个字节长度,认证数据的长度为452个字节,其中开始的部分为0x43长的认证算法信息。
这部分数据采用ASN.1编码,解析之后内容如下。
首先是RSA-PSS的标识符Identifier:1.2.840.113549.1.1.10(参见RFC7427 A.4.1定义)。之后为三部分参数,如RFC3447 A.2.3中的定义,第一部分为hashAlgorithm算法标识,表明认证数据使用的哈希算法,此处为SHA512: 2.16.840.1.101.3.4.2.3;第二部分为maskGenAlgorithm标识(1.2.840.113549.1.1.8),算法也是使用SHA521: 2.16.840.1.101.3.4.2.3;第三部分为saltLength长度值,为64。
以下为dave主机发送的IKE_AUTH请求报文中携带的认证数据的解析结果,可见其使用的SHA2-384哈希算法,标识为:2.16.840.1.101.3.4.2.2。
strongswan测试版本: 5.8.1
END