NGINX-HTTPS证书配置

HTTPS证书是用来加密HTTP协议的。证书可以自己生成,但自己生成的证书没有认证,在浏览时会报错。一般公司都会购买收费证书,价格一般几十至几百元不等。但也有免费的证书,如Let’sEncrypt。本章介绍HTTPS证书配置及自签证书和免费证书申请。

NGINX HTTPS-301重定向几种方法:

默认HTTP访问是不支持HTTPS跳转的,需要添加如下配置才能自动跳转。

  • 写法一

server { listen 80; server_name www.domain.com; rewrite ^/(.*)$ http://domain.com/$1 permanent; add_header X-Frame-Options SAMEORIGIN; }
  • 写法二
server {
  listen   80;
  server_name  www.domain.com;
  rewrite ^ http://domain.com$request_uri? permanent;
  add_header X-Frame-Options SAMEORIGIN;
}
  • 写法三
server {
  listen   80;
  server_name  www.domain.com;
  return   301 https://$server_name$request_uri;
  add_header X-Frame-Options SAMEORIGIN;
}

NGINX VHOST-HTTPS配置文件:

HTTPS需要配合上面HTTP-301配置配合使用,才能实现访问HTTP会自动跳转HTTPS。同时下面配置文件也是根据WORDPRESS 进行配置的。实际配置方法请根据业务需求来配置。

server {
  listen 443 ssl ;
  server_name www.domain.com domain.com;
  ssl on;
  ssl_certificate      ssl/www.domain.com;
  ssl_certificate_key  ssl/www.domain.com;
  ssl_session_timeout 5m;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_prefer_server_ciphers on;

  add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";

location / {
 root /data/;
 index index.php index.html index.htm;
 try_files $uri $uri/ /index.php?$args; 
 }

location ~ \.php {
 root /data/;
 fastcgi_pass unix:/dev/shm/php-cgi.sock; 
 fastcgi_index index.php;
 include fastcgi.conf;
 set $path_info "";
 set $real_script_name $fastcgi_script_name;
 if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
 set $real_script_name $1;
 set $path_info $2;
 }
 fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
 fastcgi_param SCRIPT_NAME $real_script_name;
 fastcgi_param PATH_INFO $path_info;
 }
}

自签证书生成:

自签证书是通过openssl命令生成的,所以使用生成的证书打开网站时会出现证书出错。此方法仅仅用于测试。

  • 自签证书生成步骤
openssl genrsa -des3 -out www.domain.com.key 2048
openssl req -new -key www.domain.com.key -out www.domain.com.csr

#证书持有者所在国家(CN) 要求填写国家代码,用2个字母表示
Country Name (2 letter code) [AU]:CN
#证书持有者所在州或省份(zhejiang) 填写全称,可省略不填
State or Province Name (full name) [Some-State]:Beijing
#证书持有者所在城市(hangzhou) 可省略不填
Locality Name (eg, city) []:Beijing
#证书持有者所属组织或公司(xxx) 最好还是填一下
Organization Name (eg, company) [Internet Widgits Pty Ltd]:joyios 
#ou    证书持有者所属部门(no)可省略不填
Organizational Unit Name (eg, section) []:info technology
#证书持有者的通用名(XXX.com) 必填。
Common Name (e.g. server FQDN or YOUR name) []:www.domain.com
#证书持有者的通信邮箱(xxx@xxx.com) 可省略不填
Email Address []:liufan@joyios.com

openssl rsa -in www.domain.com.key -out www.domain.com.key
openssl x509 -req -days 365 -in www.domain.com.csr -signkey www.domain.com.key -out www.domain.com.crt

Let’s Encrypt 证书申请:

Let’s Encrypt 证书有效期为90天,所以要每隔三个月就要更新一次证书。如果觉得麻烦,推荐使用阿里云免费证书一般有效期都是一年。

  • 安装certbot服务并进入NGINX配置VHOST目录
yum install certbot -y
cd /usr/local/nginx/conf/vhost/
  • 编辑vhost配置文件并将下面信息插入到server标签下
vim web.conf

location ^~ /.well-known/acme-challenge/ {
  default_type "text/plain";
  root     /[you web server path];
}

location = /.well-known/acme-challenge/ {
  return 404;
}
nginx -t && nginx -s reload
  • 执行certbot命令生成证书并查看证书
#输入你的邮箱
certbot certonly --webroot -w /data/ -d www.domain.com
(Enter 'c' tocancel): cu97ming@foxmail.com

(A)gree/(C)ancel: a

our work to encrypt the web, protect its users
and defend digital rights.
(Y)es/(N)o: n

ls /etc/letsencrypt/live/
  • HTTPS-VHOST 配置修改
    • 将生成的证书(fullchain.pem、privkey.pem、chain.pem)添加至SERVER标签内。
ssl_certificate   /etc/letsencrypt/live/www.domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.domain.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/www.domain.com/chain.pem;
  • Let’s Encrypt 自动证书续费
mv /root/.pip/pip.conf /root/.pip/pip.conf_old
wget https://dl.eff.org/certbot-auto
chmod +x certbot-auto
mv certbot-auto  /usr/local/sbin/certbot-auto
certbot-auto
  • 添加到定时任务
echo '00  00 * */2 *   /usr/local/sbin/certbot-auto  renew --force-renew ' >>/var/spoor/cront/root
systemctl restart crontd

免费的证书申请网站:

国内免费证书网站 https://freessl.org
国外免费证书网站 https://www.sslforfree.com/

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注