V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Inzufu
V2EX  ›  程序员

内网 IP 是否有必要上 HTTPS,如果有必要,应该怎么做

  •  1
     
  •   Inzufu ·
    Lilac-milena · 41 天前 via Android · 8528 次点击
    这是一个创建于 41 天前的主题,其中的信息可能已经有所发展或是发生改变。
    看 pve 默认内网 ip 就加了自签的 https 证书,可以在一定程度上防止数据在中途被劫持。

    我目前想了几种方法:
    1. 自签 IP 证书:
    浏览器弹不信任是小事,就是有时候编程请求 api 的时候直接就因为 https 校验失败就报错了。
    2. 使用实际持有的域名
    2.1 把域名解析到本地 IP:每个网络的本地网络环境都不一样,把域名解析到一个未知的 IP 地址感觉不太好。
    2.2 在本地 DNS 把域名解析到局域网
    要求每台机器都修改 hosts 或 DNS 服务器,有些麻烦。

    那看来就真的没办法了吗
    68 条回复    2024-08-08 14:08:03 +08:00
    yadiman
        1
    yadiman  
       41 天前   ❤️ 1
    自签内网 ip 或者内部域名用 mkcert 。
    有一点要注意,有部分服务是不支持 ip 证书签名的,比如:lucky 和 Nginx (起码我搞不定)
    koloonps
        2
    koloonps  
       41 天前
    @yadiman mkcert 不是可以的吗?
    yadiman
        3
    yadiman  
       41 天前
    mkcert 可以签发 ip 或者域名证书。但有的引擎安装不了 ip 证书。
    pve ,openwrt ,爱快等可以。
    但 lucky (一个国产端口转发工具)还有 NGINX 无法使用。
    mohumohu
        4
    mohumohu  
       41 天前   ❤️ 2
    ·申请泛域名证书
    ·192.168.1.1.yourdomain.com
    lcy630409
        5
    lcy630409  
       41 天前   ❤️ 3
    没必要为了上 https 而上 https
    内网本来就是安全的话 何必多此一举呢,还得专门维护,要是有一次证书到期忘记了 还影响业务
    kenvix
        6
    kenvix  
       41 天前
    @mohumohu #4 点分是新的域名
    mohumohu
        7
    mohumohu  
       41 天前
    @kenvix 新域名有啥问题
    forty
        8
    forty  
       41 天前
    内网机器其实是能够被统一管理的,可以初始化成统一的内网 DNS ,不用每台机器挨个去改 hosts 的。

    内网 DNS 上面将域名解析到内网 IP ,然后使用 CSR 生成公网域名证书就可以了,也不存在安全问题。
    如果很犟就是不想用公网域名证书,那就统一安装自签 CA 证书即可。
    建议不要用 IP 证书,内网环境尽量模拟外网情况,能够更方便开发与调试。
    Mitt
        9
    Mitt  
       41 天前
    @mohumohu #4 泛域名证书不支持递归,只能是 *.yourdomain.com 不能是 *.*.yourdomain.com
    chf007
        10
    chf007  
       41 天前
    内网加不加无所谓,我的 pve 加了只是为了浏览器打开没有警告,好看
    mohumohu
        11
    mohumohu  
       41 天前
    @Mitt 替换成-就好了
    yichya
        12
    yichya  
       41 天前   ❤️ 2
    可以考虑在 2.1 的基础上搭配一个大局域网方案( Zerotier / Tailscale / Tinc 之类)。大部分设备也有客户端,对于固定的网络环境也可以考虑装在 NAT 网关上,就不用每个设备都装客户端

    @lcy630409 上 https 很多时候是因为现代浏览器的默认安全策略,比如不开 https 的话一些剪贴板 API 之类是不能用的。证书维护有很多自动化方案去做,基本上不用太操心

    @yadiman 自签证书,主要还是每台设备都要专门信任一次根证书,麻烦还是其次,有些设备可能是不方便(不是不能,但是不方便)塞根证书进去的

    @Mitt 这个倒是小问题,192-168-1-1.yourdomain.com 也不是不能用,很多 pcdn 都用这种路子
    totoro625
        14
    totoro625  
       41 天前   ❤️ 1
    我选择了 2 ,通过 acme 在一张证书上申请了多个泛域名,每个网络对应一个泛解析,网络环境多变也只是改变其中的泛解析
    例如 demo 服务,A 地用 demo.a.example.com ,B 地用 demo.b.example.com ,全部指向内网的一台 NGINX 服务器,通过前缀的 demo 进行分流到对应的服务
    srlp
        15
    srlp  
       41 天前 via iPhone
    tailscale 自动带了 https
    yinmin
        16
    yinmin  
       41 天前 via iPhone   ❤️ 5
    大厂的做法是:使用实际持有的域名部署公共证书,然后部署内部 dns ,仅在内网才能解析出域名对应的 ip 地址。
    xiangyuecn
        17
    xiangyuecn  
       41 天前
    证书 *.xxx.com 不匹配 *.xx.xxx.com 就离谱的很,有点满清遗老那味

    *.xxx.com 不匹配 xxx.com ,这玩意又不涉及 dns 解析,烂货😂
    wheat0r
        18
    wheat0r  
       41 天前   ❤️ 2
    考虑零信任思想的话,需要的
    IvanLi127
        19
    IvanLi127  
       41 天前   ❤️ 1
    方法二,如果路由支持,可以在路由器上配 hosts ,配完只要 dns 用路由的,局域网内就能全部生效,缺点就是加个域名得配一遍。
    iceheart
        20
    iceheart  
       41 天前 via Android
    买个域名+免费证书
    kennylam777
        21
    kennylam777  
       40 天前 via Android
    我的 PVE 及 Opnsense 都有正式的證書,因為我就有一個域名,用 ACME + DNS-01 也算方便。

    本來就有一堆東西需要內網解析,倒也不難。
    wzw
        22
    wzw  
       40 天前 via iPhone
    @yinmin #16 移动端和不同网络 测试的时候,怎么办。

    另外一样的话,会不会误操作
    busier
        23
    busier  
       40 天前 via iPhone
    OpenSSL 建立 ca 自发啊
    yyysuo
        24
    yyysuo  
       40 天前
    没有必要。
    kennylam777
        25
    kennylam777  
       40 天前
    PVE 自帶 ACME 本來就十分簡單, 自動維護的, 我實在看不到不設定的理由, 而且好處多多, VNC 連線也比較順利。

    況且局域網不是用 DHCPC 分發 DNS 的嗎?都這種規模難道沒有本地 DNS? 為甚麼要手動設定 Host?

    而且 PVE 主機的 IP 是固定的, 為甚麼會每個局域網也需要設定一次?

    不過近期和一些中國開發者合作, 對方連公網都不用 HTTPS, 甚麼 Nacos 等亂七八糟的東西都直接用公網 HTTP 無加密連線, 就只有一個限制 IP 地址的防火牆, 甚麼 MySQL 密碼的都在國際雲上用 HTTP 直接通過 GFW 連回去中國辦公室的固定 IP 就是了, 這個國家的人似乎特別討厭 HTTPS 似的。
    ladypxy
        26
    ladypxy  
       40 天前
    内网机器直接加入 AD ,然后 AD 签发证书就好
    villivateur
        27
    villivateur  
       40 天前
    我都是自己的 CA 签名自己的内网专用域名,内网 DNS 解析,要教程的见:

    https://blog.vvzero.com/2023/01/20/self-signed-certificate-with-SAN/
    zwlinc
        28
    zwlinc  
       40 天前   ❤️ 1
    证书这个东西和你域名指向的 IP 没啥关系,大可以用 let‘s encryption 签,然后解析到内网即可
    NessajCN
        29
    NessajCN  
       40 天前
    我一般不会给自己家里卧室厨房厕所都装防盗铁门,
    当然我不清楚楼主的习惯所以也只是说一下我自己的做法
    superchijinpeng
        30
    superchijinpeng  
       40 天前
    没必要用 ip ,域名解析到内网 ip 就行,caddy 自动 https
    knightgao2
        31
    knightgao2  
       40 天前
    https 其他不清楚,但是浏览器没 https 很多用不了
    qsnow6
        32
    qsnow6  
       40 天前
    我没记错的话,对于自回环或者 LAN 是有免签域名的
    keyfunc
        33
    keyfunc  
       40 天前
    建议上,现代的浏览器对于 http 有各种限制,http 让浏览器保存密码这件事就很麻烦
    MFWT
        34
    MFWT  
       40 天前   ❤️ 1
    我习惯是直接上自签名证书,然后使用的设备信任一下

    缺点嘛.....似乎安卓只能导入 SHA-1 的证书,也不确定是不是我哪里没做对
    forvvvv123
        35
    forvvvv123  
       40 天前
    @zwlinc

    正解,就用权威证书,内网访问都弄个域名即可
    jenson47
        36
    jenson47  
       40 天前
    stepca 自己部署服务,自己签,而且还可以打破公有证书的时间限制呢~
    lovelylain
        37
    lovelylain  
       40 天前   ❤️ 1
    1.没必要用 ip 证书,你都内网了,ip 证书肯定得自签名,自签名就得客户端导入根证书,还不如域名更好记
    2.更没必要用 ip.yourdomain.com 的证书,统一分配域名,安全性更好
    3.反正都要配置,最好的做法就是楼上说的,使用实际持有的域名部署公共证书,然后部署内部 dns ,仅在内网才能解析出域名对应的 ip 地址
    cccer
        38
    cccer  
       40 天前   ❤️ 1
    自签也比 http 好,新版 chrome 会各种阻止 http 或者自动跳 https ,导致访问异常。
    zyq2280539
        39
    zyq2280539  
       40 天前
    内网同样可以申请公网域名哈,只不过需要公网 VPS 辅助一下,我现在方案:DNS 解析:腾讯云, 公网 VPS:腾讯云,家里小主机:迷你主机,vps 和家里主机上同时安装 nginx,一开始都用 80 端口,vps 主机上 nginx 反向代理家里小主机的 nginx,然后组网工具用 tailscale, vps 上用 certbot 申请 ssl 证书,然后家里小主机上也同样用 certbot 申请证书就可以了,都申请完毕之后 VPS 要反 https://内网域名, vps 要写死 hosts 指向家里小主机,基本没啥问题,家里有 bind9 做了内网 DNS 解析,很完美的实现
    lneoi
        40
    lneoi  
       40 天前   ❤️ 1
    chrome 在非 https 下有不同的安全限制. 如果内网对信息管控有一点要求, 上个 https 也安全一些, 毕竟是内网就不设防也挺危险的
    zyq2280539
        41
    zyq2280539  
       40 天前   ❤️ 1
    总结下来,核心点,两层 nginx,配合 certbot,certbot 的 nginx 插件
    1. VPS 上正常解析,申请 ssl 证书,
    2. tailscale 组网,vps 上的 nginx 反向代理家里 mini 主机的 nginx 的 80 端口都用域名访问,但是要设置 vps 的 hosts 否则就造成了循环解析,设置完毕 hosts 之后就正常引入流量到家里小主机上了
    3. 家里小主机上同样用 certbot 申请 ssl 证书,申请完毕后此时家里小主机的 80 端口会被自动重定向到 443 端口
    4. 修改 vps 上反向代理端口从 80 改到 443 即可。
    5. 局域网内有 bind 配置自己的解析服务,家里局域网都解析到内网了,不在家里的时候解析先到腾讯云然后再到家里小主机上

    本人此方案正常使用好几年了,没啥问题。不过最近发现泛域名证书好像更好用,反而不用这么麻烦的修改
    zwlinc
        42
    zwlinc  
       40 天前   ❤️ 1
    @zyq2280539 内网可以不用 http-01 challenge ,用 dns-01 challenge 就行了,证明这个域名属于你就行
    zyq2280539
        43
    zyq2280539  
       40 天前
    @zwlinc 对,我以前都是用 http 验证,最近发现用 dns 验证也挺好的,还搞了泛域名做尝试
    Zzdex
        44
    Zzdex  
       40 天前   ❤️ 1
    我是家里有一套 k8s, 所有 web 服务 都通过 ingress 做入口,然后 证书靠 cert-manager 做自动签发,配置一次 之后就不管了

    内网 靠 家里 的 dns 解析到 ingress lb

    外网 就是家里的 ip

    麻烦一点就是 运营商不开放 443 ,所以外面访问都得带一个端口 8443 之类的。

    其实也还好,家里也用 8443 得了,内外访问体验一致。
    Inzufu
        45
    Inzufu  
    OP
       40 天前 via Android
    @forty @yinmin @iceheart @IvanLi127 @lovelylain 谢谢,那看来这就是最好的方案了。

    @NessajCN 现在不都讲究一个“零信任”的原则嘛,假设内网网络设备有问题,这样也保险。

    @busier @jenson47 自签证书浏览器不信任,而且编程访问的时候会因为证书校验失败报错。

    @MFWT 考虑过这种方法了,但是我自己也不敢绝对保证自签证书私钥的安全(最起码不能像权威 ca 机构那样保证),所以还是没有信任自己的证书。
    busier
        46
    busier  
       40 天前
    @Inzufu 自己 CA 加到受信任证书列表啊。加一次 CA 根证书就可以了,又不是让你用自签证书每次自签都要加信任

    再说人家企业用 AD 域的,不是也 DC 配置自动下发企业 CA 的。
    chinni
        47
    chinni  
       40 天前
    acme dns 验证下就好了 直接 dns 记录 写内网呗 弄个泛域名就好了
    n18255447846
        48
    n18255447846  
       40 天前
    公网 ip+域名申请的 ssl 证书可以用吧,内网改下 dns 不就得了。自签名的证书主要是信任问题,公网正常申请的证书拿来即用
    mengyx
        49
    mengyx  
       40 天前 via Android
    我们是专门注册一个域名,然后使用 ACME DNS Challenge 签发证书
    mengyx
        50
    mengyx  
       40 天前 via Android
    @mengyx 然后在域名的权威 DNS 内将域名解析到内网 IP
    zbowen66
        51
    zbowen66  
       40 天前 via iPhone   ❤️ 1
    我的设备太多,自签证书要一个一个安装到设备,太麻烦,所以我来真的,Certbot 自动续签,一步到位。
    zbowen66
        52
    zbowen66  
       40 天前 via iPhone
    @lcy630409 #5 有些服务比如 bitwarden 强制要求 https ,还有浏览器不允许 https 网页上的插件或脚本请求 http 服务
    815979670
        53
    815979670  
       40 天前   ❤️ 1
    从安全的角度来说还是有的,之前我从自身的项目需求出发 总结过一篇博客 https://www.dbkuaizi.com/archives/381.html
    Jacob7ung
        54
    Jacob7ung  
       40 天前   ❤️ 1
    是担心内网嗅探吗?如果有访客,弄个访客网络呢,还是其他考虑。
    我是为了 bitwarden ,弄得 duckdns 配合 Nginx Proxy Manager ,优点就是不用弄证书,缺点就是 duckdns.org 的后缀。
    Twnysta
        55
    Twnysta  
       40 天前   ❤️ 1
    内网 ip 如果是固定的话,买一个域名,然后解析地址改成内网地址,然后可以使用 dns api 脚本去签免费的证书。
    sunmker
        56
    sunmker  
       40 天前   ❤️ 1
    因为想要用 js 的复制到剪贴板功能,chrome 说不是 https 不让用
    然后绕了一大圈,上了 https ,谷歌还是说我 [此站点不安全] ,用是能用了,就是有点丑
    lisongeee
        57
    lisongeee  
       40 天前   ❤️ 1
    浏览器下非 https/localhost 的域名的 js 环境缺失了很多对象和功能,如果不在意这些功能,就可以不用 https
    luolw1998
        58
    luolw1998  
       40 天前
    nip.io ,比如访问 127.0.0.1 ,改成 127.0.0.1.nip.io 就行
    bkdlee
        59
    bkdlee  
       40 天前
    我用的是子域名,做了反向代理。然后就能签证书了。
    wxm1997
        60
    wxm1997  
       40 天前
    @wzw #22 我们这边是纯内部服务用一个域名,仅内网 dns 解析。内外混合是另一个域名,内网和外网解析的 ip 不一样,纯外部服务还有一个对外的域名
    dzdh
        61
    dzdh  
       40 天前
    自己做 ca 呗
    hxtheone
        62
    hxtheone  
       40 天前 via iPhone
    自有域名, 内网用 openwrt 接管 dns 解析到内网, caddy 加一层反代上 https 然后自动续签, 无脑得很, 而且可以做到内外网用同样的域名访问无缝切换
    libook
        63
    libook  
       40 天前   ❤️ 1
    有的服务要求必须 HTTPS ,以及一些浏览器 API 不走 HTTPS 不能用。

    可以走 DNS Challenge ,可以参考这个 https://letsencrypt.org/docs/challenge-types/#dns-01-challenge
    hzwzo1
        64
    hzwzo1  
       40 天前   ❤️ 1
    内网 dns 服务器配置域名解析到本地 ip 就可以了,外网解析到暴露的公网 ip ,这样内外网体验一样
    laminux29
        65
    laminux29  
       40 天前   ❤️ 1
    1.HTTPs 是用来保障安全的,当然要加,而且现在已经是标准了。

    2.内网自用的场景,直接自签就行了。自建一个 CA ,然后用 CA 给服务或服务器自签证书。每台新设备入网时,把 CA 的证书导入到 CA 区域就行。
    Inzufu
        66
    Inzufu  
    OP
       40 天前 via Android
    感谢各位的建议,最后的方案是把自己域名的 *.internal.example.com 在内网 dns 服务器中解析到了本地 ip 地址。
    证书用了 let's encrypt 签发。
    要让浏览器信任证书,看来没有更简单的办法啦。
    imydou
        67
    imydou  
       39 天前 via iPhone
    我们是内网部署的 caddy ,所有流量通过 caddy 转发
    murchef
        68
    murchef  
       39 天前
    内网有个 bitwarden 自建,我就 docker 起 NPM ,用 DNS 认证一个 Let's Encrypt 证书(自己要有域名),然后 NPM 做个反代指向 bitwarden ,最后路由器( ADG HOME )把域名指向 NPM 就好了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   896 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 20:09 · PVG 04:09 · LAX 13:09 · JFK 16:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.