一、生成ca根证书(建立可信根)
1.1.创建加密的ca私钥
使用aes-256加密算法生成2048位rsa私钥,防止私钥泄露导致信任链被破坏:
openssl genrsa -des3 -out selfca.key 2048
安全要点:私钥必须设置强密码(建议16位以上混合字符),并存储在加密存储设备中。
说明:
openssl: openssl 工具的命令行执行器genrsa: 生成rsa密钥的命令-des3: 使用triple-des算法对生成的私钥进行加密,这会在生成私钥时要求你设置一个密码,以便在每次使用私钥时都需要提供密码-out selfca.key: 指定生成的私钥的输出文件名为selfca.key,私钥文件将被保存在当前工作目录中2048: 指定生成的rsa私钥的位数为2048位,这是一种常见的安全密钥长度
1.2.生成ca自签名证书
openssl req -new -x509 -days 3650 -key selfca.key -subj "/c=cn/st=gd/l=zs/o=sjj/ou=sjj/cn=ca" -out selfca.crt
说明:
openssl req:这是 openssl 工具中用于处理证书签署请求(csr)的命令-new:表示创建新的 csr-x509:表示生成自签名的 x.509 证书,而不是生成 csr-days 3650:设置证书的有效期为 3650 天(10 年)-key selfca.key:指定用于生成证书的私钥文件为selfca.key-subj "/c=cn/st=gd/l=zs/o=sjj/ou=sjj/cn=ca": 设置证书主题(subject)的信息。这里使用了简化的 distinguished name (dn),包括了国家(c=cn)、省/州(st=gd)、城市(l=zs)、组织(o=sjj)、组织单位(ou=sjj)、通用名称(cn=ca)等信息-out selfca.crt: 指定生成的证书文件的输出路径和文件名,这里为selfca.crt
注意:执行上述指令可能会报出以下错误
can't open "/usr/local/ssl/openssl.cnf" for reading, no such file or directory 40f7b4c4377f0000:error:80000002:system library:(unknown function):no such file or directory:crypto/bio/bss_file.c:67:calling fopen(/usr/local/ssl/openssl.cnf, r) 40f7b4c4377f0000:error:10000080:bio routines:(unknown function):no such file:crypto/bio/bss_file.c:75:
出现该报错的原因,是由于openssl的配置文件在每台服务器的目录位置不同,在默认的openssl配置路径找不到对应文件,因此需要执行以下指令
# 在常见位置查找配置文件 find / -name "openssl.cnf" 2>/dev/null
执行上面的指令后,会输出以下内容:

根据图示,找到自己服务器上对应的配置文件路径,然后需要重新执行以下指令:
# 重新执行生成指令,其中xxxx是由上述图例的目录地址替换,而我的案例是替换成【/usr/local/openssl/ssl/openssl.cnf】 openssl req -new -x509 -days 3650 -key selfca.key -subj "/c=cn/st=gd/l=zs/o=sjj/ou=sjj/cn=ca" -out selfca.crt -config xxxx
说明:之后执行的指令都有可能会报上述的错误,因此可以在执行的指令后面加上【-conifg xxxx】,其中【xxxx】是执行指令的服务器存放openssl配置的地址
注意:执行上述指令可能会报出以下错误
errог:2406f079: random number generator: rand_load_file: cannot open file:сrypto/rand/randfile.c:88: filename=/root/. rnd
出现该报错的因为是:缺少生成随机数的文件
需要执行以下指令:
# 生成随机数文件并设置权限 openssl rand -out /root/.rnd 2048 chmod 600 /root/.rnd
二、 自签名ssl证书
openssl req -newkey rsa:2048 -nodes -keyout server.key -subj "/c=cn/st=gd/l=zs/o=sjj/ou=sjj/cn=xx.xx.xx.xx" -out server.csr
说明:
openssl req:这是 openssl 工具中用于处理证书签署请求(csr)的命令-newkey rsa:2048:创建一个新的 rsa 密钥对,其中包括一个 2048 位的 rsa 私钥和相应的公钥-nodes:生成的私钥不使用密码进行加密。这意味着私钥文件server.key将不需要密码才能访问-keyout server.key:指定生成的私钥文件的输出路径和文件名,这里为server.key-subj "/c=cn/st=bj/l=bj/o=myrootserver/ou=myserver/cn=xx.xx.xx.xx":设置证书主题(subject)的信息。这里使用了简化的 distinguished name (dn),包括了国家(c=cn)、省/州(st=bj)、城市(l=bj)、组织(o=myrootserver)、组织单位(ou=myserver)、通用名称(cn=xx.xx.xx.xx)等信息。通用名称(cn)通常用于指定服务器的主机名或 ip 地址-out server.csr: 指定生成的证书签署请求文件的输出路径和文件名,这里为 server.csr
三、使用ca根证书签名ssl证书
openssl x509 -req -extfile <(printf "subjectaltname=ip:xx.xx.xx.xx") -days 3650 -in server.csr -ca selfca.crt -cakey selfca.key -cacreateserial -out server.crt
-
openssl x509: 这是 openssl 工具中用于处理 x.509 证书的命令 -req: 表示输入的文件是证书签署请求(csr)-extfile <(printf "subjectaltname=ip:xx.xx.xx.xx"): 使用扩展文件,该文件包含了额外的证书扩展信息。在这里,subjectaltname 扩展用于指定主体的备用名称(subject alternative name),这里指定了 ip 地址 xx.xx.xx.xx。你也可以在方括号中添加其他主机名或 ip 地址,用逗号分隔-days 3650:设置生成的证书的有效期为 3650 天(10 年)-in server.csr:指定输入的证书签署请求文件,这里为server.csr-ca selfca.crt:指定用于签署证书的 ca 证书文件,这里为selfca.crt-cakey selfca.key:指定用于签署证书的 ca 私钥文件,这里为selfca.key-cacreateserial:创建一个新的序列号文件,该文件用于跟踪 ca 签署的证书的唯一性-out server.crt:指定生成的证书文件的输出路径和文件名,这里为server.crt
四、最终的文件列表
selfca.key:ca私钥,用于后续签名ssl证书selfca.crt:ca根证书,用于后续签名ssl证书,需要加入到操作系统或浏览器的信任列表中server.key:服务器私钥,需要配置到https服务,比如apache和nginx配置文件中server.csr:证书签署请求文件,后续没用了server.crt:自签名ssl证书,需要配置到https服务,比如apache和nginx配置文件中,这就是代表服务器的身份证件
五、查询证书信息
openssl x509 -text -noout -in server.crt
六、nginx配置使用
user root;
worker_processes 2;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
gzip on;
server_tokens off;
underscores_in_headers on;
add_header x-content-typе-options nosniff;
reset_timedout_connection on;
server {
listen 443 ssl;
server_name localhost;
ssl_certificate /usr/share/nginx/ssl/server.crt; # 生成的证书
ssl_certificate_key /usr/share/nginx/ssl/server.key; # 生成的秘钥
ssl_session_cache shared:ssl:lm;
ssl_session_timeout 5m;
ssl_protocols tlsv1.2 tlsv1.3;
ssl_ciphers ecdhe-ecdsa-aes128-gcm-sha256:ecdhe-rsa-aes128-gcm-sha256:high:!anull:!md5:!rc4:!dhe;
ssl_prefer_server_ciphers on;
client_max_body_size 1000m;
location / {
root html;
index index.html index.htm;
}
}
include servers/*;
}总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论