测试环境
AnolisOS-8.6-x86_64-minimal.iso
Virtual Box,2 vCPU, 4G RAM, 40 vDisk
安装依赖
yum install -y make gcc
编译安装GmSSL
unzip GmSSL-master.zip
**注:**由于许多系统有自带的 ssl 库,为避免潜在的动态库冲突,此处仅生成静态库
./config --prefix=/usr/local/gmssl --openssldir=/usr/local/gmssl no-shared
make && make install
加到系统环境变量
echo ‘export PATH=“$PATH:/usr/local/gmssl/bin”’ >> ~/.bash_profile
source ~/.bash_profile
查看版本
gmssl version
gmssl ciphers -v |grep SM
OpenVPN编译安装
安装依赖
yum install -y gcc libnl3-devel libcap-ng-devel openssl-devel lz4-devel lzo-devel pam-devel make
tar -zxvf openvpn-2.5.10.tar.gz
cd openvpn-2.5.10
./configure OPENSSL_LIBS=“-L/usr/local/gmssl/lib /usr/local/gmssl/lib/libssl.a /usr/local/gmssl/lib/libcrypto.a -lpthread -ldl”
OPENSSL_CFLAGS=-I/usr/local/gmssl/include --includedir=/usr/local/gmssl/include
–libdir=/usr/local/gmssl/lib --prefix=/usr/local/openvpn
重点1: 两个静态库要指定。
重点2: -lpthread -ldl 要指定。
变量名不能写错, OPENSSL_CFLAGS、 OPENSSL_LIBS
make && make install
/usr/local/openvpn/sbin/openvpn --version
/usr/local/openvpn/sbin/openvpn --show-ciphers | grep SM
SMS4-CBC (128 bit key, 128 bit block)
SMS4-CFB (128 bit key, 128 bit block, TLS client/server mode only)
SMS4-OFB (128 bit key, 128 bit block, TLS client/server mode only)
/usr/local/openvpn/sbin/openvpn --show-digests | grep SM
SM3 256 bit digest size
SM3 256 bit digest size
/usr/local/openvpn/sbin/openvpn --show-tls | grep SM
ECDHE-SM2-WITH-SMS4-GCM-SM3 (No IANA name known to OpenVPN, use OpenSSL name.)
ECDHE-SM2-WITH-SMS4-SM3 (No IANA name known to OpenVPN, use OpenSSL name.)
SM9-WITH-SMS4-SM3 (No IANA name known to OpenVPN, use OpenSSL name.)
SM9DHE-WITH-SMS4-SM3 (No IANA name known to OpenVPN, use OpenSSL name.)
SM2-WITH-SMS4-SM3 (No IANA name known to OpenVPN, use OpenSSL name.)
SM2DHE-WITH-SMS4-SM3 (No IANA name known to OpenVPN, use OpenSSL name.)
注:GmSSL v2还不支持RFC8998国密套件
生成证书
编辑openssl.cnf
mkdir root_ca
cd root_ca
cp /usr/local/gmssl/openssl.cnf .
vi openssl.cnf
[ v3_req ]
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth, clientAuth
[ v3_ca ]
keyUsage = cRLSign, keyCertSign
extendedKeyUsage = serverAuth, clientAuth
根证书
gmssl ecparam -genkey -name sm2p256v1 -text -out Root.key #SM2根密钥
gmssl req -config openssl.cnf -new -key Root.key -out Root.req -subj “/C=CN/ST=HA/L=ZZ/O=ITAI/OU=DEVOPS/CN=root/[email protected]” #证书请求
gmssl x509 -req -extfile openssl.cnf -extensions v3_ca -days 365 -sm3 -in Root.req -signkey Root.key -out RootCA.crt #生成根证书
gmssl x509 -in RootCA.crt -text -noout #查看根证书
服务端证书
gmssl ecparam -genkey -name sm2p256v1 -text -out Server.key #生成私钥
gmssl req -config openssl.cnf -new -key Server.key -out Server.req -subj “/C=CN/ST=HA/L=ZZ/O=ITAI/OU=DEVOPS/CN=server/[email protected]” #证书请求
gmssl x509 -req -extfile openssl.cnf -extensions v3_req -sm3 -days 365 -CA RootCA.crt -CAkey Root.key -CAcreateserial -in Server.req -out ServerCA.crt #签发证书
gmssl verify -CAfile RootCA.crt ServerCA.crt #证书验证
gmssl x509 -in ServerCA.crt -text -noout #查看证书
客户端证书
gmssl ecparam -genkey -name sm2p256v1 -text -out Client.key #生成私钥
gmssl req -config openssl.cnf -new -key Client.key -out Client.req -subj “/C=CN/ST=HA/L=ZZ/O=ITAI/OU=DEVOPS/CN=client/[email protected]” #证书请求
gmssl x509 -req -extfile openssl.cnf -extensions v3_req -sm3 -days 365 -CA RootCA.crt -CAkey Root.key -CAcreateserial -in Client.req -out ClientCA.crt #签发证书
gmssl verify -CAfile RootCA.crt ClientCA.crt #证书验证
gmssl x509 -in ClientCA.crt -text -noout #查看证书
服务端配置
mkdir -p /etc/openvpn
cp /root/openvpn-2.5.10/sample/sample-config-files/server.conf /etc/openvpn
cp /root/openvpn-2.5.10/sample/sample-keys/dh2048.pem /etc/openvpn/
cp RootCA.crt /etc/openvpn/ca.crt
cp ServerCA.crt /etc/openvpn/server.crt
cp Server.key /etc/openvpn/server.key
编辑server.conf
grep -vE “#|;|^$” /etc/openvpn/server.conf
local 192.168.1.74
port 1194
proto tcp
dev tun
ca ca.crt
cert server.crt
key server.key # This file should be kept secret
dh dh2048.pem
topology subnet
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
keepalive 10 120
cipher SMS4-CFB
data-ciphers SMS4-CFB
data-ciphers-fallback SMS4-CFB
persist-key
persist-tun
status openvpn-status.log
log openvpn.log
verb 3
启动openvpn
/usr/local/openvpn/sbin/openvpn --cd /etc/openvpn --auth-nocache --config server.conf
客户端配置
mkdir -p /etc/openvpn
cp /root/openvpn-2.5.10/sample/sample-config-files/client.conf /etc/openvpn
客户端证书,从服务端拷贝过来,放到/etc/openvpn下
cp RootCA.crt /etc/openvpn/ca.crt
cp ClientCA.crt /etc/openvpn/client.crt
cp Client.key /etc/openvpn/client.key
编辑client.conf
grep -vE “#|;|^$” /etc/openvpn/client.conf
client
dev tun
proto tcp
remote 192.168.1.74 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client.crt
key client.key
remote-cert-tls server
cipher SMS4-CFB
data-ciphers SMS4-CFB
data-ciphers-fallback SMS4-CFB
verb 3
log openvpn.log
启动openvpn
/usr/local/openvpn/sbin/openvpn --cd /etc/openvpn --auth-nocache --config client.conf