- 首页
- 正文
给自己的网站添加一个免费https
SSL证书需要向国际公认的证书证书认证机构(简称CA,Certificate Authority)申请。CA机构颁发的证书有3种类型:
- 域名型SSL证书(DV SSL):信任等级普通,只需验证网站的真实性便可颁发证书保护网站;
- 企业型SSL证书(OV SSL):信任等级强,须要验证企业的身份,审核严格,安全性更高;
- 增强型SSL证书(EV SSL):信任等级最高,一般用于银行证券等金融机构,审核严格,安全性最高,同时可以激活绿色网址栏。
对于一般的个人网站或者对于安全不是很高的企业站来说,域名型SSL证书(DV SSL)已经够用了,在这里,我们选用免费的 Let's Encrypt,下面来说一下 Let's Encrypt 的 DV 证书的安装过程,整个操作都是用 管理员权限
:
创建Let's Encrypt私钥
我们要生成一个Let's Encrypt私钥,因为下面我们生成证书的时候要用到这个私钥的,可以用 openssl
来生成 account.key
私钥
mkdir -p /etc/ssl/mywebsite
cd /etc/ssl/mywebsite
openssl genrsa 4096 > account.key
创建域名的CSR(证书签名请求)
下面生成证书的时候也需要一个CSR文件,在创建CSR文件之前,用下面的命令给我们的域名创建一个私钥
cd /etc/ssl/mywebsite
openssl genrsa 4096 > domain.key
下面根据域名生成CSR
# 单个域名
cd /etc/ssl/mywebsite
openssl req -new -sha256 -key domain.key -subj "/CN=52gvim.com" > domain.csr
# 多个域名
cd /etc/ssl/mywebsite
openssl req -new -sha256 -key domain.key -subj "/" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:52gvim.com,DNS:www.52gvim.com")) > domain.csr
配置域名验证
域名的验证主要是验证这个域名是不是属于你的,怎么确定这个是不是属于你的?Let's Encrypt会在指定的目录里随机生成一个文件, 如果能够通过CSR创建的指定域名去访问指定目录随机文件的话,那这个域名就是属于你的,现在先创建一个指定的目录:
mkdir -p /var/www/challenges
再配置一下能够访问的域名
server {
listen 80;
server_name www.52gvim.com 52gvim.com;
# 增加这部分
location ^~ /.well-known/acme-challenge/ {
alias /var/www/challenges/;
try_files $uri =404;
}
# 结束
location /static/ {
alias /home/project/static/;
}
location / {
proxy_pass http://127.0.0.1:9090;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
获取签名证书
cd /etc/ssl/mywebsite
wget https://raw.githubusercontent.com/diafygi/acme-tiny/master/acme_tiny.py
python acme_tiny.py --account-key ./account.key --csr ./domain.csr --acme-dir /var/www/challenges/ > ./signed.crt
如果成功的话,会在当前目录生成一个 signed.crt
文件,这个文件就是证书
注意:如果操作失败了,要检查一下 /etc/hosts
文件里有没有把域名配置到 其它ip
了,或者上网找一下相关的内容
配置 DHE
使用openssl命令生成一个强壮的DH组
cd /etc/ssl/mywebsite
openssl dhparam -out dhparams.pem 2048
安装证书
把中间证书和网站的证书整合在一起:
cd /etc/ssl/mywebsite
wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem
cat signed.crt intermediate.pem > chained.pem
注意:这里不能用 lets-encrypt-x1-cross-signed.pem
,不然,后面的定时更新证书会一直生成不了 signed.crt
文件
下一步就是配置 nginx,把整合的证书和域名的私钥配置到 nginx 里, 完成要记得 重新一下nginx服务器
server {
listen 80;
server_name www.52gvim.com 52gvim.com;
rewrite ^/(.*) https://www.52gvim.com/$1 permanent;
}
server {
listen 443;
server_name www.52gvim.com 52gvim.com;
ssl on;
# 启用HSTS
add_header Strict-Transport-Security "max-age=31536000;includeSubDomains";
add_header X-Frame-Options DENY;
ssl_certificate /etc/ssl/mywebsite/chained.pem;
ssl_dhparam /etc/ssl/mywebsite/dhparams.pem;
ssl_certificate_key /etc/ssl/mywebsite/domain.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA;
ssl_session_cache shared:SSL:50m;
ssl_prefer_server_ciphers on;
location ^~ /.well-known/acme-challenge/ {
alias /var/www/challenges/;
try_files $uri =404;
}
location /static/ {
alias /home/project/static/;
}
location / {
proxy_pass http://127.0.0.1:9090;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
定时更新证书
Let's Encrypt的免费证书只有3个月的期限,但是可以用脚本自己更新,下面是操作步骤:
在用户的目录 /home/test
新建一个 update_cert.sh,内容如下:
#!/usr/bin/sh
python /etc/ssl/mywebsite/acme_tiny.py --account-key /etc/ssl/mywebsite/account.key --csr /etc/ssl/mywebsite/domain.csr --acme-dir /var/www/challenges/ > /tmp/signed.crt || exit
wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem
cat /tmp/signed.crt intermediate.pem > /etc/ssl/mywebsite/chained.pem
systemctl restart nginx
开时定时器,修改crontab配置,加入以下内容:
# 每个月执行一次
0 0 1 * * /home/test/update_cert.sh 2>> /var/log/acme.log
测试网站
可以到 https://www.ssllabs.com/ssltest/index.html 去查看网站的安全性