局域网https自签名教程

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

1、基于nginx版本

1、证书生成

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

bash 复制代码
openssl genrsa -des3 -out server.key 2048

根据密钥签发申请文件CSR

bash 复制代码
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 

2、配置Nginx

bash 复制代码
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;
        }
}

3、浏览器访问

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

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

4、证书不可信解决方案

生成证书时候增加ext.ini

bash 复制代码
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

然后重新使用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为例

bash 复制代码
创建证书目录:/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

输入第一步设置的密码

bash 复制代码
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

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

bash 复制代码
$ 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

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

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

bash 复制代码
$ 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

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

nginx 配置域名td.todocoder.com的证书

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

配置到nginx的配置中

bash 复制代码
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

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

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

ingress配置tls证书

创建secret

bash 复制代码
$ 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

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

泛域名的自签名

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

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

创建生成域名ssl证书的前置文件

创建一个fanym.ext文件, 注意我们指定了subjectAltName选项。

bash 复制代码
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

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

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

bash 复制代码
$ 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

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

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

bash 复制代码
$ 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;
复制代码
  # 配置ssl域名证书
bash 复制代码
     ssl_certificate     [ssl证书路径]/fantodocoder.crt;
      ssl_certificate_key [ssl证书路径]/fantodocoder.key;

      index index.html index.php;
      # 反向代理需要被访问的本地服务
      location / {
        proxy_pass http://localhost:8080;
      }
      ...
  }

我们用泛域名 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 和域名的证书到系统里面

bash 复制代码
拷贝证书到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.

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

就可以了.

火狐浏览器证书的添加方式

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

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

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

参考

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

相关推荐
打工的小王1 天前
nginx(一)nginx简介
nginx
李少兄2 天前
深入解析 Nginx 413 Request Entity Too Large 错误
运维·nginx
漏刻有时2 天前
宝塔服务器被篡改 Nginx Location 配置的安全风险剖析与修复指南(流量劫持、服务器资源消耗、站点功能异常、溯源困难)
服务器·nginx·安全
你知道“铁甲小宝”吗丶2 天前
nginx代理ip哈希用法
nginx·哈希算法
代码的奴隶(艾伦·耶格尔)2 天前
Nginx
java·服务器·nginx
液态不合群2 天前
Nginx多服务静态资源路径冲突解决方案
运维·nginx
岁岁种桃花儿2 天前
详解kubectl get replicaset命令及与kubectl get pods的核心区别
运维·nginx·容器·kubernetes·k8s
zbguolei2 天前
CentOS 7.6离线安装Nginx
linux·nginx·centos
倒流时光三十年2 天前
阿里云 CentOS 7 使用 docker 安装 Nginx
nginx·阿里云·docker·centos
羱滒3 天前
Docker Compose + Nginx + 后端服务运行环境搭建全流程指南(redis、mongdb、nginx、nacos-registry)
redis·nginx·docker·docker-compose