们的客户是在内网环境里面,所以就只能用自签名证书来搞,我一想这还不容易,就迅速的百度了一下随便找了个文章开始照猫画虎,很快就弄完了,但是弄完后发现还是有问题,而且https 还是报不安全,
1、基于nginx版本
1、证书生成
生成密钥,采用的是des3算法
openssl genrsa -des3 -out 2048
根据密钥签发申请文件CSR
openssl req -new -key -out
#这一步主要是去除密钥的密码,便于后续部署
openssl rsa -in -out
#生成自签名根证书并设置证书的有效期,crt是发给客户端的证书
openssl x509 -req -days 3650 -in -signkey -out
#有的需要pem的证书,对证书做的转换
openssl x509 -in -out -outform PEM
2、配置Nginx
server {
listen 8080 ssl; #端口增加SSL支持
server_name _;
charset utf-8;
# ssl on;
ssl_certificate /data/app/nginx/nginx/cert/;# 证书文件
ssl_certificate_key /data/app/nginx/nginx/cert/; #私钥文件
# access_log ./logs/access_stream.log main;
# error_log ./logs/error_stream.log;
location / {
root /home/nginx/knowledge2.0/;
index ;
}
error_page 500 502 503 504 /;
location = / {
root html;
}
}
3、浏览器访问
使用https协议访问8080端口,但是会提示证书不可信,后面我们会详细讲解怎样解决这个问题。
对于浏览器提示证书不可信,由于采用的自签名证书,浏览器是没有我们的自签名证书导致。
4、证书不可信解决方案
生成证书时候增加
extendedKeyUsage = serverAuth, clientAuth
basicConstraints = CA:FALSE
keyUsage = nonRepudiation,digitalSignature,keyEncipherment
subjectAltName = @alt_names
[alt_names]
IP.1=172.1.0.1
DNS.1=
然后重新使用Openssl重新生成证书,上述配置说明该证书是IP或者域名所有的:
openssl x509 -req -days 3650 -in -signkey -out -extfile
生成证书,然后导出crt证书,在windows下加入到信任的根证书下面,再次访问浏览器,浏览器访问不会报错
二、基于域名的https
证书相关文件格式说明
.key: 私钥文件
.pem: 根证书公钥
.crt: 域名证书公钥
自签名文件的生成过程
这里用的工具是openssl,怎么安装可以自行查一下
普通域名的自签名
我们以域名 为例
创建证书目录:/root/cert,进入/root/cert 创建
$ openssl genrsa -des3 -out 2048
使用生成的密钥()来创建新的根SSL证书。并将其保存为,证书有效期为10年
$ openssl req -x509 -new -nodes -key -sha256 -days 3650 -out
输入第一步设置的密码
Enter pass phrase for :
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 (. server FQDN or YOUR name) []:RootTodoCoder Cert
Email Address []:todocoder@
这一行是把pem 转换成 crt格式
$ openssl x509 -outform der -in -out
提示填写的字段大多都可以直接回车过就行了,只要Common Name字段需要填写内容,这是生成跟证书后导入到系统的证书名称,我填的是RootTodoCoder Cert
创建生成域名ssl证书的前置文件
在这里我生成一个 的域名证书。创建一个文件,以创建一个X509 v3证书。注意我们指定了subjectAltName选项。
cat >> <<EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage=digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName=@alt_names
[alt_names]
DNS.1 =
EOF
这里的 [alt_names] 域中即为我们需要指定的 subjectAltName,可以配置多个 IP,DNS 或其他值。
生成域名ssl证书秘钥(、)
$ openssl req -new -sha256 -nodes -out -newkey rsa:2048 -keyout
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 (. server FQDN or YOUR name) []:
Email Address []:todocoder@
A challenge password []:rootCA
An optional company name []:todocoder
这一步填写域名证书密钥需要的信息,会展示在浏览器的域名证书信息,其中最重要的是Common Name的内容,必须是对应需要https访问的域名的。
通过我们之前创建的根SSL证书颁发,创建出一个 的域名证书。输出是一个名为的证书文件(对应位置替换为自己的文件路径)
$ openssl x509 -req -in -CA -CAkey -CAcreateserial -out -days 500 -sha256 -extfile
以上,我们把域名 的证书已经创建好了,文件目录如下:
.
├──
├──
├──
├──
├──
├──
└──
接下来我们看一下,在nginx 和k8s中是如何用的。
nginx 配置域名的证书
我们拿到上面几步生成的 域名的文件,、
配置到nginx的配置中
server {
listen 443 ssl;
# 以域名访问
server_name ;
# 配置ssl域名证书
ssl_certificate [ssl证书路径]/;
ssl_certificate_key [ssl证书路径]/;
index ;
# 反向代理需要被访问的本地服务
location / {
proxy_pass http://localhost:8080;
}
...
}
自签名的域名访问需要配置host
vi /etc/hosts
192.168.111.37
然后直接访问 在浏览器上应该可以看到证书的信息,注意此时浏览器还提示的是证书无效,不安全。后面需要在操作系统信任一下证书就可以了。
如果你用的是k8s ,可以在ingress中配置
ingress配置tls证书
创建secret
$ kubectl -n todocoder create secret tls tdtodocoder-certs --key --cert
# 重启ingress controller
$ kubectl rollout restart /nginx-ingress-controller -n ingress-nginx
配置ingress yaml
apiVersion: networking./v1
kind: Ingress
metadata:
name: ingress-todocoder
namespace: todocoder
annotations:
/ssl-redirect: "true"
spec:
tls:
- hosts:
- ""
secretName: tdtodocoder-certs
ingressClassName: nginx
rules:
- host: ""
http:
paths:
- backend:
service:
name: todocoder-front
port:
number: 8080
path: /?(.*)
pathType: ImplementationSpecific
以上,我们把域名 的证书已经创建好了,如果不创建泛域名的证书可以直接跳过泛域名的创建过程。接下来我们看一下泛域名证书的签名流程
泛域名的自签名
泛域名是域名前面的字符不是固定的,可能会根据id生成,比如,我的 id是:fsd423dsf234dsfs, 我自己的泛域名就是 ,每个用户都可以有不同的域名。那么我们只需要配置 *. 这个域名就可以,具体操作流程如下:
从上面第3步开始,我们需要用同一个根证书签名,所以rootCA 的证书就不用再新建了
创建生成域名ssl证书的前置文件
创建一个文件, 注意我们指定了subjectAltName选项。
cat >> <<EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage=digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName=@alt_names
[alt_names]
DNS.1 = *.
EOF
注意:这里的 域名配置的 *.
生成域名ssl证书秘钥(、)
$ openssl req -new -sha256 -nodes -out -newkey rsa:2048 -keyout
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 (. server FQDN or YOUR name) []:*.
Email Address []:todocoder@
...
A challenge password []:rootCA
An optional company name []:fantodocoder
这一步填写域名证书密钥需要的信息,会展示在浏览器的域名证书信息,其中最重要的是Common Name的内容,必须是对应需要https访问的域名的。
通过我们之前创建的根SSL证书, 颁发,创建出一个 *. 的域名证书。输出是一个名为的证书文件(对应位置替换为自己的文件路径)
$ openssl x509 -req -in -CA -CAkey -CAcreateserial -out -days 500 -sha256 -extfile
Certificate request self-signature ok
subject=C = CN, ST = Zhengzhou, L = Zhengzhou, O = fantodocoder, OU = fantodocoder, CN = *., emailAddress = todocoder@
Enter pass phrase for :
当前的目录结构:
.
├──
├──
├──
├──
├──
├──
├──
├──
├──
├──
└──
Nginx 配置
server {
listen 443 ssl;
server_name *.;
# 配置ssl域名证书
ssl_certificate [ssl证书路径]/;
ssl_certificate_key [ssl证书路径]/;
index ;
# 反向代理需要被访问的本地服务
location / {
proxy_pass http://localhost:8080;
}
...
}
我们用泛域名 访问,访问之前需要配置hosts
vi /etc/hosts
192.168.111.37
访问 可以看到我们刚刚的泛域名证书信息。
截止到这一步,我们的域名在nginx或者k8s端已经配置完成,我们想要的效果是在https 访问的时候,不报错,并且提示证书安全有效,那么需要我们在我们的操作系统上配置信任证书
各个系统下证书的信任流程
mac 下证书的添加方式
mac系统只需要添加 域名证书就可以,不用添加rootCA 证书
在mac下我们拿到证书后,双击文件->打开钥匙串->选择信任
然后重启浏览器再访问 ,可以看到显示https 安全了
Windows下证书的添加方式
Windows 需要添加 rootCA 和域名的证书到系统里面
如果要访问 需要安装 、 这两个证书
双击CA根证书->存储位置选择本地->指定证书位置(受信任的根证书颁发机构)
ubuntu下证书的添加方式
我的系统是Ubuntu 桌面版 22.04 的版本, ubuntu需要添加 rootCA 和域名的证书到系统里面
拷贝证书到ca证书的目录
$ sudo cp /usr/share/ca-certificates/mozilla/
$ sudo cp /usr/share/ca-certificates/mozilla/
$ sudo cp /usr/share/ca-certifi
cates/mozilla/
执行下面的命令按提示选中新添加的证书,确定(点回车) ,选中(点空格键)然后选 ”OK” 就行了
$ sudo dpkg-reconfigure ca-certificates
Updating certificates in /etc/ssl/certs...
rehash: warning: skipping ,it does not contain exactly one certificate or CRL
rehash: warning: skipping ,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/...
done.
点回车,点空格选中 -> 回车确定
就可以了.
火狐浏览器证书的添加方式
Chrome,safari,Edge等浏览器直接就可以访问了,但是火狐浏览器(ubuntu桌面版火狐,其他系统的没试)的话需要在设置里面添加跟证书。具体操作:
点击设置-> 搜索证书,点击查看证书 -> 证书颁发机构 -> 导入 -> -> 编辑信任
可以看到,火狐浏览器已经显示安全
参考
/s/Qi2pDCBJYGymLJxBIvqvqg