strongSwan是一个开源的基于IPsec的VPN解决方案,ipsec.secrets是strongSwan的关键配置,文件保存了strongSwan IPsec子系统用于IKE身份验证的密钥表信息。这些密钥被strongSwan互联网密钥交换(Internet Key Exchange,IKE)守护程序pluto(IKEv1)和charon(IKEv2)用于验证其他主机。这些密钥必须被妥善保管,该文件应为超级用户所有,其权限应设置为阻止其他人的所有访问。
strongSwan的配置和控制信息配置保存在ipsec.conf文件中。
该文件是一系列条目和include指令。下面是一个例子。
# /etc/ipsec.secrets - strongSwan IPsec secrets file
192.168.0.1 %any : PSK "v+NkxY9LLZvwj4qCC2o/gGrWDF2d21jL"
: RSA moonKey.pem
alice@strongswan.org : EAP "x3.dEhgN"
carol : XAUTH "4iChxLT3"
dave : XAUTH "ryftzG4A"
# 从其他文件中获取密钥
include ipsec.*.secrets
文件中的每个条目都是可选的ID选择器列表,后跟一个密钥。这两部分由一个冒号(:)分隔,冒号前后有空格。如果未指定ID选择器,则该行必须以冒号开头。
选择器可以是一个IP地址,一个完全限定的域名,user@FQDN,%any或%any6(可能会有其他种类)。
将ID与选择器匹配相当简单:它们必须相等。在“Road Warrior”连接的情况下,如果找不到对等体ID的相同匹配项,并且它是IP地址的形式,则%any的选择器将匹配对等体的IP地址(如果是IPV4),而%any6的选择器将匹配对等体的IP地址(如果是IPV6)。目前,可以使用过时的符号0.0.0.0代替%any。
在IKEv1中,在通过预共享密钥进行身份验证的情况下,会产生额外的复杂性:响应者需要在对等体的ID有效载荷被解码之前查找该密钥,因此使用的ID将是IP地址。
为了验证两台主机之间的连接,将使用与主机和对等体ID最匹配的条目。没有选择器的条目将匹配任何主机和对等体。更具体地说,如果选择器匹配主机ID(不考虑对等体),则带有一个选择器的条目将匹配主机和对等体。更具体地说,如果主机ID和对等体ID都与其中一个选择器匹配,则具有多个选择器的条目将与主机和对等体匹配。如果密钥用于非对称身份验证技术(即RSA等公钥系统),则具有多个选择器的条目将与主机和对等体匹配,即使只有主机ID与选择器匹配(假定选择器都是主机的身份)。只要两个条目在密钥或私钥方面达成一致,就可以将其视为最佳匹配。
通过预共享密钥进行身份验证需要两个系统都找到相同的密钥(该密钥实际上不是通过IKE协议传输的)。如果主机和对等体都出现在选择器列表中,那么相同的条目将适用于两个系统,因此可以在系统之间使用逐字复制。这自然会延伸到分享相同密钥的更大群体。因此,多个选择器条目最适合PSK身份验证。
RSA等公钥系统的身份验证要求每个主机都有自己的私钥。主机可以合理地为不同的接口和不同的对等体使用不同的私钥。但在系统之间共享条目是不正常的。因此,没有选择器和一个选择器形式的条目通常对公钥身份验证有意义。
条目的密钥部分必须以指示密钥类型的令牌开头。目前支持以下类型的加密凭证:
PSK定义了一个预共享密钥;
RSA定义一个RSA私钥;
ECDSA定义ECDSA私钥;
P12定义了一个PKCS#12容器;
EAP定义EAP凭据;
NTLM定义NTLM凭据;
XAUTH定义XAUTH凭据;
PIN定义智能卡PIN。
下面给出了每种密钥的详细信息。
行尾的空格将被忽略。在行首或空格后,#到行尾的文本被视为注释。
include指令会导致在继续处理当前文件之前处理命名文件的内容。文件名受sh命令中的“globbing”约束,因此每个具有匹配名称的文件都会被处理。include可以嵌套到适当的深度(目前为10)。如果文件名不是以/开头,则包含当前文件的目录将在名称前面。include指令是一行,以单词include开头,后跟空格,后跟文件名(不能包含空格)。
密钥类型
[ <selectors> ] : PSK <secret>
预共享密钥可以最方便地表示为一个字符序列,该序列由双引号字符(“)分隔。该序列不能包含换行符或双引号字符。
或者,预共享的密钥可以表示为十六进制或Base64编码的二进制值。以0x开头的字符序列被解释为十六进制数字序列。类似地,以0开头的字符序列被解释为Base64编码的二进制数据。
: RSA <private key file> [ <passphrase> | %prompt ]
: ECDSA <private key file> [ <passphrase> | %prompt ]
对于私钥文件,接受绝对路径或相对于/etc/strongswan/ipsec.d/private的路径。如果私钥文件已加密,则必须定义密码短语。可以使用%prompt来代替密码短语,这会导致后台程序在需要解密密钥时询问用户密码。
: P12 <PKCS#12 file> [ <passphrase> | %prompt ]
对于PKCS#12文件,接受绝对路径或相对于/etc/strongswan/ipsec.d/private的路径。如果容器已加密,则必须定义密码短语。可以使用%prompt来代替密码短语,这会导致后台程序在需要解密容器时向用户询问密码。私钥、客户端和CA证书都是从容器中提取的。要在连接中使用这样的客户端证书,请将leftid设置为证书的主题之一。
<user id> : EAP <secret>
密钥的格式与PSK密钥的格式相同。
EAP密钥仅适用于IKEv2。
<user id> : NTLM <secret>
secret的格式与PSK secrets的格式相同,但该密钥存储为NTLM哈希,即MD4(UTF-16LE(secret)),而不是明文。
NTLM密钥只能与eap-mschapv2插件一起使用。
[ <servername> ] <username> : XAUTH <password>
密码的格式与PSK密钥相同。XAUTH的密钥仅限于IKEv1。
: PIN %smartcard[<slot nr>[@<module>]]:<keyid> <pin code> | %prompt
智能卡选择器始终需要keyid来唯一选择正确的密钥。插槽号定义了令牌上的插槽,模块名称指的是strongswan.conf中定义的模块名称。可以指定%prompt,而不是静态地指定pin码,这会导致守护进程向用户请求pin码。