本文以Debian 8为服务器栗子
最近升级了个人博客为https协议,写一个详细的教程帮助更多人升级https。
https的详细原理在此文中省略,简略来说,既是客户端在访问服务器时需要一个数字证书(里面包括公钥),它由权威机构(CA, Certificate Authority)颁发,来确认公钥确实是服务器发出来的。
证书价格不菲,大概7天需要几美金到几百美金不等(根据认证的等级和域名覆盖范围区分),所以很多证书都是商业级的,提供给商业网站使用。
获取免费证书
那么个人将无法获取数字证书么?不是的,为了鼓励https的普及,EFF成立了免费证书最大的提供商为Let’s Encrypt,可以提供免费证书。那么小型的网站,就可以使用免费证书升级为https啦。
当然Let’s Encrypt生成的证书,只能是单域名的,而且只有最低级的域名验证。
克隆letsencrypt客户端
$ git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt
如果遇到权限问题,记得先创建/opt/letsencrypt文件夹再,更改文件夹权限为可写入。
注册证书
Nginx指向静态路径注册证书
注册一个域名证书非常简单,使用letsencrypt就能生成https所需的证书。当然,用letsencrypt生成的证书只支持域名验证,只需要用letsenctypt的自动注册证书命令,证明这个域名是自己的是用的即可。
$ cd /opt/letsencrypt
$ ./letsencrypt-auto certonly -a webroot --webroot-path=/var/www/me -d me.chanchun.com.cn # 可以使用多个 -d 添加多个域名
letsencrypt可以帮我们自动注册证书,--webroot-path
是静态资源所指的路径。-d
是域名域名,也可以多个-d
增加多个域名。最后确保使用https的域名都被letsencrypt注册。
后续将会让你继续输入邮箱信息
如果出现Congratulations!字样,则证明证书已被自动注册。
Nginx转发型注册证书
如果是使用Nginx直接重定向服务器本地服务,非静态资源,就省略--webroot-path
和-a
参数。
$ cd /opt/letsencrypt
$ ./letsencrypt-auto certonly -d ca.chanchun.com.cn
输入命令之后
How would you like to authenticate with the ACME CA?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: Nginx Web Server plugin (nginx)
2: Spin up a temporary webserver (standalone)
3: Place files in webroot directory (webroot)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-3] then [enter] (press 'c' to cancel):
选择1即可,后续将会让你继续输入邮箱信息
如果出现Congratulations!字样,则证明证书已被自动注册。
Nginx配置
直到这一步,证书已经就绪,只要配置好Nginx即可完美升级https。Nginx安装、启动教程请具体请教Nginx教程。
转发到本地服务Nginx配置Sample:
#http重定向到https配置 证书验证配置
server {
listen 80;
server_name ca.chanchun.com.cn; # 这里写你的域名
location ^~ /.well-known/acme-challenge/ { # 不要修改 letsencrypt需要验证你的域名
default_type "text/plain";
proxy_pass http://localhost:3000; # 填写你需要转发的服务器地址
}
location = /.well-known/acme-challenge/ { # 不要修改 letsencrypt需要验证你的域名
return 404;
}
return 301 https://$server_name$request_uri;
}
# https配置
server {
# SSL Configuration
listen 443 ssl;
server_name ca.chanchun.com.cn; # 这里写你的域名
# copy from https://cipherli.st
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off; # Requires nginx >= 1.5.9
ssl_stapling on; # Requires nginx >= 1.3.7
ssl_stapling_verify on; # Requires nginx => 1.3.7
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
# specify cert files
ssl_certificate /etc/letsencrypt/live/ca.chanchun.com.cn/fullchain.pem; # 中间填写你的域名
ssl_certificate_key /etc/letsencrypt/live/ca.chanchun.com.cn/privkey.pem; # 中间填写你的域名
location / {
proxy_pass http://localhost:3000; # 填写你需要转发的服务器地址
}
}
指向静态文件Nginx配置Sample:
server {
listen 80;
server_name me.chanchun.com.cn; # 这里写你的域名
location ^~ /.well-known/acme-challenge/ {
default_type "text/plain";
root /var/www/me; # 这里写你的静态文件目录
}
location = /.well-known/acme-challenge/ {
return 404;
}
return 301 https://$server_name$request_uri;
}
server {
# SSL Configuration
listen 443 ssl;
server_name me.chanchun.com.cn; # 这里写你的域名
# specify cert files
ssl_certificate /etc/letsencrypt/live/me.chanchun.com.cn/fullchain.pem; # 中间写你的域名
ssl_certificate_key /etc/letsencrypt/live/me.chanchun.com.cn/privkey.pem; # 中间写你的域名
location / {
root /var/www/me; # 这里写你的静态文件目录
index index.html index.htm; # 这里写你暴露的静态文件
}
}
Nginx配置各有各的配置方法,这里只要保证四点:
- 域名配置正确
- 静态文件目录路径、本地服务目录路径配置正确
-
.well-known/acme-challenge
目录配置正确 - 要保证80默认端口和443ssl端口都有配置
如果配置好Nginx,那么访问网站就会有绿色的小钥匙啦,说明你的https站点搭建好。
自动更新证书
letsencrypt证书最多只有90天,90天之后我们需要重新注册证书,当然这个可以交给服务器自己做啦。
验证自己的证书是否可以更新
$ cd /opt/letsencrypt
$ ./letsencrypt-auto renew --dry-run
此命令只是验证 不会更新证书
如果出现Congratulations!字样或者已经更新字样则证明可以自动更新。如果出现错误,或者说路径找不到的情况,大多数情况是.well-known/acme-challenge
目录配置没有正确的配置成功
编写crontab脚本
$ crontab -e
脚本内容
30 2 * * 1 /opt/letsencrypt/letsencrypt-auto renew >> /var/log/le-renew.log
如果遇到权限问题,可先创建/var/log目录再设置其权限为可写入
成功
享受https的绿色小锁吧!