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

 更新时间:2026年04月16日 11:24:59   作者:friend_X  
文章介绍了生成CA根证书和自签名SSL证书的过程,包括创建CA私钥、生成CA自签名证书、生成服务器私钥和证书签署请求、使用CA根证书签名SSL证书等步骤,最后提供了最终的文件列表和Nginx配置使用总结

一、生成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服务后丢失问题解决方法

    这篇文章主要介绍了Centos修改DNS重启或重启network服务后丢失问题解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • Linux与Windows编码不一致的解决方案

    Linux与Windows编码不一致的解决方案

    本篇文章给大家总结了Linux与Windows编码不一致的解决方法以及相关注意点,有需要的朋友参考下。
    2018-03-03
  • Linux date 时间设置同步命令分享

    Linux date 时间设置同步命令分享

    Linux服务器运行久时,系统时间就会存在一定的误差,一般情况下可以使用date命令进行时间设置,但在做数据库集群分片等复杂操作时对多台机器的时间差是有要求的,此时就需要使用ntpdate进行时间同步。
    2018-04-04
  • Linux下SVN服务器自动更新文件到Web目录的方法

    Linux下SVN服务器自动更新文件到Web目录的方法

    这篇文章主要介绍了Linux下SVN服务器自动更新文件到Web目录的方法,需要的朋友可以参考下
    2015-07-07
  • PHP程序员玩转Linux系列 lnmp环境搭建

    PHP程序员玩转Linux系列 lnmp环境搭建

    这篇文章主要为大家详细介绍了PHP程序员玩转Linux系列文章,lnmp环境搭建教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • ubuntu服务器环境下安装python的方法

    ubuntu服务器环境下安装python的方法

    这篇文章主要介绍了ubuntu服务器环境下安装python的方法,简单分析了Ubuntu环境下安装Python的相关步骤、命令、与操作注意事项,需要的朋友可以参考下
    2018-03-03
  • Linux系统CPU100%的处理步骤和方法

    Linux系统CPU100%的处理步骤和方法

    当 Linux 系统的 CPU 使用率达到 100% 时,系统可能会变得卡顿,响应速度减慢,甚至无法正常使用,这种情况通常由高负载的进程、资源不足或潜在的系统问题引起,以下是处理 CPU 100% 的具体步骤和方法,需要的朋友可以参考下
    2025-11-11
  • prometheus如何使用pushgateway监控网路丢包

    prometheus如何使用pushgateway监控网路丢包

    这篇文章主要介绍了prometheus如何使用pushgateway监控网路丢包问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-07-07
  • Linux如何搭建文件服务器

    Linux如何搭建文件服务器

    这篇文章主要介绍了Linux如何搭建文件服务器,包括基于centos7.9搭建http文件服务器,基于centos7.9搭建nginx文件服务器以及基于ubuntu2204搭建http文件服务器,本文给大家介绍的非常详细,需要的朋友参考下吧
    2023-10-10
  • Linux命令之nmcli命令的使用及说明

    Linux命令之nmcli命令的使用及说明

    文章介绍了NetworkManager的命令行工具nmcli,它用于管理和配置网络连接,支持多种网络类型,并提供了丰富的命令用于查看、配置、启用和禁用网络连接,文中还列举了使用示例和语法说明,帮助读者更好地掌握nmcli的使用方法
    2026-04-04

最新评论