准备
- 已购买已备案的域名
- acme.sh 是一个自动申请 https 证书的脚本,使用方便,功能也非常强大。
安装:curl https://get.acme.sh | sh
或
wget -O - https://get.acme.sh | sh
这样你已经把 acme.sh 这个小工具安装到你本地的
~/.acme.sh/
中了,而不会在你系统的其它地方装些乱七八糟的东西。
生成证书
这篇文章后面用到的一键脚本申请Let's Encrypt泛域名SSL证书,是利用第三方域名DNS API接口快速申请的,这样。无论我们Linux VPS、服务器使用的何种WEB环境都可以快速申请。
根据脚本的介绍,提供且支持我们常见的第三方DNS,包括DNSPOD、CLOUDXNS、阿里云DNS、GoDaddy、CLOUDFLARE、PowerDNS、Linode 等40多家DNS服务商。如果我们域名有用哪家的DNS,然后到对应的商家申请API。查看支持的商家:https://github.com/acmesh-official/acme.sh/wiki/dnsapi
阿里云购买域名的朋友可以走这个极速通道,因为阿里云有接口可以直接操作域名控制台,这个接口已经被整合到了 acme.sh
这个工具里面。只要设置一下 Ali_Key 和 Ali_Secret,获取入口:https://ak-console.aliyun.com/#/accesskey
- 在你的命令行中执行如下命令:
export Ali_Key="换成你的 AccessKey ID" export Ali_Secret="换成你的 Access Key Secret"
- 开始申请证书
im20.life 是我的域名,这里需要换成你的。acme.sh --issue --dns dns_ali -d im20.life -d '*.im20.life'
参数解释:
acme.sh :表示使用你刚安装好的acme.sh
--issue :申请证书
--dns dns_ali:使用阿里云的 dns 服务,在阿里云买的域名,在没有修改默认 dns 的前提下,都可以使用这个参数来申请 https 证书。
-d im20.life:-d
表示 domain,后面跟你要申请域名。
-d '*.im20.life':这里的-d 与上方一样,-d 参数可以带多个,这里的'*.im20.life'
中的 * 表示泛域名,只要申请了这个证书像(www.im20.life, m.im20.life ...)这类的二级域名都可以使用此证书来实现 https。注意 baidu.com
这个域名不在这条规则里,所以上面又加了一条-d im20.life
,这样你的主域名、二级子域名均可以使用此证书。
证书生成成功后,默认保存在 .acme.sh/你的顶级域名
中。如下图所示即为成功。
配置Nginx
1、移动证书到/etc/nginx/cert文件夹,若无该文件夹,自行创建。
cp ~/.acme.sh/im20.life/fullchain.cer /etc/nginx/cert/fullchain.cer
cp ~/.acme.sh/im20.life/im20.life.key /etc/nginx/cert/im20.key
2、新建 ssl-params.conf
并把它放到 Nginx 的 snippets
目录中。
# /etc/nginx/snippets/ssl-params.conf
server_tokens off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 60m;
ssl_session_tickets on;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.4.4 8.8.8.8 valid=300s;
resolver_timeout 10s;
ssl_prefer_server_ciphers on;
# 证书路径 绝对地址
ssl_certificate /etc/nginx/cert/fullchain.cer;
ssl_certificate_key /etc/nginx/cert/im20.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
add_header Strict-Transport-Security "max-age=31536000;includeSubDomains;preload";
add_header X-Frame-Options deny;
add_header X-Content-Type-Options nosniff;
add_header x-xss-protection "1; mode=block";
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https:; connect-src 'self' https:; img-src 'self' data: https: blob:; style-src 'unsafe-inline' https:; font-src https:";
3、接下来在 Nginx 主配置文件中开启 SSL
支持
# /etc/nginx/nginx.conf
http {
....
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
}
4、配置虚拟主机
# /etc/nginx/conf.d/im20.life.conf
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name im20.life www.im20.life;
return 301 https://$server_name$request_uri;
}
server {
# 注意我们设置该站点为默认站点,并移除了 nginx 默认的 default 配置
listen 443 ssl http2 fastopen=3 reuseport default_server;
listen [::]:443 ssl http2 fastopen=3 reuseport default_server;
server_name www.im20.life im20.life;
# 引入 SSL 及 PHP 配置
include snippets/fastcgi-php.conf;
include snippets/ssl-params.conf;
root /home/www/websites/im20.life/public;
access_log /home/www/websites/im20.life/storage/logs/nginx-access.log;
error_log /home/www/websites/im20.life/storage/logs/nginx-error.log error; index index.php;
# 当访问域名是不 im20.life 强制跳转到 https://im20.life
if ($host != 'im20.life' ) {
rewrite ^/(.*)$ https://im20.life/$1 permanent;
}
}
二级域名blog.im20.life的配置
# /etc/nginx/conf.d/blog.im20.life.conf
server {
listen 80;
listen [::]:80;
server_name blog.im20.life;
return 301 https://$server_name$request_uri;
}
server {
# 如果多个域名配置在同一主机,这里只需要监听到 433 就可以了,
# 不需要再添加 ssl http2 fastopen=3 reuseport default_server 之类的了
listen 443;
listen [::]:443;
root /home/www/websites/blog.im20.life/public-admin;
access_log /home/www/websites/blog.im20.life/storage/logs/nginx-access.log;
error_log /home/www/websites/blog.im20.life/storage/logs/nginx-error.log error;
server_name blog.im20.life;
index index.php;
client_max_body_size 20M;
include snippets/fastcgi-php.conf;
include snippets/ssl-params.conf;
if ($host != 'blog.im20.life' ) {
rewrite ^/(.*)$ https://blog.im20.life/$1 permanent;
}
}
5、虚拟主机配置完成后重启nginx即可
service nginx restart