申请SSL证书脚本

申请SSL证书脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#!/bin/bash

if [[ $# -eq 0 ]]; then
echo "错误:请提供域名作为参数"
echo "用法:$0 <域名>"
exit 1
fi

# 输入域名
DOMAIN=$1
# 设置 Let's Encrypt 账户邮箱(用于证书通知)
EMAIL="填写自己的邮箱"
# 证书安装目录
SSL_DIR="$HOME/ssl"
KEY_FILE="$SSL_DIR/$DOMAIN.key"
CERT_FILE="$SSL_DIR/$DOMAIN.pem"

# 获取包管理器
get_pmt(){
# 包管理器检测
if ! res=$(which yum 2>/dev/null); then
if ! res=$(which apt 2>/dev/null); then
echo "不支持的Linux系统"
echo "只支持的包管理器为apt或yum的Linux系统"
exit 1
fi
# 设置APT相关命令
PMT="apt"
CMD_INSTALL="apt install -y "
CMD_REMOVE="apt remove -y "
CMD_UPGRADE="apt update; apt upgrade -y; apt autoremove -y"
else
# 设置YUM相关命令
PMT="yum"
CMD_INSTALL="yum install -y "
CMD_REMOVE="yum remove -y "
CMD_UPGRADE="yum update -y"
fi
# 系统服务管理器检测
if ! res=$(which systemctl 2>/dev/null); then
echo "系统版本过低,请升级到最新版本"
exit 1
fi
}

# 安装相关依赖
install(){
get_pmt
echo "检查证书申请相关依赖..."
# openssl: 处理证书、私钥、CSR 等加密操作
# socat: 仅在使用 standalone 模式验证时需要
# cronie/cron: 用于设置定时任务自动续期证书

# 检查socat是否安装
if ! command -v socat &> /dev/null; then
echo "socat 未安装,正在安装..."
$CMD_INSTALL socat
fi

# 检查openssl是否安装
if ! command -v openssl &> /dev/null; then
echo "openssl 未安装,正在安装..."
$CMD_INSTALL openssl
fi

# 检查cron服务
if [[ $PMT = "yum" ]]; then
if ! rpm -q cronie &> /dev/null; then
echo "cronie 未安装,正在安装..."
$CMD_INSTALL cronie
systemctl start crond
systemctl enable crond
fi
else
if ! dpkg -l | grep -q '^ii.*cron\s'; then
echo "cron 未安装,正在安装..."
$CMD_INSTALL cron
systemctl start cron
systemctl enable cron
fi
fi
}

main(){
# 安装目录是否存在
if [[ ! -d $SSL_DIR ]]; then
echo "创建证书目录: $SSL_DIR"
mkdir -p "$SSL_DIR" || {
colorEcho $RED " 无法创建目录: $SSL_DIR"
exit 1
}
# 设置安全权限 (700)
chmod 700 "$SSL_DIR"
fi

# 使用 curl 下载并安装 acme.sh 证书管理工具
# 设置 Let's Encrypt 账户邮箱(用于证书通知)
curl -sL https://get.acme.sh | sh -s email=$EMAIL
# 激活环境变量
source ~/.bashrc

# 升级 acme.sh 到最新版本
# 启用自动升级功能
~/.acme.sh/acme.sh --upgrade --auto-upgrade
# 设置默认证书颁发机构为 Let's Encrypt
~/.acme.sh/acme.sh --set-default-ca --server letsencrypt

# 申请证书
# --issue:申请新证书
# -d 指定域名
# --keylength ec-256:使用 ECC 椭圆曲线加密(256位)
# --standalone:使用独立模式验证(占用 80/443 端口)
# --insecure:跳过证书检查(用于测试环境)
# --pre-hook:验证前停止 Nginx(释放 80 端口)
# --post-hook:验证后重启 Nginx
~/.acme.sh/acme.sh --issue -d $DOMAIN --keylength ec-256 \
--pre-hook "systemctl stop nginx" \
--post-hook "systemctl restart nginx" \
--standalone --insecure

# 证书申请结果检查
if [[ ! -f ~/.acme.sh/${DOMAIN}_ecc/ca.cer ]]; then
echo "证书申请失败,请添加域名解析记录或等待DNS同步,稍后再试"
exit 1
fi

# 证书安装
# --key-file:私钥保存路径
# --fullchain-file:完整证书链路径
# --reloadcmd:证书更新后的自动执行命令(重启 Nginx)
~/.acme.sh/acme.sh --install-cert -d $DOMAIN --ecc \
--key-file $KEY_FILE \
--fullchain-file $CERT_FILE \
--reloadcmd "systemctl restart nginx"

# 验证证书是否成功生成
if [[ ! ( -f $CERT_FILE && -f $KEY_FILE) ]]; then
echo "证书安装失败"
exit 1
else
echo "证书申请成功"
echo $KEY_FILE
echo $CERT_FILE
fi
}

install
main