web服务器使用nginx作为slb对外提供建站能力,默认使用http传输协议。配置可信的SSL证书,也能提高用户的可信度。SSL证书可以通过第三方 SSL 证书机构颁发(通常是要购买的,浏览器可信),也可以使用openssl申请自签名证书(浏览器告警将建立私密连接)。本文主要介绍第二种方式,使用openssl申请自签名证书以构建https服务器。
一、基本概念:
1、openssl 是目前最流行的 SSL密码库工具,其提供了一个通用、健壮、功能完备的工具套件,用以支持SSL/TLS 协议的实现。(官网:https://www.openssl.org/source/)
2、key:SSL使用非对称加密算法进行认证,通常有一对公钥、私钥。key指的是私钥。
3、csr(Certificate Signing Request):证书签名请求,在申请证书的过程中使用CSP(Cryptographic Service Provider,加密服务提供程序)生成私钥时一起生成的。
4、crt(Certificate):证书,一般我们将CSR文件提交给证书颁发机构(CA)后,CA使用其根证书私钥签名就生成了证书公钥文件,再颁发给用户证书。
二、模拟CA证书颁发过程
(前提:服务器已安装openssl)
1、生成私钥
openssl genrsa -out /etc/ssl/my.key -aes128 -passout pass:123456 4096
生成4096位的RSA私钥,用aes-128-cbc对称算法加密,加密口令为123456,并输出到my.key文件中。
2、生成CSR
openssl req -new -key /etc/ssl/my.key -out /etc/ssl/my.csr
执行后,会问一些问题:
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:Shanghai
Locality Name (eg, city) [Default City]:Shanghai
Organization Name (eg, company) [Default Company Ltd]:A
Organizational Unit Name (eg, section) []:B
Common Name (eg, your name or your server's hostname) []:www.xxx.com
Email Address []:
3、生成CA证书
openssl req -new -x509 -key /etc/ssl/my.key -out /etc/ssl/ca.crt -days 3650
生成一个有效期为10年的ca证书。其中,-x509指定使用 X.509作为证书签名请求管理(certificate signing request (CSR))。X.509 是一个公钥代表。(that SSL and TLS adheres to for its key and certificate management.)
执行后,同样会问关于ca证书的问题:
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:Shanghai
Locality Name (eg, city) [Default City]:Shanghai
Organization Name (eg, company) [Default Company Ltd]:A
Organizational Unit Name (eg, section) []:B
Common Name (eg, your name or your server's hostname) []:www.xxx.com
Email Address []:
4、用CA证书给本机颁发证书
openssl x509 -req -days 3650 -in /etc/ssl/my.csr -CA /etc/ssl/ca.crt -CAkey /etc/ssl/my.key -CAcreateserial -out /etc/ssl/my.crt
最后生成的my.crt就是本机的证书。
三、一个命令生成自签名证书
openssl req -new -newkey rsa:2048 -days 3650 -nodes -x509 \
-subj '/C=CN/S=Shanghai/O=A Co.,Ltd./CN=www.xxx.com' \
-keyout /etc/ssl/my.key \
-out /etc/ssl/my.crt
其中,-nodes: 告诉OpenSSL生产证书时忽略密码环节(因为需要Nginx自动读取这个文件,而不是以用户交互的形式)。
-newkey rsa:2048: 同时产生crt证书和key(加密强度为RSA 2048)
四、nginx中配置ssl证书
(前提,nginx编译时安装ssl模块(http_ssl_module),可以用nginx -V查看当前安装模块)
server{
#配置ssl监听端口
listen 443 ssl;
server_name www.xxx.com;
#证书和秘钥路径
ssl_certificate /etc/ssl/my.crt;
ssl_certificate_key /etc/ssl/my.key;
#ssl协议与加密算法
ssl_protocols TLSv1.2;
ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:HIGH:!MEDIUM:!LOW:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4:@STRENGTH";
ssl_prefer_server_ciphers on;
#session设置,储存SSL会话的缓存类型和大小,会话过期时间
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
}
server{
#将http访问自动跳转到https
listen 80;
server_name www.xxx.com;
rewrite ^/(.*)$ https://$server_name/$1 permanent;
add_header Content-Security-Policy "default-src 'self' data: blob: https:;img-src 'self' data: blob: https:;media-src 'self' https:;script-src 'self' https:;script-src-elem 'self' 'unsafe-inline' 'unsafe-eval' https:;style-src 'self' 'unsafe-inline' https:;child-src 'none';frame-src https:;";
add_header Set-Cookie "<key>=<value>; Expires=<expiryDate>; Secure; HttpOnly; SameSite=strict";
add_header Cache-control "no-cache, no-store, must-revalidate";
add_header Expires "0";
add_header X-XSS-Protection "1; mode=block";
add_header X-frame-options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
# 请求头传递ip
proxy_set_header Host $host;
proxy_set_header Remote_Addr $remote_addr;
proxy_set_header X-REAL-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;