局域网配置反向代理和SSL证书
本文最后更新于36 天前,其中的信息可能已经过时,如有错误请发送邮件到1979007616@qq.com

众所周知,局域网搭建服务一般都是使用192.1681.1:9000这种IP+端口的方式访问,默认监听的是80端口,使用的是HTTP,不用做过多设置就能使用服务。但是对于一些特殊场景,比如有些服务强制要求HTTPS(比如Bitwarden密码管理工具),并且使用IP+端口的方式容易暴露端口,虽然局域网内做这些设置是多此一举,这对强迫症简直是煎熬。如下图:

反向代理

反向代理介绍:终于有人把正向代理和反向代理解释的明明白白了!-腾讯云开发者社区-腾讯云

概念性的东西属实是我不擅长的,在我的理解中将目标服务器:192.168.1.1:9000的访问方式改成proxy.example.com,这就是反向代理,下面就看看怎么实现。

以nginx服务为例,编辑或新建配置文件:vim /etc/nginx/sites-available/bitwarden,添加以下内容

server {
     listen 80;
     #请填写绑定证书的域名
     server_name bitwarden.example.com;
     #把http的域名请求转成https,强制https
     #return 301 https://$host$request_uri;

     location / { 
       proxy_pass http://localhost:9000;
       proxy_set_header Host $host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header X-Forwarded-Proto $scheme;
     }
}

创建符号链接:将配置文件链接到 sites-enabled 目录,使其生效

sudo ln -s /etc/nginx/sites-available/bitwarden /etc/nginx/sites-enabled/

测试配置文件,并重启nginx服务生效

nginx -t
systemctl restart nginx

添加DNS解析

由于是在局域网访问,所以我们还需要DNS去解析域名,如果有DNS服务器就直接在服务器上添加一条解析记录指向bitwarden.example.com

如果没有,就需要在目标电脑的hosts文件中添加一条记录,以Windows为例,在路径C:\Windows\System32\drivers\etc下。如果有多条记录就多写几条。

192.168.1.1 bitwarden.example.com

通过这样的配置,你可以通过 http://bitwarden.example.com 访问运行在 9000 端口上的服务。

手机端如果也想访问,应该也有一个文件需要修改,有空再深入了解。

SSL证书

网上有很多免费证书申请网站,比如:FreeSSL.cn来此加密,使用方法因人而异,我试了一下好像都不适合局域网使用。所以我使用自建可信任的SSL证书,使用的证书工具是openssl

生成CA证书和服务器证书

安装openssl工具,ubuntu系统自带好像自带这个工具

apt update
apt install openssl
# 验证
openssl version

创建CA证书

第一步是创建一个秘钥,这个便是CA证书的根本,之后所有的东西都来自这个秘钥。

# 通过rsa算法生成2048位长度的秘钥
openssl genrsa -out myCA.key 2048

第二步是通过秘钥加密机构信息形成公钥:

# 公钥包含了机构信息,在输入下面的指令之后会有一系列的信息输入,这些信息便是机构信息,公司名称地址什么的
# 这里还有一个过期信息,CA证书也会过期,openssl默认是一个月,我们直接搞到100年
openssl req -utf8 -new -x509 -key myCA.key -out myCA.cer -days 36500

这一步需要输入的机构信息有点多,分别说一下:

参数名称参数值
Country Name国家代码,比如中国就是CN
State or Province Name省名称
Locality Name城市名称
Organization Name机构名称
Organizational Unit Name机构单位名称
Common Name重点参数:授权给什么,因为机构是根节点所以是授权给自己
Email Address邮件地址

除了Common Name填服务器IP或域名,其他信息好像可以随便填,测试数据较少,填错了暂时没发现异常。

创建服务器证书

在得到CA证书之后,需要通过openssl工具对证书进行转换得到公钥(.crt文件)和密钥(.key文件),

第一步通过openssl工具创建服务器的秘钥:

# 通过RSA算法生成长度2048位的秘钥
openssl genrsa -out server.key 2048

第二步这里是创建一个签名请求,需要将服务器信息写入到请求文件之中,然后通过CA机构证书对请求签名形成服务器证书公钥。

首先https证书的公钥不同于自定义情况下的加密证书,这里需要安装浏览器标准进行配置,首先openssl默认的证书版本是V1,V1在支持https时部分浏览器依旧会认为不安全,所以需要使用V3版本;同时openssl即便是使用V3版本依旧没有附带V3的subjectAltName字段数据(这里是证书对应的IP地址或者域名,可以用通配符)。

但是这些东西命令行没法指定所以需要配置文件,新建openssl.cnf文件,放到生成的服务器证书文件的目录下(注意:修改alt_names里面的域名或者IP为最终部署需要的地址,支持通配符)。原作者有一个默认版本,使用sha1算法生产的证书,但是部分浏览器已经已经不信任该算法了。我这里【使用sha384代替默认的sha1】。

保存后执行创建签名申请文件,运行:

# 和创建CA时一样这里需要输入一堆服务器信息,输入项也是相同的。
# 不过在输入Common Name(CN)最好直接输入服务器的IP地址或者域名。
openssl req -utf8 -config openssl.cnf -new -out server.req -key server.key 

通过CA机构证书对服务器证书进行签名认证,获得服务器公钥。

将签名请求文件进行签名最终得到服务器的公钥
openssl x509 -req -extfile openssl.cnf -extensions v3_req -in server.req -out server.cer -CAkey myCA.key -CA myCA.cer -sha384 -days 36500 -CAcreateserial -CAserial serial

最终得到server.key就是秘钥,server.cer文件就是公钥,配置给nginx。

配置nginx

编辑nginx服务的配置文件:vim /etc/nginx/sites-available/bitwarden,新增下面配置:

server {
     #SSL 默认访问端口号为 443
     listen 443 ssl;
     #请填写绑定证书的域名
     server_name bitwarden.example.com;
     #请填写证书文件的相对路径或绝对路径
     ssl_certificate  /ssl/server.cer;
     #请填写私钥文件的相对路径或绝对路径
     ssl_certificate_key /ssl/server.key;
     ssl_session_timeout 5m; 
     #请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
     ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
     #请按照以下协议配置
     ssl_protocols TLSv1.2 TLSv1.3;
     ssl_prefer_server_ciphers on; 

     location / { 
       #网站主页路径。此路径仅供参考,具体请您按照实际目录操作。 
       #例如,您的网站主页在 Nginx 服务器的 /etc/www 目录下,则请修改 root 后面的 html 为 /etc/www。
       proxy_pass http://localhost:9000;  # 或者容器内部的相应端口
       proxy_set_header Host $host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header X-Forwarded-Proto $scheme;
       #root html;
       #index index.html index.htm;
     }
}

如果想让访问的域名强制HTTPS,需要在反向代理的配置中取消以下配置的注释。

#把http的域名请求转成https,强制https
return 301 https://$host$request_uri;

重新加载 Nginx 配置:nginx -s reload

信任CA机构证书

最后还需要将CA证书的公钥(myCA.cer文件)导入到【受系统信任的根证书颁发机构】里面。

打开windows主机的Internet选项->内容->证书,导入即可。

如果还是不能通过https访问,可以清除一下浏览器缓存,重启浏览器试试。

在对证书进行信任之后通过https打开浏览器进入内网DNS或者host配置的域名便可以得到没有任何警告的内容的安全连接:

拓展

我陷入了一个知识误区,我在腾讯云申请了好多证书,但是都没有生效,现在才知道原来是我没有在WEB服务器(nginx、apache)配置文件中配置证书,所以没有生效。

现在根据官方文件进行实践一下:SSL 证书 Nginx 服务器 SSL 证书安装部署(Linux)-证书安装-文档中心-腾讯云 (tencent.com)

宝塔面板安装的nginx配置文件路径:/www/server/panel/vhost/nginx

正常情况下nginx默认路径:/etc/nginx

相关链接

局域网内搭建浏览器可信任的SSL证书 – 唐玥璨 | 博客 (tangyuecan.com)

SSL 证书 Nginx 服务器 SSL 证书安装部署(Linux)-证书安装-文档中心-腾讯云 (tencent.com)

小提示:您可以通过RSS订阅本站文章更新,订阅地址:https://blog.xmhweb.cn/feed

评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇