局域网申请用于外网访问的HTTPS
本文是记录域名记录指向家宽公网IP并开启HTTPS便于日后使用
主要功能:
1. NGINX反代实现外网访问本地docker容器服务
2. acme.sh搭配DNSPod实现申请免费SSL证书
3. 其他一些关于NGINX的使用
使用工具:
1. acme.sh
2. DNSPod
3. NGINX
4. Docker
本文使用的是acme.sh的DNS验证申请SSL证书(使用的是电信宽带,即使使用路由器的DDNS功能也无法使用80端口,故使用DNS验证)
创建DNSPod密钥对
登录DNSPod后,找到账号中心->密钥管理创建用于acme.sh的密钥对,并保存到本地.
使用此方法的前提是必须域名所使用的dns服务器必须指向dnspod所要求的服务器,详情请搜索相关资料.
回到Ubuntu,将刚刚申请的密钥对设置到环境变量中
export DP_Id="Your DNSPod Id"
export DP_Key="Your DNSPod Token"
也可以添加到~/.bash_profile中设置永久生效,格式同上,添加到文件末尾即可.
申请SSL证书
~/.acme.sh/acme.sh --issue --dns dns_dp -d sub.domain.com
等待1~2分钟,申请完成后会在~/.acme.sh/sub.domain.com目录下生成对应的证书文件.
# 将证书文件夹以软连接方式在你的NGINX证书放置文件中
cd ~/.acme.sh/ && ln -ds $PWD/sub.domain.com /etc/nginx/cert.d/
等到申请完成成功后,安装证书到指定目录(最好是nginx目录下).
acme.sh --issue --dns dns_dp -d sub.domain.com --installcert \
--key-file /usr/local/nginx/cert.d/sub.key\
--fullchain-file /usr/local/nginx/cert.d/sub.pem\
--reloadcmd "sudo nginx -s reload"
NGINX配置
upstream docker_gitea {
# docker容器
server 127.0.0.1:3000;
}
server {
# logging
access_log /var/log/nginx/sub.domain.com.access.log;
error_log /var/log/nginx/sub.domain.com.error.log warn;
listen 8891 ssl http2;
server_name sub.domain.com;
#add_header X-debug-message "$https-$scheme" always;
if ( $scheme != 'https' ) {
return 301 https://$host:8891$request_uri;
}
ssl_certificate ../cert.d/fullchain.cer;
ssl_certificate_key ../cert.d/sub.domain.com.key;
ssl_protocols TLSv1.3;
ssl_ciphers TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256;
ssl_prefer_server_ciphers on;
# ssl_early_data on;
ssl_stapling on;
ssl_stapling_verify on;
error_page 497 /497.html;
location /497.html {
return 301 "<a href='https://$host:8891$request_uri'>Click</a>";
}
location / {
proxy_pass http://docker_gitea;
}
}
然后重启NGINX,已经是全站HTTPS访问了.