centos使用openssl生成自签名SSL证书并配置到nginx
检查OpenSSL
检查是否已经安装openssl:
openssl version
一般在CentOS7上,openssl已经默认安装好了。
生成自签名的SSL证书和私钥
第一步:生成私钥
新建/etc/ssl/certs/www.ffcc.com目录并进入,后执行命令:
openssl genrsa -des3 -out server.key 2048
输入一个4位以上的密码。
第二步:生成CSR(证书签名请求)
openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=Zhejiang/L=Hangzhou/O=mofei/OU=mofei/CN=www.ffcc.com"
subj参数说明如下:
字段 | 字段含义 | 示例 |
/C= | Country 国家 | CN |
/ST= | State or Province 省 | Zhejiang |
/L= | Location or City 城市 | Hangzhou |
/O= | Organization 组织或企业 | mofei |
/OU= | Organization Unit 部门 | mofei |
/CN= | Common Name 域名或IP | www.ffcc.com |
第三步:去除私钥中的密码
在第1步创建私钥的过程中,由于必须要指定一个密码。而这个密码会带来一个副作用,那就是在每次启动Web服务器时,都会要求输入密码,
这显然非常不方便。要删除私钥中的密码,操作如下:
openssl rsa -in server.key -out server.key
第四步:生成自签名SSL证书
# -days 证书有效期-天 openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt
需要用到的证书文件为:server.crt 和 server.key
X.509证书包含三个文件:key,csr,crt。
key是服务器上的私钥文件,用于对发送给客户端数据的加密,以及对从客户端接收到数据的解密
csr是证书签名请求文件,用于提交给证书颁发机构(CA)对证书签名
crt是由证书颁发机构(CA)签名后的证书,或者是开发者自签名的证书,包含证书持有人的信息,持有人的公钥,以及签署者的签名等信息
备注:在密码学中,X.509是一个标准,规范了公开秘钥认证、证书吊销列表、授权凭证、凭证路径验证算法等。
第五步:在nginx配置文件中配置使用ssl证书
user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; gzip on; server { listen 80; server_name www.ffcc.com; rewrite ^(.*) https://$server_name$1 permanent; } server { listen 443 ssl; keepalive_timeout 70; server_name www.ffcc.com; location / { proxy_pass http://127.0.0.1:65432/v2ui; proxy_redirect default; client_max_body_size 10m; #表示最大上传10M,需要多大设置多大。 #设置主机头和客户端真实地址,以便服务器获取客户端真实IP proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Scheme $scheme; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } ssl_certificate /etc/ssl/certs/www.ffcc.com/server.crt; ssl_certificate_key /etc/ssl/certs/www.ffcc.com/server.key; #减少点击劫持 add_header X-Frame-Options DENY; #禁止服务器自动解析资源类型 add_header X-Content-Type-Options nosniff; #防XSS攻击 add_header X-Xss-Protection 1; #优先采取服务器算法 ssl_prefer_server_ciphers on; # ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers HIGH:!aNULL:!MD5; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; } }
但是这么做并不安全,默认是 SHA-1 形式,而现在主流的方案应该都避免 SHA-1,为了确保更强的安全性,我们可以采取迪菲-赫尔曼密钥交换
首先,进入/etc/ssl/certs/www.ffcc.com目录并生成一个dhparam.pem
openssl dhparam -out dhparam.pem 2048 # 如果你的机器性能足够强大,可以用 4096 位加密
所以最终的配置如下:
user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
gzip on;
server {
listen 80;
server_name www.ffcc.com;
rewrite ^(.*) https://$server_name$1 permanent;
}
server {
listen 443 ssl;
keepalive_timeout 70;
server_name www.ffcc.com;
location / {
proxy_pass http://127.0.0.1:65432/v2ui;
proxy_redirect default;
client_max_body_size 10m; #表示最大上传10M,需要多大设置多大。
#设置主机头和客户端真实地址,以便服务器获取客户端真实IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Scheme $scheme;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
ssl_certificate /etc/ssl/certs/www.ffcc.com/server.crt;
ssl_certificate_key /etc/ssl/certs/www.ffcc.com/server.key;
#减少点击劫持
add_header X-Frame-Options DENY;
#禁止服务器自动解析资源类型
add_header X-Content-Type-Options nosniff;
#防XSS攻击
add_header X-Xss-Protection 1;
#优先采取服务器算法
ssl_prefer_server_ciphers on;
#使用DH文件
ssl_dhparam /etc/ssl/certs/www.ffcc.ml/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+a
RSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";
#
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
}
}
注意
自签名的SSL证书存在安全隐患,在生产环境上需要购买和使用经权威机构认证和办法的证书。