局域网安全的https协议解决方案

前言

我们在有域名、有公网ip的情况下通常直接在域名管理中可以申请ssl证书,利用nginx可以做到安全的https协议,有时候我们需要将局域网内的服务地址也要做成https协议,如果直接利用nginx转发443端口,访问时会告警,提示不安全的地址,需要手动点一下才能进入网站,非常不方便

解决方案

利用openssl生成证书+nginx提供https协议,访问设备信任安装的证书达到目的

openssl生成证书,注意有几个中文提示的地方是需要手动修改后再执行命令

  • 检查是否安装了openssl,通常linux内核的系统都安装了这个

openssl version
  • 生成根证书私钥和根证书 -keyout CA-private.key -out CA-certificate.crt

openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -subj “/C=CN/ST=省份拼音/L=城市拼音/O=机构名称拼音” -keyout CA-private.key -out CA-certificate.crt -reqexts v3_req -extensions v3_ca
  • 生成自签名证书私钥 -out private.key

openssl genrsa -out private.key 2048
  • 根据自签名证书私钥生成自签名证书申请文件 -out private.csr

openssl req -new -key private.key -subj “/C=CN/ST=省份拼音/L=城市拼音/O=机构名称拼音/CN=你的IP地址” -sha256 -out private.csr
  • 定义自签名证书扩展文件(解决chrome安全告警)。在默认情况下生成的证书一旦选择信任,在 Edge, Firefox 等浏览器都显示为安全,但是Chrome仍然会标记为不安全并警告拦截, 这是因为 Chrome 需要证书支持扩展 Subject Alternative Name, 因此生成时需要特别指定 SAN 扩展并添加相关参数,将下述内容放到命名为private.ext文件中,该文件与上方生成的文件放到同一个文件夹下

  [req]
  default_bits        = 1024
  distinguished_name  = req_distinguished_name
  req_extensions      = san
  extensions          = san
  [req_distinguished_name]
  countryName         = CN
  stateOrProvinceName = Definesys
  localityName        = Definesys
  organizationName    = Definesys
  [SAN]
  authorityKeyIdentifier=keyid,issuer
  basicConstraints=CA:FALSE
  keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
  subjectAltName = IP:你的IP地址
  • 根据根证书私钥及根证书-CA CA-certificate.crt -CAkey CA-private.key、自签名证书申请文件 -in private.csr、自签名证书扩展文件 -extfile private.ext,生成自签名证书 -out private.crt

openssl x509 -req -days 3650 -in private.csr -CA CA-certificate.crt -CAkey CA-private.key -CAcreateserial -sha256 -out private.crt -extfile private.ext -extensions SAN
  • 使用nginx代理成https协议,配置如下

  #user http;
  worker_processes  1;
    
  #error_log  logs/error.log;
  #error_log  logs/error.log  notice;
  #error_log  logs/error.log  info;
    
  #pid        logs/nginx.pid;
    
    
  events {
      worker_connections  1024;
  }
    
    
  http {
      include       mime.types;
      default_type  application/octet-stream;
    
      #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
      #                  '$status $body_bytes_sent "$http_referer" '
      #                  '"$http_user_agent" "$http_x_forwarded_for"';
    
      #access_log  logs/access.log  main;
    
      sendfile        on;
      #tcp_nopush     on;
    
      #keepalive_timeout  0;
      keepalive_timeout  65;
      types_hash_max_size 1024;
      types_hash_bucket_size 64;
    
      #gzip  on;
    
      # 本地api服务提供https
      server {
          listen       443 ssl;
          # server_name  localhost;
    
          # 该配置默认情况为off,允许自定义请求头部的key,带下划线,默认会忽略掉
          underscores_in_headers on;
          ssl on;
          ssl_certificate /home/family/app/ssl/intranet/private.crt;
          ssl_certificate_key /home/family/app/ssl/intranet/private.key;
          ssl_session_timeout 5m;
          ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
          ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
          ssl_prefer_server_ciphers on;
    
          location / {
              #请求大小
              client_max_body_size 32M;
              # 重写请求头部host字段
              proxy_set_header Host $host;
              # 重写来源IP
        		proxy_set_header X-Real_IP $remote_addr;
              # 重写http请求来源
        		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
              proxy_http_version 1.1;
              proxy_set_header Upgrade $http_upgrade;
              proxy_set_header Connection "upgrade";
              proxy_pass http://127.0.0.1:8800;
          }
      }
  }
  • 最终需要将生成的CA-certificate.crt证书文件执行安装,然后完全信任它

mac 安装证书后要在钥匙串app中找到这个证书,然后双击设置完全信任
荣耀手机,进入设置,安全,更多安全设置,加密和凭据,从存储设备安装,安装ca证书,其它的安卓应该也是类似
其它的设备自行查资料,逻辑都是一样的,要安装这个证书,信任这个证书
  • 通过浏览器使用https协议方式访问nginx代理的ip地址,可以看到服务能正常访问,也不会告警成不安全

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值