K3终极折腾记<三> --通过ipv6域名远程访问openwrt、https证书安装配置

七、远程访问

通过前面的折腾,笔者实现了基本上所有需求。以后就结束了,谁知道chrome、Edge内网打都打不开openwrt首页!只好把Safari拉出来用一下。这肯定不行啊,继续折腾:
很显然,是谷歌大力推广的证书的问题!默认的自签证书,不被信任!
一翻搜索,都是在说什么uhttpd.crt,可笔者这个版本,压根没启动uhttpd!
K3终极折腾记<三> --通过ipv6域名远程访问openwrt、https证书安装配置_第1张图片
难道是笔者编译弄出大乌龙了?没办法只好去看了官网的介绍。很好找的,这就不放链接了,反正一大堆a、o、e、b、p、m、f什么的玩意,老外就是老外,拼音都没学好,乱拼一气,不如中国幼儿园的孩子拼得好。
经过艰难的复习了拼音后,终于搞明白了:
反正是可以没有uhttpd的,至于怎么搞没的,笔者也没深究了!为了吃点饭,笔者也不用从育苗搞起是吧,最多从收谷子搞起了。证书和uhttpd也没啥关系(只对笔者编译这个固件而言,其它的我也没有试过嘛,有其它人试过后,欢迎留言!)。
具体申请域名、安装证书什么的就不写了,贴一下下载安装证书代码好了。还有友情提醒,LEDE源码是有acme的,我还编译进去了。然后被坑了,没找着说明,那个实在看不明白怎么用所以卸了以后再来:

# 安装
curl  https://get.acme.sh | sh -s email=[email protected]
# 设个别名
alias acme.sh=~/.acme.sh/acme.sh
# 生成证书,笔者有顶级域名,就搞成这样子方便,也可以单独申请
acme.sh --issue --dns dns_ali -d example.com -d *.example.com
# 安装证书
acme.sh --install-cert -d example.com \
--cert-file      /etc/nginx/conf.d/example.com.crt  \
--key-file       /etc/nginx/conf.d/example.com.key  \
--fullchain-file /etc/nginx/conf.d/fullchain.crt \
--reloadcmd     "service nginx restart"
# 注销、移除证书
acme.sh  --revoke -d example.com
acme.sh  --remove -d example.com

重点来了:

# 路径
vi /etc/config/nginx
# 代码
config main global
        option uci_enable 'true'

config server '_lan'
        list listen '443 ssl default_server'
        # 0、下面这行被注销
        #list listen '[::]:443 ssl default_server'
        option server_name '_lan'
        list include 'restrict_locally'
        list include 'conf.d/*.locations'
        # 1、下面这行被注销
        #option uci_manage_ssl 'self-signed'
        option ssl_certificate '/etc/nginx/conf.d/fullchain.crt'
        option ssl_certificate_key '/etc/nginx/conf.d/example.com.key'
        option ssl_session_cache 'shared:SSL:32k'
        option ssl_session_timeout '64m'
        option access_log 'off; # logd openwrt'

config server '_redirect2ssl'
        list listen '80'
        # 2、下面这行被注销
        #list listen '[::]:80'
        option server_name '_redirect2ssl'
        option return '302 https://$host$request_uri'

仅仅只是修改此文件中的证书文件名是没用的,被注销的1处代码会自动生成自签名证书,所以重新登陆还是openwrt证书!
注销1处代码后才能换成acme生成的证书!但这样也只是换了个证书,啥用也没有!内网ip访问时这证书没用的。
注:nginx用的是fullchain!很多抄来抄去的文章乱扯一通!
所以笔者又注销了0处和2处的代码,空出这二个ip加端口,准备自己写一个server。
查看原/etc/nginx/conf.d/uci.conf,这个文件是在nginx起动时,根据模版文件(不是关键,就不找路径了)和/etc/config/nginx配置文件自动生成的。直接改是没用的!当然也有办法改的,怎么直接改不是关键就不说了!

       root /www;                                                             
                                                                        
       server { #see uci show 'nginx._lan'                                    
               listen 443 ssl default_server;                                
               server_name _lan;                                             
               include restrict_locally;                                     
               include conf.d/*.locations;                                   
               ssl_certificate /etc/nginx/conf.d/fullchain.crt;              
               ssl_certificate_key /etc/nginx/conf.d/example.com.key;           
               ssl_session_cache shared:SSL:32k;                             
               ssl_session_timeout 64m;                                      
               access_log off; # logd openwrt;                               
       }                                                                     
                                                                             
       server { #see uci show 'nginx._redirect2ssl'                          
               listen 80;                                         
               server_name _redirect2ssl;                         
               return 302 https://$host$request_uri;              
       }                                                          
                                                                  
       include conf.d/*.conf;

以上是笔者改过/etc/config/nginx后生成的文件,并不影响阅读。也就少了二个ip加端口的配置信息和自签名信息。
从此文件可以看到include conf.d/*.conf这一行, 说明它可以自定义server,写成xx.conf放在conf.d下面就行了。
所以笔者又在conf.d下自己写了一个example.com.conf的配置文件:

# 路径
vi etc/nginx/conf.d/example.com.conf
# 写入的代码
server {
      listen [::]:443 ssl;
      server_name example.com;   
      include conf.d/*.locations;
      ssl_certificate /etc/nginx/conf.d/fullchain.crt;
      ssl_certificate_key /etc/nginx/conf.d/example.com.key;
      ssl_session_cache shared:SSL:32k;                  
      ssl_session_timeout 64m;         
      access_log off; # logd openwrt;
      # location / { ... } # root location for this server.
} 

笔者只写了ipv6的443端口,读者也可以换成其它端口,那样都不用注销前面的0和2处的代码。甚至0、1、2三处都不注销也行,自己写个server就ok了,只是笔者觉得有正经证书,就把自签给免了!内网要ipv6也没用,还占了一个ipv6:80和一个ipv6:443。太浪费结果如图:
K3终极折腾记<三> --通过ipv6域名远程访问openwrt、https证书安装配置_第2张图片

上图是使用内网ip访问,一样只能在safari中信任后打开,就是换了个正经的证书。
K3终极折腾记<三> --通过ipv6域名远程访问openwrt、https证书安装配置_第3张图片
只有用ipv6域名访问才是正常的,能在chrome、Edge中正常打开!

注:本文所用的example.com只是为了示例,请根据实际情况修改,本文所用域名ipv6.example.com为AAAA解析(ipv6地址),其余为A解析(ipv4地址)
另注:从原代码来看,还有一个超简单的远程ipv6访问的办法:

 # 路径
vi /etc/nginx/restrict_locally

 # 最后增加一行
 allow ::1;
        allow fc00::/7;
        allow fec0::/10;
        allow fe80::/10;
        allow 127.0.0.0/8;
        allow 10.0.0.0/8;
        allow 172.16.0.0/12;
        allow 192.168.0.0/16;
        allow 169.254.0.0/16;
        # 下面这行新增
        allow ::/0  # 或allow 240e::/10 或其它写法,与读者所在的ipv6地址相关
        deny all;

仅此,用ipv6地址或域名就可以远程访问了,当然证书还是openwrt自签的。自然也可以改了此文件后根据本文的方法换acme申请证书或其它证书!毕竟写server太麻烦嘛

原创文章 未经许可 严禁转载

你可能感兴趣的:(网络运维,https,nginx,ssl,openwrt,acme证书)