在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-RSAinstall_easyrsa() {echo"正在安装Easy-RSA..."  apt install -y easy-rsaecho"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.backupfi  cp vars.example varsecho"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密钥进行加密,这样在签署证书时就可以跳过密码验证。https://wxa.wxs.qq.com/tmpl/mg/base_tmpl.html

./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 nopassecho | ./easyrsa gen-req ttserver nopassecho"yes" | ./easyrsa sign server ttserver  ./easyrsa gen-dhecho | ./easyrsa gen-req ttclient nopassecho"yes" | ./easyrsa sign-req client ttclientecho"证书和密钥生成完成。"}

为了方便管理,我们在/目录下创建一个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}"}

最后,我们再加一个主函数。https://wxa.wxs.qq.com/tmpl/mg/base_tmpl.html

# 主函数main() {  install_easyrsa  init_easyrsa  update_vars  generate_certs  generate_dir}

然后将这些片段攒成一个文件autosslcert.sh,如下所示:

#!/bin/bash# 安装Easy-RSAinstall_easyrsa() {echo"正在安装Easy-RSA..."  apt install -y easy-rsaecho"Easy-RSA安装完成。"}# 初始化Easy-RSA环境init_easyrsa() {echo"初始化Easy-RSA环境..."cd /usr/share/easy-rsa/# 备份vars.example为vars,避免覆盖if [ -f vars ]; then    mv vars vars.backupfi  cp vars.example varsecho"Easy-RSA环境初始化完成。"}# 更新vars文件中的机构信息字段update_vars() {echo"更新vars文件中的机构信息字段..."cd /usr/share/easy-rsa/# 向vars文件中插入机构信息字段echo'set_var EASYRSA_REQ_COUNTRY     "CN"' >> varsecho'set_var EASYRSA_REQ_PROVINCE    "Beijing"' >> varsecho'set_var EASYRSA_REQ_CITY        "Haidian"' >> varsecho'set_var EASYRSA_REQ_ORG         "TIETOU_TECH"' >> varsecho'set_var EASYRSA_REQ_EMAIL       "tietou@h3cadmin.cn"' >> varsecho'set_var EASYRSA_REQ_OU          "Tietou_openVPN"' >> varsecho"vars文件中的机构信息字段已更新。"}# 生成证书和密钥generate_certs() {echo"正在生成证书和密钥..."cd /usr/share/easy-rsa/# 初始化PKI目录结构  ./easyrsa init-pki# 清空证书目录echo"yes" | ./easyrsa clean-all# 生成证书和密钥文件echo | ./easyrsa build-ca nopassecho | ./easyrsa gen-req ttserver nopassecho"yes" | ./easyrsa sign server ttserver  ./easyrsa gen-dhecho | ./easyrsa gen-req ttclient nopassecho"yes" | ./easyrsa sign-req client ttclientecho"证书和密钥生成完成。"}# 创建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/1427.html

铁军哥的头像铁军哥

相关推荐

关注我们
关注我们
购买服务
购买服务
返回顶部