• 局域网https自签名教程


    们的客户是在内网环境里面,所以就只能用自签名证书来搞,我一想这还不容易,就迅速的百度了一下随便找了个文章开始照猫画虎,很快就弄完了,但是弄完后发现还是有问题,而且https 还是报不安全,

    1、基于nginx版本
    1、证书生成

    生成密钥,采用的是des3算法

    openssl genrsa -des3 -out server.key 2048
    
    • 1

    根据密钥签发申请文件CSR

    openssl req -new -key server.key -out server.csr
    #这一步主要是去除密钥的密码,便于后续部署
    openssl rsa -in server.key -out server.key 
    #生成自签名根证书并设置证书的有效期,crt是发给客户端的证书
    openssl x509 -req -days 3650 -in server.csr -signkey server.key  -out server.crt
    #有的需要pem的证书,对证书做的转换
    openssl x509 -in server.crt -out server.pem -outform PEM 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2、配置Nginx

    server {
        listen 8080 ssl; #端口增加SSL支持
        server_name _;
            charset utf-8;
        # ssl on;
        ssl_certificate /data/app/nginx/nginx/cert/server.crt;# 证书文件
        ssl_certificate_key /data/app/nginx/nginx/cert/server.key; #私钥文件
        # access_log ./logs/access_stream.log main;
        # error_log ./logs/error_stream.log;
    
        location / {
                    root /home/nginx/knowledge2.0/;
                    index index.html;
            }
    
            error_page 500 502 503 504  /50x.html;
            location = /50x.html {
                    root html;
            }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    3、浏览器访问
    使用https协议访问8080端口,但是会提示证书不可信,后面我们会详细讲解怎样解决这个问题。

    对于浏览器提示证书不可信,由于采用的自签名证书,浏览器是没有我们的自签名证书导致。

    4、证书不可信解决方案
    生成证书时候增加ext.ini

    extendedKeyUsage = serverAuth, clientAuth
    basicConstraints = CA:FALSE
    keyUsage = nonRepudiation,digitalSignature,keyEncipherment
    subjectAltName = @alt_names
    
    
    [alt_names]
    IP.1=172.1.0.1
    DNS.1=www.test.com
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    然后重新使用Openssl重新生成证书,上述配置说明该证书是IP或者域名所有的:

    openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt -extfile ext.ini
    生成证书,然后导出crt证书,在windows下加入到信任的根证书下面,再次访问浏览器,浏览器访问不会报错
    二、基于域名的https

    证书相关文件格式说明
    .key: 私钥文件
    .pem: 根证书公钥
    .crt: 域名证书公钥

    自签名文件的生成过程
    这里用的工具是openssl,怎么安装可以自行查一下

    普通域名的自签名
    我们以域名 td.todocoder.com为例

    创建证书目录:/root/cert,进入/root/cert 创建 rootCA.key
    $ openssl genrsa -des3 -out rootCA.key 2048
    使用生成的密钥(rootCA.key)来创建新的根SSL证书。并将其保存为rootCA.pem,证书有效期为10年
    $ openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 3650 -out rootCA.pem
    
    • 1
    • 2
    • 3
    • 4

    输入第一步设置的密码

    Enter pass phrase for rootCA.key:
    Country Name (2 letter code) [AU]:CN
    State or Province Name (full name) [Some-State]:Zhengzhou
    Locality Name (eg, city) []:Zhengzhou
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:todocoderCA
    Organizational Unit Name (eg, section) []:todocoderCA
    Common Name (e.g. server FQDN or YOUR name) []:RootTodoCoder Cert
    Email Address []:todocoder@github.com
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    这一行是把pem 转换成 crt格式

    $ openssl x509 -outform der -in rootCA.pem -out rootCA.crt
    提示填写的字段大多都可以直接回车过就行了,只要Common Name字段需要填写内容,这是生成跟证书后导入到系统的证书名称,我填的是RootTodoCoder Cert
    
    创建生成域名ssl证书的前置文件
    在这里我生成一个 td.todocoder.com 的域名证书。创建一个td.ext文件,以创建一个X509 v3证书。注意我们指定了subjectAltName选项。
    
    cat >> td.ext <<EOF
    authorityKeyIdentifier=keyid,issuer
    basicConstraints=CA:FALSE
    keyUsage=digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
    subjectAltName=@alt_names
    
    [alt_names]
    DNS.1 = td.todocoder.com
    EOF
    这里的 [alt_names] 域中即为我们需要指定的 subjectAltName,可以配置多个 IP,DNS 或其他值。
    
    生成域名ssl证书秘钥(tdtodocoder.csr、tdtodocoder.key)
    $ openssl req -new -sha256 -nodes -out tdtodocoder.csr -newkey rsa:2048 -keyout tdtodocoder.key
    
    Country Name (2 letter code) [AU]:CN
    State or Province Name (full name) [Some-State]:Zhengzhou
    Locality Name (eg, city) []:Zhengzhou
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:todocoder
    Organizational Unit Name (eg, section) []:todocoder
    Common Name (e.g. server FQDN or YOUR name) []:td.todocoder.com
    Email Address []:todocoder@github.com
    A challenge password []:rootCA
    An optional company name []:todocoder
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    这一步填写域名证书密钥需要的信息,会展示在浏览器的域名证书信息,其中最重要的是Common Name的内容,必须是对应需要https访问的域名的。

    通过我们之前创建的根SSL证书颁发,创建出一个 test.testcloudide.com 的域名证书。输出是一个名为的证书文件ttestcloudide.crt(对应位置替换为自己的文件路径)

    $ openssl x509 -req -in tdtodocoder.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out tdtodocoder.crt -days 500 -sha256 -extfile td.ext
    以上,我们把域名 td.todocoder.com的证书已经创建好了,文件目录如下:
    
    .
    ├── rootCA.crt
    ├── rootCA.key
    ├── rootCA.pem
    ├── td.ext
    ├── tdtodocoder.crt
    ├── tdtodocoder.csr
    └── tdtodocoder.key
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    接下来我们看一下,在nginx 和k8s中是如何用的。

    nginx 配置域名td.todocoder.com的证书
    我们拿到上面几步生成的 td.todocoder.com域名的文件,tdtodocoder.key、tdtodocoder.crt
    配置到nginx的配置中

    server {
          listen 443 ssl;
          # 以td.todocoder.com域名访问
          server_name td.todocoder.com;
    
          # 配置ssl域名证书
          ssl_certificate     [ssl证书路径]/tdtodocoder.crt;
          ssl_certificate_key [ssl证书路径]/tdtodocoder.key;
    
          index index.html index.php;
          # 反向代理需要被访问的本地服务
          location / {
            proxy_pass http://localhost:8080;
          }
          ...
      }
    自签名的域名访问需要配置host
    vi /etc/hosts
    192.168.111.37 td.todocoder.com
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    然后直接访问 td.todocoder.com 在浏览器上应该可以看到证书的信息,注意此时浏览器还提示的是证书无效,不安全。后面需要在操作系统信任一下证书就可以了。

    如果你用的是k8s ,可以在ingress中配置

    ingress配置tls证书
    创建secret

    $ kubectl -n todocoder create secret tls tdtodocoder-certs --key tdtodocoder.key --cert tdtodocoder.crt
    # 重启ingress controller
    $ kubectl rollout restart daemonset.apps/nginx-ingress-controller -n ingress-nginx
    配置ingress yaml
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: ingress-todocoder
      namespace: todocoder
      annotations:
        nginx.ingress.kubernetes.io/ssl-redirect: "true"
    spec:
      tls:
        - hosts:
            - "td.todocoder.com"
          secretName: tdtodocoder-certs
      ingressClassName: nginx
      rules:
        - host: "td.todocoder.com"
          http:
            paths:
              - backend:
                  service:
                    name: todocoder-front
                    port:
                      number: 8080
                path: /?(.*)
                pathType: ImplementationSpecific
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    以上,我们把域名 td.todocoder.com的证书已经创建好了,如果不创建泛域名的证书可以直接跳过泛域名的创建过程。接下来我们看一下泛域名证书的签名流程

    泛域名的自签名
    泛域名是域名前面的字符不是固定的,可能会根据id生成,比如,我的 id是:fsd423dsf234dsfs, 我自己的泛域名就是 fsd423dsf234dsfs.todocoder.com ,每个用户都可以有不同的域名。那么我们只需要配置 *.todocoder.com 这个域名就可以,具体操作流程如下:

    从上面第3步开始,我们需要用同一个根证书签名,所以rootCA 的证书就不用再新建了

    创建生成域名ssl证书的前置文件
    创建一个fanym.ext文件, 注意我们指定了subjectAltName选项。

    cat >> fanym.ext <<EOF
    authorityKeyIdentifier=keyid,issuer
    basicConstraints=CA:FALSE
    keyUsage=digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
    subjectAltName=@alt_names
    
    [alt_names]
    DNS.1 = *.todocoder.com
    EOF
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    注意:这里的 域名配置的 *.todocoder.com

    生成域名ssl证书秘钥(fantodocoder.csr、fantodocoder.key)

    $ openssl req -new -sha256 -nodes -out fantodocoder.csr -newkey rsa:2048 -keyout fantodocoder.key
    
    Country Name (2 letter code) [AU]:CN
    State or Province Name (full name) [Some-State]:Zhengzhou
    Locality Name (eg, city) []:Zhengzhou
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:fantodocoder
    Organizational Unit Name (eg, section) []:fantodocoder
    Common Name (e.g. server FQDN or YOUR name) []:*.todocoder.com
    Email Address []:todocoder@github.com
    ...
    A challenge password []:rootCA
    An optional company name []:fantodocoder
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    这一步填写域名证书密钥需要的信息,会展示在浏览器的域名证书信息,其中最重要的是Common Name的内容,必须是对应需要https访问的域名的。

    通过我们之前创建的根SSL证书rootCA.pem, rootCA.key颁发,创建出一个 *.todocoder.com 的域名证书。输出是一个名为的证书文件fantodocoder.crt(对应位置替换为自己的文件路径)

    $ openssl x509 -req -in fantodocoder.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out fantodocoder.crt -days 500 -sha256 -extfile fanym.ext
    
    Certificate request self-signature ok
    subject=C = CN, ST = Zhengzhou, L = Zhengzhou, O = fantodocoder, OU = fantodocoder, CN = *.todocoder.com, emailAddress = todocoder@github.com
    Enter pass phrase for rootCA.key:
    当前的目录结构:
    
    .
    ├── fantodocoder.crt
    ├── fantodocoder.csr
    ├── fantodocoder.key
    ├── fanym.ext
    ├── rootCA.crt
    ├── rootCA.key
    ├── rootCA.pem
    ├── td.ext
    ├── tdtodocoder.crt
    ├── tdtodocoder.csr
    └── tdtodocoder.key
    Nginx 配置
    server {
          listen 443 ssl;
          server_name *.todocoder.com;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
      # 配置ssl域名证书
    
    • 1
         ssl_certificate     [ssl证书路径]/fantodocoder.crt;
          ssl_certificate_key [ssl证书路径]/fantodocoder.key;
    
          index index.html index.php;
          # 反向代理需要被访问的本地服务
          location / {
            proxy_pass http://localhost:8080;
          }
          ...
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    我们用泛域名 fsd423dsf234dsfs.todocoder.com访问,访问之前需要配置hosts

    vi /etc/hosts
    192.168.111.37 fsd423dsf234dsfs.todocoder.com
    访问 fsd423dsf234dsfs.todocoder.com 可以看到我们刚刚的泛域名证书信息。

    截止到这一步,我们的域名在nginx或者k8s端已经配置完成,我们想要的效果是在https 访问的时候,不报错,并且提示证书安全有效,那么需要我们在我们的操作系统上配置信任证书

    各个系统下证书的信任流程
    mac 下证书的添加方式
    mac系统只需要添加 域名证书就可以,不用添加rootCA 证书

    在mac下我们拿到证书后,双击tdtodocoder.crt文件->打开钥匙串->选择信任

    然后重启浏览器再访问 td.todocoder.com,可以看到显示https 安全了

    Windows下证书的添加方式
    Windows 需要添加 rootCA 和域名的证书到系统里面

    如果要访问 td.todocodoer.com 需要安装 rootCA.crt、tdtodocoder.crt 这两个证书

    双击CA根证书->存储位置选择本地->指定证书位置(受信任的根证书颁发机构)

    ubuntu下证书的添加方式
    我的系统是Ubuntu 桌面版 22.04 的版本, ubuntu需要添加 rootCA 和域名的证书到系统里面

    拷贝证书到ca证书的目录
    $ sudo cp tdtodocoder.crt /usr/share/ca-certificates/mozilla/tdtodocoder.crt
    $ sudo cp fantodocoder.crt /usr/share/ca-certificates/mozilla/fantodocoder.crt
    $ sudo cp rootCA.crt /usr/share/ca-certifi
    cates/mozilla/rootCA.crt
    执行下面的命令按提示选中新添加的证书,确定(点回车) ,选中(点空格键)然后选 ”OK” 就行了
    $ sudo dpkg-reconfigure ca-certificates
    
    Updating certificates in /etc/ssl/certs...
    rehash: warning: skipping ca-certificates.crt,it does not contain exactly one certificate or CRL
    rehash: warning: skipping rootCA.pem,it does not contain exactly one certificate or CRL
    1 added, 0 removed; done.
    正在处理用于 ca-certificates (20230311ubuntu0.22.04.1) 的触发器 ...
    Updating certificates in /etc/ssl/certs...
    0 added, 0 removed; done.
    Running hooks in /etc/ca-certificates/update.d...
    done.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    点回车,点空格选中 -> 回车确定

    就可以了.

    火狐浏览器证书的添加方式
    Chrome,safari,Edge等浏览器直接就可以访问了,但是火狐浏览器(ubuntu桌面版火狐,其他系统的没试)的话需要在设置里面添加跟证书。具体操作:

    点击设置-> 搜索证书,点击查看证书 -> 证书颁发机构 -> 导入 -> rootCA.crt -> 编辑信任

    可以看到,火狐浏览器已经显示安全

    参考
    https://mp.weixin.qq.com/s/Qi2pDCBJYGymLJxBIvqvqg

  • 相关阅读:
    这次是真【一条龙】了!
    Coinbase:Web3身份都需要什么?
    vue项目中使用vant轮播图组件(桌面端)
    Druid未授权访问--->ip:端口号/druid/index.html
    VSFTP服务简介
    C#实现本地服务器多客户端同频道通信
    MySQL——常见约束
    9.Flink实时项目之订单宽表
    NLP - monocleaner
    网络编程中的并发控制
  • 原文地址:https://blog.csdn.net/Stestack/article/details/136359069