前言
家宽的端口不可能给你80和443,当然其他端口也够自己用了,但是没有ssl是不是不够高级安全,这里就简单搞一下。
安装Certbot
Ubuntu下安装certbot很简单,使用snap安装即可:
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
申请SSL证书
接下来进入主题,开始SSL证书的申请。
运行Certbot命令
首先是运行certbot的证书申请命令,需要注意的点是验证模式要用DNS-TXT的方式,-d后面跟要申请的域名,我这里申请的是泛域名。
命令如下:
sudo certbot certonly --preferred-challenges dns -d "*.你的域名.com" --manual
这时certbot会提醒你在域名DNS解析记录中添加记录,登录阿里云DNS解析,点击添加记录,记录类型选择TXT,将域名和值填进去。添加记录条目后,点击终端中提供的Dig网址,如果解析结果和certbot提供的值相同,则表示添加记录成功。
返回到终端,回车继续验证,没问题的话,certbot会提示这个证书不会自动更新(因为是手动申请的)。此时证书已经申请成功了,存放在/etc/letsencrypt/live/你的域名.com
中。
配置Nginx
找到Nginx中https server的配置代码块,添加如下字段:
# SSL
ssl_certificate /etc/letsencrypt/live/你的域名.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/你的域名.com/privkey.pem;
# SSL config
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
重新加载Nginx配置:
sudo service nginx reload
刷新一下随便那个网站,就能看到已经是安全的HTTPS连接了。
方便加域名的脚本
这里nginx路径可以自定义
touch add_nginx_conf.sh
chmod +x add_nginx_conf.sh
vim add_nginx_conf.sh
输入:set paste
进入粘贴模式,粘贴以下内容。
#!/usr/bin/env bash
nginx_conf_dir="/etc/nginx/conf/conf.d"
GreenBG="\033[42;37m"
Font="\033[0m"
# 提示用户输入域名变量
read -p "请输入域名: " domain
# 检查是否输入为空
if [ -z "$domain" ]; then
echo "域名不能为空,请重新运行脚本并输入有效的域名。"
exit 1
fi
read -p "请输入证书路径: " ssl_dir
if [ -z "$ssl_dir" ]; then
echo "请输入证书路径,请重新运行脚本并输入有效的证书路径。"
exit 1
fi
# 提示用户输入域名变量
read -p "请输入反代端口(你本地项目服务端口): " proxy_port
# 检查是否输入为空
if [ -z "$proxy_port" ]; then
echo "请输入端口(你本地项目服务端口),请重新运行脚本并输入有效的端口。"
exit 1
fi
read -p "请输入反代ip(你本地项目服务ip): " proxy_ip
if [ -z "$proxy_ip" ]; then
echo "请输入反代ip(你本地项目服务ip),请重新运行脚本并输入有效的ip。"
exit 1
fi
judge() {
echo -e "${OK} ${GreenBG} $1 完成 ${Font}"
sleep 1
}
nginx_conf_add() {
touch ${nginx_conf_dir}/${domain}.conf
cat >${nginx_conf_dir}/${domain}.conf <<EOF
server {
listen 9999 ssl http2;
listen [::]:9999 http2;
ssl_certificate ${ssl_dir}/fullchain.pem;
ssl_certificate_key ${ssl_dir}/privkey.pem;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5;
server_name ${domain};
index index.html index.htm;
# 无brotli可以删掉下面brotli相关
brotli on; #启用
brotli_comp_level 6; #压缩等级,默认6,最高11,太高的压缩水平可能需要更多的CPU
brotli_buffers 16 8k; #请求缓冲区的数量和大小
brotli_min_length 20; #指定压缩数据的最小长度,只有大于或等于最小长度才会对其压缩。这里指定20字节
brotli_static always; #是否允许查找预处理好的、以.br结尾的压缩文件,可选值为on、off、always
brotli_window 512k; #窗口值,默认值为512k
# Config for 0-RTT in TLSv1.3
ssl_early_data on;
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security "max-age=31536000";
location /
{
proxy_redirect off;
proxy_read_timeout 1200s;
proxy_pass http://${proxy_ip}:${proxy_port};
proxy_http_version 1.1;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header Upgrade \$http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host \$http_host;
# Config for 0-RTT in TLSv1.3
proxy_set_header Early-Data \$ssl_early_data;
}
}
server {
listen 80;
listen [::]:80;
server_name ${domain};
return 301 https://${domain}\$request_uri;
}
EOF
judge "Nginx 配置新增成功"
}
nginx_conf_add
再执行,按照提示填写
sh add_nginx_conf.sh
Q.E.D.