Nginx配置SSL证书 https网站搭建

自从chrome升级之后,每次打开我自己的网站,浏览器总是有个感叹号,看起来极其碍眼,以后https毕竟是发展趋势,索性就把网站升级成https
升级前的,有个感叹号
no_https
升级后的,有个小绿锁,好看多了~~
has_https

一、申请证书

使用acme.sh申请letsencrypt证书

  • 安装acme
    curl  https://get.acme.sh | sh
  • 创建acme.sh快捷命令
    alias acme.sh=~/.acme.sh/acme.sh

创建证书

  • nginx 方式
    acme.sh --issue -d <域名> --nginx
  • -d 后面是域名

ca_issue_success
创建完成后,证书将放在

~/.acme.sh/<域名>路径下

创建证书保存目录

  • 在任意位置创建一个文件夹,名字可以任意
    mkdir /var/www/ssl/
  • ~/.acme.sh/<域名>下的证书拷贝到/var/www/ssl/目录下
    cp -r ~/.acme.sh/<域名>/ /var/www/ssl/

二、nginx 配置

配置nginx

server {
listen 443 ssl;
listen [::]:443 ssl ipv6only=on;
server_name <域名>;

ssl on;
ssl_certificate /var/www/ssl/<域名>/fullchain.cer;
ssl_certificate_key /var/www/ssl/<域名>/<域名>.key;
}

配置http强制跳转到https(采用301方式)

server {
listen 80;
server_name laoyuyu.me www.laoyuyu.me;

return 301 https://www.laoyuyu.me$request_uri;
}

三、安装证书

安装证书

acme.sh --installcert -d <域名> --key-file /var/www/ssl/<域名>/<域名>.key --fullchain-file /var/www/ssl/<域名>/fullchain.cer --reloadcmd "service nginx force-reload"
  • -d 后面是域名
  • –key-file 后面是<域名>.key 文件
  • –fullchain-file 后面是cer证书路径
  • –reloadcmd 为重启nginx的命令

三、常见问题

chrome 没有小绿锁

原因是,二级域名没有匹配
如:我这laoyuyu.me是匹配了,但是img.laoyuyu.me没有匹配,这样就不能出现小绿锁
chrome_https_load_fail

Too many certificates already

证书重置请求超过次数,一般 3 次,子域名除外。就会出现 Sign failed: “detail”:”Error creating new cert :: Too many certificates already issued for exact set of domains: devhitao.com, 5 天以后才可以再次重置。Rate Limits
解决方法:
不使用rewrite ^(.*)$ https://www.laoyuyu.me$1 permanent;方式,采用301跳转方式

无法自动更新证书

输入

acme.sh --cron -f

同一个IP上配置多个HTTPS主机出现链接不安全问题

server {
listen 443;
server_name www.quwenqing.com;
ssl on;
ssl_certificate www.quwenqing.com.crt;
}

server {
listen 443;
server_name qwq.quwenqing.com;
ssl on;
ssl_certificate qwq.quwenqing.com.crt;
}

使用上面的配置,不论浏览器请求哪个主机,都只会收到默认主机www.quwenqing.com的证书。这是由SSL协议本身的行为引起的——先建立SSL连接,再发送HTTP请求,所以nginx建立SSL连接时不知道所请求主机的名字,因此,它只会返回默认主机的证书。

查看是否启用了TLS:

nginx -V
nginx version: nginx/1.4.6
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC)
TLS SNI support enabled

查看支持TLS协议支持版本:

nmap --script ssl-enum-ciphers -p 443 192.168.192.120

如果已经支持了,但是二级域名还是失败,检查listen [::]:80 ssl ipv6only=on; 80端口是否开启了ssl,如果有的话,删除这行就行了

server {
# listen 80;
# listen [::]:80 ssl ipv6only=on;
listen 443 ssl;
listen [::]:443 ssl ipv6only=on;
server_name <域名>;
ssl on;
ssl_certificate /var/www/ssl/<域名>/fullchain.cer;
ssl_certificate_key /var/www/ssl/<域名>/<域名>.key;
}

四、个人nginx配置

server {
listen 80;
server_name laoyuyu.me www.laoyuyu.me;

return 301 https://www.laoyuyu.me$request_uri;
}

server {
listen 443 ssl;
listen [::]:443 ssl ipv6only=on;

root /var/www/hexo;
server_name laoyuyu.me www.laoyuyu.me;

ssl on;
ssl_certificate /var/www/ssl/www.laoyuyu.me/fullchain.cer;
ssl_certificate_key /var/www/ssl/www.laoyuyu.me/www.laoyuyu.me.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

location / {
try_files $uri $uri/ =404;
}
}

server {
listen 80;
server_name aria.laoyuyu.me;

return 301 https://$server_name$request_uri;
}

server {
listen 443 ssl;
listen [::]:443 ssl;
# root /var/www/gitbook;
server_name aria.laoyuyu.me;

ssl on;
ssl_certificate /var/www/ssl/aria.laoyuyu.me/fullchain.cer;
ssl_certificate_key /var/www/ssl/aria.laoyuyu.me/aria.laoyuyu.me.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

location /aria_doc {
alias /var/www/gitbook/;
index index.html;
}

location / {
rewrite (.*) https://github.com/AriaLyy/Aria redirect;
}
}

参考文档

Nginx配置SSL证书 https网站搭建

https://www.laoyuyu.me/2018/05/10/nginx_ssl_https/

作者

AriaLyy

发布于

2018-05-10

许可协议

CC BY-NC-SA 4.0

评论