测试系统环境:centos 7.2
一、安装
依赖 :gcc、openssl、lzo、pam
yum install -y gcc openssl-devel lzo-devel pam-devel
#解压
tar xf open***-2.3.4.tar.gz
#切换到open***目录
cd open***-2.3.4
#调用configure
./configure --prefix=/usr/local/open***-2.3.4 --enable-password-save
#编译、安装
make && make install
#启动
sbin/open*** 配置文件
二、生成证书
使用easyrsa3来制作证书,下载地址:https://github.com/Open***/easy-rsa
在linux上面将其解压得到easy-rsa-master,进入easyrsa3,将vars.example复制一份命名为vars,此文件为制作证书时所使用到的配置文件,根据需要,我只打开了如下选项:
set_var EASYRSA_REQ_COUNTRY "CN"
set_var EASYRSA_REQ_PROVINCE "Guangdong"
set_var EASYRSA_REQ_CITY "Shenzhen"
set_var EASYRSA_REQ_ORG "XXX"
set_var EASYRSA_REQ_EMAIL "[email protected]"
如果open*** client的配置文件中使用了ns-cert-type server则要打开此选项,制作server证书时会将一些信息写入证书,如不打开此选项,则open*** client会提示server certificate verify fail
set_var EASYRSA_NS_SUPPORT "yes"
下面就可以制作证书了,每条命令执行之后都有些信息输出,如出错,会提示相关错误信息
./easyrsa init-pki
初始化,会在当前目录创建PKI目录,用于存储一些中间变量及最终生成的证书
./easyrsa build-ca
创建根证书,首先会提示设置密码,用于ca对之后生成的server和client证书签名时使用,然后会提示设置Country Name,State or Province Name,Locality Name,Organization Name,Organizational Unit Name,Common Name,Email Address,可以键入回车使用默认的,也可以手动更改
./easyrsa gen-req server nopass
创建server端证书和private key,nopass表示不加密private key,然后会提示设置Country Name,State or Province Name,Locality Name,Organization Name,Organizational Unit Name,Common Name,Email Address,可以键入回车使用默认的,也可以手动更改
./easyrsa sign server server
给server端证书做签名,首先是对一些信息的确认,可以输入yes,然后输入build-ca时设置的那个密码
./easyrsa gen-dh
创建Diffie-Hellman,时间会有点长,耐心等待
创建client端证书,需要单独把easyrsa3文件夹拷贝出来一份,删除里面的PKI目录,然后进入到此目录
./easyrsa init-pki
初始化,会在当前目录创建PKI目录,用于存储一些中间变量及最终生成的证书
./easyrsa gen-req client nopass
创建client端证书和private key,nopass表示不加密private key,然后会提示设置Country Name,State or Province Name,Locality Name,Organization Name,Organizational Unit Name,Common Name,Email Address,可以键入回车使用默认的,也可以手动更改
回到制作server证书时的那个easyrsa3目录,导入client端证书,准备签名
./easyrsa import-req client.req所在路径 client
client.req应该在刚才制作client端证书的easyrsa3/pki/reqs/下面
./easyrsa sign client client
给client端证书做签名,首先是对一些信息的确认,可以输入yes,然后输入build-ca时设置的那个密码
至此,server和client端证书已制作完毕
open*** server端需要的是
easyrsa3/pki/ca.crt <制作server证书的文件夹>
easyrsa3/pki/private/server.key <制作server证书的文件夹>
easyrsa3/pki/issued/server.crt <制作server证书的文件夹>
easyrsa3/pki/dh.pem
open*** client端需要的是
easy-rsa/easyrsa3/pki/ca.crt <制作server证书的文件夹>
easy-rsa/easyrsa3/pki/issued/client.crt <制作server证书的文件夹>
easy-rsa/easyrsa3/pki/private/client.key <制作client证书的文件夹>
三、配置证书认证登录
Open***已经在sample/sample-config-files子目录中为我们提供了相关的示例文件server.conf和client.conf,并且配置文件中的每个配置选项均有详细的英文说明(配置文件中"#"或";"开头的均为注释内容),实际上,将两个模板文件中与IP地址有关的配置修改一下,就可以直接拿来使用。
服务端配置server.conf:
local 192.168.1.106 #指定监听的本机IP(因为有些计算机具备多个IP地址),该命令是可选的,默认监听所有IP地址。
port 1194 #指定监听的本机端口号
proto udp #指定采用的传输协议,可以选择tcp或udp
dev tun #指定创建的通信隧道类型,可选tun或tap
ca ca.crt #指定CA证书的文件路径
cert server.crt #指定服务器端的证书文件路径
key server.key #指定服务器端的私钥文件路径
dh dh2048.pem #指定迪菲赫尔曼参数的文件路径
server 10.0.0.0 255.255.255.0 #指定虚拟局域网占用的IP地址段和子网掩码,此处配置的服务器自身占用10.0.0.1。
ifconfig-pool-persist ipp.txt #服务器自动给客户端分配IP后,客户端下次连接时,仍然采用上次的IP地址(第一次分配的IP保存在ipp.txt中,下一次分配其中保存的IP)。
tls-auth ta.key 0 #开启TLS-auth,使用ta.key防御***。服务器端的第二个参数值为0,客户端的为1。
keepalive 10 120 #每10秒ping一次,连接超时时间设为120秒。
comp-lzo #开启***连接压缩,如果服务器端开启,客户端也必须开启
client-to-client #允许客户端与客户端相连接,默认情况下客户端只能与服务器相连接
persist-key
persist-tun #持久化选项可以尽量避免访问在重启时由于用户权限降低而无法访问的某些资源。
status open***-status.log #指定记录Open***状态的日志文件路径
verb 3 #指定日志文件的记录详细级别,可选0-9,等级越高日志内容越详细
客户端配置client.conf:
client #指定当前***是客户端
dev tun #必须与服务器端的保持一致
proto udp #必须与服务器端的保持一致
remote 192.168.1.106 1194 #指定连接的远程服务器的实际IP地址和端口号
resolv-retry infinite #断线自动重新连接,在网络不稳定的情况下(例如:笔记本电脑无线网络)非常有用。
nobind #不绑定特定的本地端口号
persist-key
persist-tun
ca ca.crt #指定CA证书的文件路径
cert client1.crt #指定当前客户端的证书文件路径
key client1.key #指定当前客户端的私钥文件路径
ns-cert-type server #指定采用服务器校验方式
tls-auth ta.key 1 #如果服务器设置了防御DoS等***的ta.key,则必须每个客户端开启;如果未设置,则注释掉这一行;
comp-lzo #与服务器保持一致
verb 3 #指定日志文件的记录详细级别,可选0-9,等级越高日志内容越详细
四、配置账号密码登录:
修改Server端配置文件:
auth-user-pass-verify /usr/local/open***/etc/checkpsw.sh via-env(脚本存放路径)
client-cert-not-required(如果加上client-cert-not-required则代表只使用用户名密码方式验证登录,如果不加,则代表需要证书和用户名密码双重验证登录)
username-as-common-name
script-security 3
#切换到etc目录
cd /usr/local/open***-2.3.4/etc/
vim checkpsw.sh
#!/bin/sh
#######################################################
# checkpsw.sh (C) 2004 Mathias Sundman <mathias@open***.se>
#This script will authenticate Open*** users against
#a plain text file. The passfile should simply contain
#one row per user with the username first followed by
#one or more space(s) or tab(s) and then the password.
########################################################
PASSFILE="/etc/open***/psw-file"
LOG_FILE="/var/log/open***-password.log"
TIME_STAMP=date "+%Y-%m-%d %T"
if [ ! -r "${PASSFILE}" ]; then
echo "${TIME_STAMP}: Could not open password file \"${PASSFILE}\" for reading." >> ${LOG_FILE}
exit 1
fi
CORRECT_PASSWORD=`awk '!/^;/&&!/^#/&&$1=="'${username}'"{print $2;exit}' ${PASSFILE}`
if [ "${CORRECT_PASSWORD}" = "" ]; then
echo "${TIME_STAMP}: User does not exist: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}
exit 1
fi
if [ "${password}" = "${CORRECT_PASSWORD}" ]; then
echo "${TIME_STAMP}: Successful authentication: username=\"${username}\"." >> ${LOG_FILE}
exit 0
fi
echo "${TIME_STAMP}: Incorrect password: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}
exit 1
修改checkpsw.sh里的相应参数,主要改下PASSFILE和LOG_FILE两个变量就可以了
vim psw-file
test 123456 (前面是用户 后面是密码)
chmod 400 psw-file(注:这里 psw-file的权限,尽量小点)
修改客户端配置文件:
注销掉这两行
#cert client1.crt
#key client1.key
再添加这一行,添加这行,就会提示输入用户名和密码
auth-user-pass
注:编译时添加了 --enable-password-save扩展,可以从指定文件读取用户名密码,文件第一行为账号,第二行为密码,在auth-user-pass后加上指定文件即可,如:auth-user-pass pwd.txt
五、未开启MD5导致***连接失败
具体错误如下:
Feb 24 17:08:08 2016 VERIFY ERROR: depth=0, error=certificate signature failure: C=US, ST=CA, L=SanFrancisco, O=Open***, OU=changeme, CN=changeme,name=changeme, [email protected]
Wed Feb 24 17:08:08 2016 TLS_ERROR: BIO read tls_read_plaintext error: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
Wed Feb 24 17:08:08 2016 TLS Error: TLS object -> incoming plaintext read error
Wed Feb 24 17:08:08 2016 TLS Error: TLS handshake failed
Wed Feb 24 17:08:08 2016 Fatal TLS error (check_tls_errors_co), restarting
Wed Feb 24 17:08:08 2016 SIGUSR1[soft,tls-error] received, process restarting
Wed Feb 24 17:08:13 2016 Attempting to establish TCP connection with [AF_INET] [nonblock]
Wed Feb 24 17:08:14 2016 TCP connection established with [AF_INET]
Wed Feb 24 17:08:14 2016 TCPv4_CLIENT link local: [undef]
Wed Feb 24 17:08:14 2016 TCPv4_CLIENT link remote: [AF_INET]
Wed Feb 24 17:08:14 2016 VERIFY ERROR: depth=0, error=certificate signature failure: C=US, ST=CA, L=SanFrancisco, O=Open***, OU=changeme, CN=changeme, name=changeme, [email protected]
Wed Feb 24 17:08:14 2016 TLS_ERROR: BIO read tls_read_plaintext error: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
上网查很多人说是时间不同步我同步服务器的时间也没有解决问题!后来才发现问题所在
主要原因是Centos 7移除了Openssl的MD5支持
openssl仍然默认以md5作为散列算法并且可以正确识别md5散列算法,所以就悲剧了,只有cenots7不好用。关键是这个错误是大错误被小错误还掩盖了一下,所以很难被发现。
解决方法:
[root@localhost open***]# export NSS_HASH_ALG_SUPPORT=+MD5
[root@localhost open***]# export OPENSSL_ENABLE_MD5_VERIFY=1
编辑 vim /usr/lib/systemd/system/NetworkManager.service
添加Environment="OPENSSL_ENABLE_MD5_VERIFY=1 NSS_HASH_ALG_SUPPORT=+MD5"
保存退出后
[root@localhost open***]# systemctl daemon-reload
[root@localhost open***]# systemctl restart NetworkManager.service
成功连接open***,检查路由和ip地址配置一切正常!
六、Open***客户端证书合并到配置文件中
编辑client.o***客户端配置文件:
vim client.o***
删除或者注释掉以下几行内容:
在这里我把它们注释掉:
ca ca.crt 改为:#ca ca.crt
cert client.crt 改为:#cert client.crt
key client.key 改为:#key client.key
tls-auth ta.key 1 改为:#tls-auth ta.key 1
在最后面添加以下内容:
<ca>
ca.crt文件内容
</ca>
<cert>
client.crt文件内容
</cert>
<key>
client.key文件内容
</key>
key-direction 1
<tls-auth>
ta.key文件内容
</tls-auth>
复制各文件里的内容到相应的位置即可!保存退出!!