linux服务器手动生成安全的ssl证书实现方式
一、生成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/*;
}总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
Centos修改DNS重启或重启network服务后丢失问题解决方法
这篇文章主要介绍了Centos修改DNS重启或重启network服务后丢失问题解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2016-12-12
prometheus如何使用pushgateway监控网路丢包
这篇文章主要介绍了prometheus如何使用pushgateway监控网路丢包问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2025-07-07


最新评论