在Ubuntu系统手撸一个自动创建SSL证书的SHELL脚本

介于CentOS 7停服的原因(CentOS 7停服之后该怎么安装软件呢?),为了方便日常使用,还是要研究一下替换成Ubuntu系统(如何在Ubuntu 23.10部署KVM并创建虚拟机?),先尝试一下在Ubuntu系统中部署openVPN服务端。

对于openVPN或者SSL VPN而言,这种以加密协议为基础提供远程的安全连接服务,主要基于数字证书利用数字签名的方法对SSL服务器和SSL客户端进行身份验证(VSR白送的的SSL VPN功能,你要不要?)。所以,使用Ubuntu系统,我们还是要先创建证书(使用Easy-RSA配置生成SSL证书)。

关于如何创建一份可以自动创建Easy-RSA证书的脚本,我们之前已经做了详细介绍(手撸一个自动创建SSL证书的SHELL脚本)。接下来,我们验证一下Easy-RSA在Ubuntu系统的使用是否存在差异,以及之前的脚本需要做何调整。

首先是软件安装,对应的命令为:

apt install -y easy-rsa

如果转换成SHELL脚本,则可以是:

安装Easy-RSA

install_easyrsa() {
echo “正在安装Easy-RSA…”
apt install -y easy-rsa
echo “Easy-RSA安装完成。”
}
然后是初始化Easy-RSA环境,在Ubuntu系统中,Easy-RSA的安装路径是/usr/share/easy-rsa/,需要依赖easyrsa文件来生成证书和密钥等文件。

可以看到,机构配置范例文件vars.example也位于这个目录,复制一份。

cp /usr/share/easy-rsa/vars.example /usr/share/easy-rsa/vars

如果转换成SHELL脚本,则可以是:

初始化Easy-RSA环境

init_easyrsa() {
echo “初始化Easy-RSA环境…”
cd /usr/share/easy-rsa/
# 复制vars.example为vars,避免覆盖
if [ -f vars ]; then
mv vars vars.backup
fi
cp vars.example vars
echo “Easy-RSA环境初始化完成。”
}
然后我想修改机构信息中的部分字段为以下信息。

set_var EASYRSA_REQ_COUNTRY “CN”
set_var EASYRSA_REQ_PROVINCE “Beijing”
set_var EASYRSA_REQ_CITY “Haidian”
set_var EASYRSA_REQ_ORG “TIETOU_TECH”
set_var EASYRSA_REQ_EMAIL “tietou@h3cadmin.cn”
set_var EASYRSA_REQ_OU “Tietou_openVPN”
正常需要使用vi命令进行编辑,如果转换成SHELL脚本,则可以直接进行插入:

更新vars文件中的机构信息字段

update_vars() {
echo “更新vars文件中的机构信息字段…”
cd /usr/share/easy-rsa/
# 向vars文件中插入机构信息字段
echo ‘set_var EASYRSA_REQ_COUNTRY “CN”‘ >> vars
echo ‘set_var EASYRSA_REQ_PROVINCE “Beijing”‘ >> vars
echo ‘set_var EASYRSA_REQ_CITY “Haidian”‘ >> vars
echo ‘set_var EASYRSA_REQ_ORG “TIETOU TECH”‘ >> vars
echo ‘set_var EASYRSA_REQ_EMAIL “tietou@h3cadmin.cn”‘ >> vars
echo ‘set_var EASYRSA_REQ_OU “Tietou openVPN”‘ >> vars
echo “vars文件中的机构信息字段已更新。”
}
然后就是生成证书文件了,还是在/usr/share/easy-rsa,通过以下命令初始化PKI(Public Key Infrastructure,公钥基础设施)目录结构:

./easyrsa init-pki

执行命令之后,Easy-RSA会自动根据vars文件中的变量,在PKI目录下生成一份新的openssl-easyrsa.cnf文件。

接下来创建根证书,用于CA(Certificate Authority,证书颁发机构)对之后生成的server和client证书进行签名时使用。为了方便,我们带nopass参数生成证书,nopass表示不对CA密钥进行加密,这样在签署证书时就可以跳过密码验证。

./easyrsa build-ca nopass

创建服务器端证书,同时指定nopass参数表示不对私钥进行加密。

./easyrsa gen-req ttserver nopass

给服务器端证书ttserver进行签名。

./easyrsa sign server ttserver

然后创建Diffie-Hellman文件,也就是秘钥交换时的DH算法,确保密钥可以穿越不安全网络。

./easyrsa gen-dh

接下来创建客户端的证书,同时指定nopass参数表示不对私钥进行加密。

./easyrsa gen-req ttclient nopass

给客户端证书ttclient进行签名。

./easyrsa sign-req client ttclient

至此,证书生成就结束了,涉及到的主要命令为:

./easyrsa init-pki
./easyrsa build-ca nopass
./easyrsa gen-req ttserver nopass
./easyrsa sign server ttserver
./easyrsa gen-dh
./easyrsa gen-req ttclient nopass
./easyrsa sign-req client ttclient
如果转换成SHELL脚本,则可以是:

生成证书和密钥

generate_certs() {
echo “正在生成证书和密钥…”
cd /usr/share/easy-rsa/
# 初始化PKI目录结构
./easyrsa init-pki
# 清空证书目录
echo “yes” | ./easyrsa clean-all
# 生成证书和密钥文件
echo | ./easyrsa build-ca nopass
echo | ./easyrsa gen-req ttserver nopass
echo “yes” | ./easyrsa sign server ttserver
./easyrsa gen-dh
echo | ./easyrsa gen-req ttclient nopass
echo “yes” | ./easyrsa sign-req client ttclient
echo “证书和密钥生成完成。”
}
为了方便管理,我们在/目录下创建一个SSL-cert文件夹,然后根据当前时间创建一个新目录,形如202308022132,同时将生成的证书和密钥文件复制到此目录下。如果写成SHELL脚本,则可以是:

创建SSL-cert目录

generate_dir() {
# 获取当前时间
current_time=$(date +”%Y%m%d%H%M”)
# 创建新的目录
new_dir=”/SSL-cert/${current_time}”
mkdir -p “${new_dir}”
# 将证书和密钥复制到新目录下
cp /usr/share/easy-rsa/pki/ca.crt “${new_dir}/ca.crt”
cp /usr/share/easy-rsa/pki/issued/ttserver.crt “${new_dir}/ttserver.crt”
cp /usr/share/easy-rsa/pki/private/ttserver.key “${new_dir}/ttserver.key”
cp /usr/share/easy-rsa/pki/issued/ttclient.crt “${new_dir}/ttclient.crt”
cp /usr/share/easy-rsa/pki/private/ttclient.key “${new_dir}/ttclient.key”
echo “证书和密钥已复制到目录:${new_dir}”
}
最后,我们再加一个主函数。

主函数

main() {
install_easyrsa
init_easyrsa
update_vars
generate_certs
generate_dir
}
然后将这些片段攒成一个文件autosslcert.sh,如下所示:

!/bin/bash

安装Easy-RSA

install_easyrsa() {
echo “正在安装Easy-RSA…”
apt install -y easy-rsa
echo “Easy-RSA安装完成。”
}

初始化Easy-RSA环境

init_easyrsa() {
echo “初始化Easy-RSA环境…”
cd /usr/share/easy-rsa/
# 备份vars.example为vars,避免覆盖
if [ -f vars ]; then
mv vars vars.backup
fi
cp vars.example vars
echo “Easy-RSA环境初始化完成。”
}

更新vars文件中的机构信息字段

update_vars() {
echo “更新vars文件中的机构信息字段…”
cd /usr/share/easy-rsa/
# 向vars文件中插入机构信息字段
echo ‘set_var EASYRSA_REQ_COUNTRY “CN”‘ >> vars
echo ‘set_var EASYRSA_REQ_PROVINCE “Beijing”‘ >> vars
echo ‘set_var EASYRSA_REQ_CITY “Haidian”‘ >> vars
echo ‘set_var EASYRSA_REQ_ORG “TIETOU_TECH”‘ >> vars
echo ‘set_var EASYRSA_REQ_EMAIL “tietou@h3cadmin.cn”‘ >> vars
echo ‘set_var EASYRSA_REQ_OU “Tietou_openVPN”‘ >> vars
echo “vars文件中的机构信息字段已更新。”
}

生成证书和密钥

generate_certs() {
echo “正在生成证书和密钥…”
cd /usr/share/easy-rsa/
# 初始化PKI目录结构
./easyrsa init-pki
# 清空证书目录
echo “yes” | ./easyrsa clean-all
# 生成证书和密钥文件
echo | ./easyrsa build-ca nopass
echo | ./easyrsa gen-req ttserver nopass
echo “yes” | ./easyrsa sign server ttserver
./easyrsa gen-dh
echo | ./easyrsa gen-req ttclient nopass
echo “yes” | ./easyrsa sign-req client ttclient
echo “证书和密钥生成完成。”
}

创建SSL-cert目录

generate_dir() {
# 获取当前时间
current_time=$(date +”%Y%m%d%H%M”)
# 创建新的目录
new_dir=”/SSL-cert/${current_time}”
mkdir -p “${new_dir}”
# 将证书和密钥复制到新目录下
cp /usr/share/easy-rsa/pki/ca.crt “${new_dir}/ca.crt”
cp /usr/share/easy-rsa/pki/issued/ttserver.crt “${new_dir}/ttserver.crt”
cp /usr/share/easy-rsa/pki/private/ttserver.key “${new_dir}/ttserver.key”
cp /usr/share/easy-rsa/pki/issued/ttclient.crt “${new_dir}/ttclient.crt”
cp /usr/share/easy-rsa/pki/private/ttclient.key “${new_dir}/ttclient.key”
echo “证书和密钥已复制到目录:${new_dir}”
}

主函数

main() {
install_easyrsa
init_easyrsa
update_vars
generate_certs
generate_dir
}
main;
exit;
并为此文件赋予可执行权限。

找台干净的主机跑一下试试。

Nice,成功了!

声明:文中观点不代表本站立场。本文传送门:https://eyangzhen.com/418764.html

(0)
联系我们
联系我们
分享本页
返回顶部