原创

centos 使用 openssl 生成自签名 ssl 证书,并配置到 nginx

1、新建证书存放目录,并进入该目录

mkdir /opt/ssl
cd /opt/ssl

2、生成私钥

openssl genrsa -des3 -out server.key 2048

输入一个4位以上的密码

3、生成csr(证书签名请求文件)

openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=test/L=test/O=test/OU=test/CN=www.test.com"

subj 参数说明

字段 1 字段含义 实例
/C= Country 国家 CN
/ST= State or Province 省 test
/L= Location or City 城市 test
/O= Organization 组织或企业 test
/OU= Organization Unit 部门 test
/CN= Common Name 域名或IP test

4、去除私钥中的密码

在第1步创建私钥的过程中,由于必须要指定一个密码。而这个密码会带来一个副作用,那就是每次启动 web 服务器时,都会要求输入密码。
这显然非常不方便,要删除私钥中的密码,操作如下:

openssl rsa -in server.key -out server.key

5、生成自签名ssl证书

# -days 证书有效期-天
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

X.509 证书包含三个文件:key,csr,crt。

  1. key是服务器上的私钥文件,用于对发送给客户端数据的加密,以及对从客户端接收到数据的解密
  2. csr是证书签名请求文件,用于提交给证书颁发机构(CA)对证书签名
  3. crt是由证书颁发机构(CA)签名后的证书,或者是开发者自签名的证书,包含证书持有人的信息,持有人的公钥,以及签署者的签名等信息

备注:在密码学中,X.509是一个标准,规范了公开秘钥认证、证书吊销列表、授权凭证、凭证路径验证算法等。

6、在nginx配置文件中,配置使用ssl证书

    ......

    server {
        listen 443 ssl;

        ......

        # 配置 ssl 证书
        ssl_certificate /opt/ssl/server.crt;
        ssl_certificate_key /opt/ssl/server.key;

        ......

    }

    ......

注意:这么做并不安全,默认是 SHA-1 形式,而现在主流的方案应该都避免 SHA-1,为了确保更强的安全性,我们可以采取迪菲 - 赫尔曼密钥交换。

7、采取迪菲 - 赫尔曼密钥交换

进入 /opt/ssl 生成一个dhparam.pem

# 如果你的机器性能足够强大,可以用 4096 位加密
openssl dhparam -out dhparam.pem 2048

nginx 最终配置

    ......

    server {
        listen 443 ssl;

        ......

        # 配置 ssl 证书
        ssl_certificate /opt/ssl/server.crt;
        # 配置 ssl 私钥
        ssl_certificate_key /opt/ssl/server.key;
        # 使用 DH 文件
        ssl_dhparam /opt/ssl/dhparam.pem;
        # SSL/TLS 版本
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        # 定义算法(D-H)
        ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";
        # 优先采取服务器算法
        ssl_prefer_server_ciphers on;
        ......

    }

    ......

命令 ssl_protocols 和 ssl_ciphers 可以用来限制连接只包含 SSL/TLS 的加強版本和算法,默认值如下:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;

由于这两个命令的默认值已经好几次发生了改变,因此不建议显性定义,除非有需要额外定义的值,如定义 D-H 算法:

# 使用 DH 文件
ssl_dhparam /opt/ssl/dhparam.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# 定义算法
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";
正文到此结束