Nginx:使用OpenSSL生成自签名CA证书,实现通过 HTTPS 访问

564 阅读4分钟

Windows

我的本地电脑是win10系统,连接了公司wifi,并且分配到局域网IP 192.168.0.75

(可以通过打开cmd执行ipconfig,找到WLAN下的IPv4地址)

我想把此电脑作为一个web服务器来用,所以安装启动nginx服务,于是现在我和公司其他人可以通过 http://192.168.0.75 访问我的电脑了,并弹出nginx欢迎页

但是现在有了新需求,http访问有个安全问题,导致某些场景被浏览器针对,例如非https网页不允许调用用户摄像头,对webrtc之类的应用就没法正常运行

为了扩展我web服务的能力,我打算为本电脑局域网IP配置自签名证书,并配置到nginx,再到客户端导入证书,最终目标效果:

可以通过以下2种方式,使用https协议访问到我的nginx首页

以下开始记录

安装openssl

安装

官网:Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions

下方选择 Win64 OpenSSL xxx Light 的 exe 下载,一直下一步安装完成

配置环境变量

将安装目录下的bin配置到path系统环境变量中:C:\Program Files\OpenSSL-Win64\bin

执行 openssl -v ,输出结果说明已配置好

生成证书与nginx配置

创建证书配置

到nginx安装目录(我是 D:\App\nginx\conf),新建文件夹用于存放证书,命名为ssl

在里面新建一个txt文本文件,在里面写入以下内容:

需要自定义的地方是[alt_names]段,里面要写自己希望注册证书的域名、IP,当然就是自己的IP

以及CN字段(Common Name的意思),可以理解为给这个证书的名称,填我们的域名、IP就行

x509_extensions     = v3_req                    # X.509扩展段
req_extensions      = v3_req            

# 主题信息段(对应 -subj 参数)
[req]
prompt              = no                        # 关闭交互式输入
default_bits        = 2048                      # RSA密钥长度
default_keyfile     = server.key                # 私钥输出路径 
ST = Guangdong
L  = Guangzhou
O  = Local
CN = summer                                     # 通用名称

# 扩展段(对应 -addext 参数)
[v3_req]
subjectAltName = @alt_names

# 将以下域名/IP注册证书(域名用DNS.x,IP用IP.x)
[alt_names]
DNS.1 = summer
DNS.2 = localhost
IP.1  = 192.168.0.75
IP.2  = 127.0.0.1

保存后,重命名为 openssl.cnf

生成证书

执行命令根据刚刚的配置生成证书,有效期设置10年

另外可以考虑手动分配IP,不然隔段时间重启再连wifi可能分配到的IP又变了,证书就废了

# 在 conf/ssl 下生成证书
cd D:\App\nginx\conf\ssl
openssl req -x509 -nodes -days 3650 -keyout server.key -out server.crt -config openssl.cnf

配置nginx

在 nginx.conf 中加入此server块,以支持https协议访问

server {
    listen 443 ssl;
    server_name 192.168.0.75;

    ssl_certificate      ssl/server.crt;
    ssl_certificate_key  ssl/server.key;

    ssl_session_timeout  5m;
    ssl_protocols  TLSv1.2 TLSv1.3;
    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers  on;

    location / {
        root   html;
        index  index.html index.htm;
    }
}

重启nginx

有个注意点,其他程序可能会占用443端口,如 vmvare hostd,这种情况可以先把占用的干掉

# 观察是否有程序占用443端口
netstat -ano | findstr :443
tasklist | findstr 占用的PID
# 有的话需要干掉
taskkill /f /pid 占用的PID

# 重启nginx
taskkill /f /im nginx*
cd D:\App\nginx
start nginx
tasklist | findstr nginx

客户端信任证书

win

把生成的 server.crt 复制到其他win电脑,双击安装

点击安装证书 -> 勾选本地计算机 -> 放到下列存储(浏览) -> 选择受信任的根证书颁发机构 -> 完成

访问 https://192.168.0.75 ,如果没有提示不安全,则配置完成,至此目标1达成

安卓(小米)

把生成的 server.crt 复制到手机

系统设置 -> 搜索“证书” -> 安装证书 -> CA证书 -> 仍然安装 -> 选择 server.crt 安装

不起作用!! 查阅原因:安卓7+后应用不信任用户证书

配置host

我们想用 https://summer 访问web服务器,但是summer这个域名我们的电脑是不认识的

得去电脑的“花名册”里记录下,访问summer域名时,解析到192.168.0.233

每个想要通过自定义域名,访问内网设备的电脑,都要进行这一步

前往文件夹:C:\Windows\System32\drivers\etc\

右键hosts文件-属性-安全-编辑-选择Users组勾选完全控制权限-应用

用VSCode打开hosts文件,在最底下追加一行并保存:

192.168.0.233   summer

重启浏览器或开一个无痕窗口,并在地址栏输入 https://summer

如果成功进入nginx欢迎页,说明host配置完成,至此目标2达成