Linux

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > Linux > linux服务器手动生成安全的ssl证书

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

作者: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位以上混合字符),并存储在加密存储设备中。

说明:

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

说明:

注意:执行上述指令可能会报出以下错误

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

说明:

三、使用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 -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/*;
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文