https证书生成与nginx的安全配置

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;
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值