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。
- key是服务器上的私钥文件,用于对发送给客户端数据的加密,以及对从客户端接收到数据的解密
- csr是证书签名请求文件,用于提交给证书颁发机构(CA)对证书签名
- 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";
正文到此结束