strongswan 高版本已支持ikev2,ios9.0以上版本的支持ikev2,Android也是高版本的部分机型支持ikev2,本人搭建的基于ikev2交换协议的strongswan VPN服务器对与iOS 是免证书的(iOS VPN客户端自己写的),Android (VPN客户端是stongswan 官网提供的客户端)服务器认证是证书,客户端认证是eap模式配置文件如下
生成私钥
ipec pki --gen --outform pem >ca.pem
--putfom 一共有三种形式,另两种是der 和 pgp
基于这个私钥生成一个CA证书
ipsec pki --self --in ca.pem --dn "C=chaina,O=strongswn ,CN=strongswan CA" --ca --outform pem >ca.cert.pem
--self是私钥 --in是输入私钥,--dn 是判别名,--ca 是证书
C:表示国家
O:表示州
CN:表示通用名
生成服务器证书
生成私钥
ipsec pki --gen --outform > server.pem
生成服务器证书
ipsec pki --pub --in server.pem | ipsec pki --issue --cacert ca.cert.pem --cakey ca.pem --dn "C=china,O=strongswan,CN=forum.org.cn " --san="forum.org.cn" --flag serverAuth --flag ikeIntermediate --outform pem >server.cert.pem
ipsec pki --pub --in server.pem
这句话的意思是从私钥里把公钥提取出来
--issue /--cacert/--cakey就是表明用刚才自签的CA证书来签这个服务器证书
--db/--san /--flag是一些客户端的特殊要求
Ios客户端要求CN(通用名)必须是你的服务器的URL或IP地址
Windows7不但要求了上面,还要求必须显示说明这个服务器证书的用途(用于服务器证书)--flag serverAuth;
非 iOS的 Mac OS X要求了「IP安全网络密钥互换居间(IP Security IKE Intermediate)」这种增强型密钥用法(EKU),--flag ikdeIntermediate;
Android和 iOS 都要求服务器别名(serverAltName)就是服务器的 URL或 IP 地址,--san。
keyexchange=ikev2
ike=aes256-sha256-modp1024,3des-sha1-modp1024,aes256-sha1-modp1024!
esp = aes256-sha256,3des-sha1,aes256-sha1!
dpdaction=clear
dpddelay=300s
rekey=no
mobike=yes
fragmentation=yes
#left
left=%any
leftsubnet=0.0.0.0/0
leftauth=psk
leftid=forum.org.cn(与服务器证书的CN和san 一致)
#right
right=%any
rightsourceip=%config
rightauth=eap-mschapv2
rightsendcert=never
eap_identity=%any
auto=add
conn Android_ikev2
keyexchange=ikev2
ike=aes256-sha256-modp1024,3des-sha1-modp1024,aes256-sha1-modp1024!
esp = aes256-sha256,3des-sha1,aes256-sha1!
dpdaction=clear
dpddelay=300s
rekey=no
mobike=yes
fragmentation=yes
#left
left=%any
leftsubnet=0.0.0.0/0
leftauth=pubkey
leftcert=server.cert.pem
leftsendcert=always
leftid=emmdemo.jianq.com
#right
right=%any
rightsourceip=%config
rightauth=eap-mschapv2
rightsendcert=never
eap_identity=%any
auto=add
keyexchange=ikev2
ike=aes256-sha256-modp1024,3des-sha1-modp1024,aes256-sha1-modp1024!
esp = aes256-sha256,3des-sha1,aes256-sha1!
dpdaction=clear
dpddelay=300s
rekey=no
mobike=yes
fragmentation=yes
#left
left=%any
leftsubnet=0.0.0.0/0
leftauth=psk
leftid=forum.org.cn(与服务器证书的CN和san 一致)
#right
right=%any
rightsourceip=%config
rightauth=eap-mschapv2
rightsendcert=never
eap_identity=%any
auto=add
conn Android_ikev2
keyexchange=ikev2
ike=aes256-sha256-modp1024,3des-sha1-modp1024,aes256-sha1-modp1024!
esp = aes256-sha256,3des-sha1,aes256-sha1!
dpdaction=clear
dpddelay=300s
rekey=no
mobike=yes
fragmentation=yes
#left
left=%any
leftsubnet=0.0.0.0/0
leftauth=pubkey
leftcert=server.cert.pem
leftsendcert=always
leftid=emmdemo.jianq.com
#right
right=%any
rightsourceip=%config
rightauth=eap-mschapv2
rightsendcert=never
eap_identity=%any
auto=add
: RSA server.pem
: PSK 0s+base64
jianq : XAUTH "123456"
说明:
RAS 为服务器的私钥证书
PSK即为共享密钥,其数据格式为0s+base64编码的数据,
XAUTH左右两端的分别为用户名和用户登录密码(字符串)
修改/etc/strongswwan.d/Charon-logging.cong配置文件:
该文件主要是用于控制输出的调试信息
charon {
load_modular = yes
duplicheck.enable = no
compress = yes
dns1 = 8.8.8.8
dns2 = 8.8.4.4
filelog {
/var/log/strongswan.charon.log {
time_format = %b %e %T
default = 2
append = no
flush_line = yes
}
}
说明:其他的保持不变
从strongswan5以后,无论是ikev1还是ikev2协议都使用ike2的daemon:charon来实现
duplicheck.enable = no:是为了同时连接多个设备,所以要把冗余检查关闭
/var/log/strongswan.charon.log配置的strongswan的日志的格式
default = 2:定义的是日志的级别,默认日志级别为:-1,0,1,2,3,4,-1是完全没有日志,
0只告诉你建立连接,连接关闭;
1只输出错误提示,
2会输出错误,警告和调试信息;
3会把连接传输的数据也打印;
4则会把密钥内容这些敏感数据也打印。
一般情况下,1或2都可以
append = no:是相当你重启strogswan后,是按上次日志写,还是新建一个日志(上次的会删除)。
因为strogswan的日志太多了,所以用no flush_line = yes:是每产生一行日志,就写入到磁盘一次,防止突然断电,磁盘缓存数据丢失。
charon {
# Section to define file loggers, see LOGGER CONFIGURATION in
# strongswan.conf(5).
filelog {
# <filename> is the full path to the log file.
# <filename> {
# Loglevel for a specific subsystem.
# <subsystem> = <default>
# If this option is enabled log entries are appended to the existing
# file.
append = yes
# Default loglevel.
default = 1
# Enabling this option disables block buffering and enables line
# buffering.
# flush_line = no
flush_line=yes
# Prefix each log entry with the connection name and a unique
# numerical identifier for each IKE_SA.
# ike_name = no
ike_name=yes
# Prefix each log entry with a timestamp. The option accepts a
# format string as passed to strftime(3).
# time_format =
time_format=%b %e %T
# }
}
# Section to define syslog loggers, see LOGGER CONFIGURATION in
# strongswan.conf(5).
syslog {
# Identifier for use with openlog(3).
# identifier =
# <facility> is one of the supported syslog facilities, see LOGGER
# CONFIGURATION in strongswan.conf(5).
# <facility> {
# Loglevel for a specific subsystem.
# <subsystem> = <default>
# Default loglevel.
# default = 1
default=1
# Prefix each log entry with the connection name and a unique
# numerical identifier for each IKE_SA.
# ike_name = no
ike_name=yes
# }
}
}