HTTPS证书创建
一、环境准备
1.1 升级Openssl
https://blog.csdn.net/dougsu/article/details/131030752
二、认识证书请求CSR文件
在申请证书前需要创建CSR文件,将CSR文件上传到CA机构,由CA机构颁发数字证书
2.1 CSR 文件包含以下信息
1、关于企业和网站的信息 - 包括通用名称、组织、组织单位、城市/地区、州/县/地区 (S)、国家和电子邮件地址等信息
2、Public Key - 它包含在证书中,用于加密传输的数据,使用相应的私钥解密
3、关于密钥类型和长度的信息 - 这通常是 RSA 2048,但也可能有更大的尺寸,例如 RSA 4096+
2.2 CSR 文件详解
选项解释如下:
选项 | 解释 |
---|---|
国家或地区(Country,C) | 申请者所在的国家,用两位代表国家缩写的IS0国家代码表示。如:CN(中国),BR(巴西) |
州或省份(State/Province,ST) | 申请者所在的州或省份的全名。如:'Beijing’或’Liao Ning |
城市或地方(Locality,L) | 申请者所在的城市或地方的名称名称。如:'Beijing’或 ‘Dalian’ |
组织名称(OrganizationName,0) | 申请者所属的组织或公司的法定注册名称。它通常是包含诸如 Inc、Corp或LLC等后缀的完整公司名称。如:`Pinnacle Technologiesinc. |
部门名称(Organizational Unit Name,OU) | 组织内的部门名称,通常指定为公司内部申请证书的部门。如:IT Department(I 部门) |
域名信息(Common Name,CN) | 证书将被使用的域名或服务器的完全限定域名(Fuly Qualifed Domain Name,FQDN)。它可以是一个或多个,用于确定证书要被应用的网站或服务。例如`tls-example.com’ |
邮箱地址(Email Address,emailAddress) | 公司或申请者邮箱地址。如:‘admin@email.com’ |
公钥(Public Key) | 被包含在证书中的服务器的公钥文件,即将来客户端申请访间时将要获取到的公钥文件。、密钥长度:生成的公/私钥密钥长度,密钥越长,则越安全,但相应的速度也更慢。通常推荐使用2048位或更高(如4096位)的RSA密铜或ECC(椭圆曲线密码学)密钥,以保证安全性 |
签名算法 | 指定在生成证书签名时使用的签名算法。其中SHA-256 是最为常见的算法 |
三、创建方式
3.1、在线创建
3.2、本地创建(推荐)
3.2.1 OpenSSl 命令
3.2.2 cfssl 命令
3.3 OpenSSl 命令创建
3.3.1 创建普通数字证书
3.3.1.1 创建PKI密钥
3.3.1.1.1 常用解密算法
算法 | 应用 |
---|---|
RSA | 目前最广泛使用的加密算法。 |
DSA | 由于安全原因已不在推荐使用。 |
ECDSA | 目前仍未被广泛所使用。 |
EdDSA | 目前仍未被广泛所使用。 |
密钥大小:用于指定密钥的大小,密钥越大则越安全,但相对地,加解密时间也越长。对于 RSA 加密算法来说,至少要确保密钥长度为 2048 位。
密钥密码:为创建的密钥指定一个密码,来进一步保护密钥的安全性。但同时也带来了一些密钥使用的复杂性。
常见创建PKI密钥方法:
- genpkey
- genrsa
3.3.1.1.2 使用genpkey方式创建
3.3.1.1.2.1创建秘钥文件private.pem
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out private.pem
选项解释如下:
选项 | 解释 |
---|---|
algorithm | 指定加密算法 |
pkeyopt | 指定选项,rsa_keygen_bits未秘钥长度 |
out | 指定秘钥文件名 |
3.3.1.1.2.2 以可读性的方式查看密钥文件
openssl pkey -in private.pem -text -noout -check
3.3.1.1.2.3 提取密钥文件中的公钥信息
# -pubout 参数为提取公钥
openssl pkey -in private.pem -pubout -out public.pem
# 查看公钥内容
cat public.pem
3.3.1.1.3 使用genrsa方式创建
3.3.1.1.3.1 创建秘钥文件private.pem
# 4096 指定秘钥长度
openssl genrsa -out private.pem 4096
# 查看该密钥文件
cat private.pem
3.3.1.1.3.2 以可读性的方式查看密钥文件
openssl rsa -in private.pem -text -noout -check
3.3.1.1.3.3 提取密钥文件中的公钥信息
# -pubout 参数为提取公钥
openssl rsa -in private.pem -pubout -out public.pem
# 查看公钥内容
cat public.pem
3.3.1.2 创建CSR文件
3.3.1.2.1 以交互式创建csr文件
# new 创建一个新的csr文件
# key 指定秘钥文件
openssl req -new -key private.pem -out cert.csr
# 查看csr文件
cat cert.csr
3.3.1.2.2 以 -subj选项创建csr文件
# new 创建一个新的csr文件
# key 指定秘钥文件
openssl req -new -key private.pem -out cert.csr -subj "/C=CN/ST=SiChuan/L=Chengdu/O=TLS example/OU=IT/CN=tls-example.com/emailAddress=admin@email.com"
# 查看csr文件
cat cert.csr
3.3.1.2.3 以 配置文件创建csr文件
# 创建配置文件
vim cert.conf
# 编辑文件内容
[req]
default_bits = 2048
distinguished_name = req_distinguish_name
req_extensions = req_ext
prompt = no
[req_distinguished_name]
C = CN
ST = SiChuan
L = Chengdu
O = TLS example
OU = IT
CN = tls-example.com
emailAddress = admin@email.com
[req_ext]
subjectAltName = @alt_names
[alt_names]
DNS.1 = tls-example.com
DNS.2 = *.tls-example.com
# 创建csr文件
openssl req -new -key private.pem -out cert.csr -config cert.conf
# 查看csr文件
cat cert.csr
3.3.1.2.4 可读性的方式查看csr文件
openssl req -in cert.csr -text -noout -verify
3.3.2 创建自签名证书(方式一)
3.3.2.1 创建密钥cert-key.pem和数字证书请求csr文件
openssl req -new -newkey rsa:2048 -keyout cert-key.pem -nodes - out cert.csr -subj "/C=CN/ST=SiChuan/L=ChengDu/O=TLS Technologies Inc./OU=IT/CN=tls-example.com/emailAddress=admin@email.com"
3.3.2.2 创建证书文件cert.crt
openssl x509 -req -days 365 -in cert.csr -sha256 -signkey cert-key.pem -extfile <(printf "subjectAltName=DNS:tls-example.com,DNS:*.tls-example.com") -out cert.crt
选项解释如下:
选项 | 解释 |
---|---|
x509 req | 使用创建好的csr文件创建证书,不指定则会以交互的形式让用户提供csr的主体信息创建证书 |
days | 证书的有效期 |
in | 指定创建证书时所使用的crs文件 |
sha256 | 将使用hash 256算法来为证书进行签名 |
signkey | 为证书指定扩展属性 |
extfile | 为证书指定扩展属性 |
out | 证书的文件名 |
实操如下:
3.3.3 创建自建证书(方式二)
此方式不需要提前创建秘钥文件和csr文件
openssl req -x509 -newkey rsa:2048 -sha256 -days 3650 -nodes -keyout cert-key.pem -subj "/C=CN/ST=SiChuan/L=ChengDu/O=TLS Technologies Inc./OU=IT/CN=tls-example.com/emailAddress=admin@email.com" -addext "subjectAltName=DNS:tls-example.com,DNS:*.tls-example.com,IP:127.0.0.1" -out cert.crt
实操如下:
3.4 查看证书内容
cat cert.crt
## 以可读性展示文件内容
openssl x509 -in cert.crt -noout -text
选项 | 解释 |
---|---|
-noout | 不需要打印证书原始内容 |
-text | 以可读性展示 |
选项解释如下:
选项 | 解释 |
---|---|
版本号(Version) | 证书的版本信息 |
序列号(Serial Number) | 用于唯一标识证书的序列号 |
颁发者(lssuer) | 标识证书颁发机构(CA)的信息 |
有效期(Validity) | 指定证书的有效起始日期和截企古期 |
主体(Subject) | 描述证书申请者的信息 |
公钥信息(Subject Public Key Info) | 包括公钥及其算法 |
数字签名(Signature) | 由颁发机构使用其私钥生成的数字签名,用于验证证书的完整性和真实性 |
扩展信息(Fxtention) | 包含其他可选信息,如密钥用途,基本约束等 |
四、Nginx代理配置
4.1 配置Nginx配置文件
在当前目录创建tls-example-nginx.conf文件
server {
listen 443 ssl;
server_name tls-example.com;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
# 指定数字证书文件位置
ssl_certificate "certs/cert.crt";
# 指定数字证书密钥文件位置
ssl_certificate_key "certs/cert-key.pem";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_prefer_server_ciphers on;
}
4.2 创建docker容器
docker run --rm -d -v $(pwd)/:/etc/nginx/certs -v $(pwd)/tls-example-nginx.conf:/etc/nginx/conf.d/tls-example-nginx.conf -p 443:443 --name tls nginx
说明:
将带有数字证书的目录挂载到nginx的certs目录,用于nginx配置文件读取数据,其中tls-example-nginx.conf同样需要挂载到nginx配置conf.d中
4.3 访问Web Https
https://192.168.130.100/
出现以下页面则是因为当前自建数字证书尚未通过浏览器验证,需要手动将自建证书进行系统信任
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/aba0ca98753e48a6b3e9916b86d8c886.png
亦可手动继续访问: