n3wFake3

局域网申请用于外网访问的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访问了.

References

comments powered by Disqus