当前位置: 代码网 > 服务器>服务器>Linux > linux服务器手动生成安全的ssl证书实现方式

linux服务器手动生成安全的ssl证书实现方式

2026年04月16日 Linux 我要评论
一、生成ca根证书(建立可信根)1.1.创建加密的ca私钥使用aes-256加密算法生成2048位rsa私钥,防止私钥泄露导致信任链被破坏:openssl genrsa -des3 -out self

一、生成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/*;
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com