HTTPS需要什么
https基于RSA非对称加密算法,客户端利用公钥加密数据(准确来说是会话key),服务端利用对应的私钥来解密;由于公钥的公开性,无法保证正确性,所以引入了第三方权威机构CA来签发数字证书,数字证书中包含服务端的公钥并和私钥一起保存在服务端,客户端必须从服务端获取数字证书,然后从中取出公钥。然而,CA给站点签发数字证书通常都是收费的, 所以,支持HTTPS的站点,需要三个东西:数字证书、私钥和money。
Let's Encrypt是什么
简单地说,Let's Encrypt是一个免费的CA,背后有Linux基金会和facebook等知名公司撑腰,目的是加速互联网https化进程,所以大家快快用啊!于是,上面说的https需要的东西变成了两个:数字证书、私钥。下面就看看在服务端如何部署这两样东西,让别人访问我们的站点的时候也能显示出高大上的绿框框。
Linux下Nginx服务端部署Https
确保系统安装了python2.7以上的版本,因为Let's Encrypt程序基于python编写。然后安装pip,再通过pip安装virtualenv。
$ python get-pip.py
$ pip install virtualenv
按照Let's Encrypt官方站点的How It Works指导安装Let's Encrypt程序包,安装过程中如果遇到一些错误或者警告,可能是上述的python环境配置不正确,需要优先确保python的配置正确性。官方指南有针对不同web server的plugin,不过这里推荐standalone模式,与web server类型无关,更加通用。
$ git clone https://github.com/letsencrypt/letsencrypt
$ cd letsencrypt
$ ./letsencrypt-auto --help
$ ./letsencrypt-auto certonly --standalone -d yuanwhy.com
生成数字证书的过程中,会要求输入邮箱,同时会检验该域名是否指向当前机器的ip,其实目的就是验证你是不是该域名的真实所有者。成功之后,会出现Congratulations!,在/etc/letsencrypt目录下生成一系列的文件,这里我们只需要关心两个东西:数字证书和私钥文件,在/etc/letsencrypt/archive/yuanwhy.com/目录下,fullchain1.pem就是数字证书,privkey1.pem 就是私钥文件,可以用cat命令查看文件内容,都是标准的Base64编码。修改nginx的配置文件,启用ssl,指明数字证书和私钥文件的地址即可,本站的配置如下
server {
listen 443 ssl;
server_name yuanwhy.com;
ssl_certificate /etc/letsencrypt/archive/yuanwhy.com/fullchain1.pem;
ssl_certificate_key /etc/letsencrypt/archive/yuanwhy.com/privkey1.pem;
ssl_session_cache shared:SSL:100m;
ssl_session_timeout 500m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root /usr/share/nginx/yuanwhy.com/wordpress;
index index.php;
}
location ~ \.php {
root /usr/share/nginx/yuanwhy.com/wordpress;
fastcgi_index index.php;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
如果想强制http协议访问跳转到https,配置nginx转发即可
server {
listen 80;
server_name yuanwhy.com;
return 301 https://$host$request_uri;
}