互联世界 | Internet技术文章 | Tech苏歌 | So Yee运维日志 | Operations

强迫症的胜利 | SSL认证

目前已经较少网站使用http的连接方式,https发展了几年已经广泛普及。如果你有留意,苏歌的站点此前并没有进行SSL认证,因此打开的时候会有警告,打开以后浏览器会显示红叉叉。对于强迫症来说,是一个非常大的灾难。我们现在来消灭它。

服务器部署了 SSL 证书后,可以确保用户在浏览器上输入的机密信息和从服务器上查询的机密信息,从用户电脑到服务器之间的传输链路上是高强度加密传输的,是不可能被非法篡改和窃取的。同时,向网站访问者证明了服务器的真实身份,此真实身份是通过第三方权威机构(GlobalSign)验证的。也就是说有两大作用:数据加密,身份认证。SSL证书没有所谓的“品质”和“等级”之分,只有三种不同的类型。SSL证书需要向国际公认的证书证书认证机构(简称CA,Certificate Authority)申请。CA机构颁发的证书有3种类型:

  • 域名型SSL证书(DV SSL):信任等级普通,只需验证网站的真实性便可颁发证书保护网站;企业型SSL证书(OV SSL):信任等级强,须要验证企业的身份,审核严格,安全性更高;
  • 增强型SSL证书(EV SSL):信任等级最高,一般用于银行证券等金融机构,审核严格,安全性最高,同时可以激活绿色网址栏。

个人博客、中小企业网站和一些传统行业的形象展示类网站,一般来说只需要申请一个域名型SSL证书(DV SSL)就足够了。通常可以找到免费的认证证书,甚至自己签发。现在根据苏歌的经验,介绍Let’s Encrypt认证方法。

Let’s Encrypt 是 ISRG (Internet Security Research Group)提供的一个免费、开放、自动化的证书签发服务。ISRG 是一个美国公益组织,总部在加州。得到了 Mozilla、Cisco、Akamai、Electronic Frontier Foundation 和 Chrome 等众多公司和机构的支持。

测试环境:Vultr一键安装WordPress的LNMP,系统CentOS 6。

1. 首先安装git

先安装依赖包

yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel

yum install gcc perl-ExtUtils-MakeMaker

再卸载旧版(如有)

yum remove git

下载解压

cd /usr/src

wget https://github.com/git/git/archive/v2.5.0.tar.gz

tar -zxvf v2.5.0.tar.gz

注意:如果出现错误提示,可以先上去网址看看具体是哪个包,名字相应修改。

安装

cd git-2.5.0

make prefix=/usr/local/git all

make prefix=/usr/local/git install

echo "export PATH=$PATH:/usr/local/git/bin" >> /etc/bashrc

source /etc/bashrc

检查版本

git --version

返回以下即正确

git version 2.5.0

以git 方式安装certbot

git clone https://github.com/certbot/certbot

当然也可以用wget方式安装certbot-auto,它会自动安装相关依赖,certbot-auto使用与certbot一样。

wget https://dl.eff.org/certbot-auto -O /sbin/certbot-auto

chmod a+x /sbin/certbot-auto

注意:以上举例命令是把certbot-auto安装到sbin 目录下。

2. certbot方式认证

用winSCP登陆服务器,在根目录创建一个叫做.well-known 的隐藏文件夹,设置可以读写。注意文件夹前面有一点,才是隐藏文件夹。然后打开你网站域名的nginx设置文件。在苏歌的例子中,该文件放在/etc/nginx/conf.d中,对应的设置文件名字是wordpress_http.conf。根据当初安装环境,每个人的系统和安装目录不一定相同,对应的路径要随之修改。如果你和苏歌的安装环境一致,也不要用错文件,另外的那个wordpress_https.conf不要去管它。

在nginx设置文件的service模块,增加以下语句:

location ~ /.well-known {</span>

<span style="font-family: 'comic sans ms', sans-serif;">allow all;</span>

<span style="font-family: 'comic sans ms', sans-serif;">}

增加完以后,代码应类似如下这样:

server {</span>

<span style="font-family: 'comic sans ms', sans-serif;">listen 80;</span>

<span style="font-family: 'comic sans ms', sans-serif;">server_name 你的网站域名 如多个空格再写;</span>

<span style="font-family: 'comic sans ms', sans-serif;">root /var/www/html/blog;</span>

<span style="font-family: 'comic sans ms', sans-serif;">localtion / {</span>

<span style="font-family: 'comic sans ms', sans-serif;">...............</span>

<span style="font-family: 'comic sans ms', sans-serif;">}</span>

<span style="font-family: 'comic sans ms', sans-serif;">location ~ /.well-known {</span>

<span style="font-family: 'comic sans ms', sans-serif;">allow all;</span>

<span style="font-family: 'comic sans ms', sans-serif;">}</span>

<span style="font-family: 'comic sans ms', sans-serif;">}

再次提醒,不是所有路径都一样,例如上述的root 路径,或者你的是没有blog这个目录。多看看语句,就大概知道什么意思。做完上述步骤,重启nginx。

service nginx reload

随后,

/sbin/certbot-auto certonly --webroot -w /var/www/html/blog -d 你的网站域名

这个命令的意思是:用安装在/sbin下的certbot-auto 仅作认证,网站的根目录在/var/www/html/blog 处。如果你有多个域名,指向同一个网站IP,后面再加-d 另一个域名,就可以了。这样,两个域名都用同一张证书进行认证。

然后填写一些必要信息后,证书生成,保存在/etc/letsencrypt/live/你的网站域名,当然,如果提示目录不存在,你可以手动建立“你的网站域名”文件夹,再试一次。

3. 配置nginx

在拿到证书后,我们要开始配置 Nginx 来使用这些证书。我们需要再一次打开网站的配置文件,并且让 Nginx 监听 443 端口、配置 SSL 地址以及配置 80 自动跳转。我们直接修改刚才那个配置文件,把 Listen 80; 改成 Listen 443 ssl; ,修改完之后的配置文件是这样的:

server {</span>

<span style="font-family: 'comic sans ms', sans-serif;">listen 80;</span>

<span style="font-family: 'comic sans ms', sans-serif;">server_name 你的域名;</span>

<span style="font-family: 'comic sans ms', sans-serif;">return 301 https://$host$request_uri;</span>

<span style="font-family: 'comic sans ms', sans-serif;">}</span>

<span style="font-family: 'comic sans ms', sans-serif;">server {</span>

<span style="font-family: 'comic sans ms', sans-serif;">listen 443;</span>

<span style="font-family: 'comic sans ms', sans-serif;">server_name 你的域名;</span>

<span style="font-family: 'comic sans ms', sans-serif;">root /var/www/html/blog;</span>

<span style="font-family: 'comic sans ms', sans-serif;">ssl_certificate /etc/letsencrypt/live/你的域名/fullchain.pem;</span>

<span style="font-family: 'comic sans ms', sans-serif;">ssl_certificate_key /etc/letsencrypt/live/你的域名/privkey.pem;</span>

<span style="font-family: 'comic sans ms', sans-serif;">localtion / {</span>

<span style="font-family: 'comic sans ms', sans-serif;">...............</span>

<span style="font-family: 'comic sans ms', sans-serif;">}</span>

<span style="font-family: 'comic sans ms', sans-serif;">location ~ /.well-known {</span>

<span style="font-family: 'comic sans ms', sans-serif;">allow all;</span>

<span style="font-family: 'comic sans ms', sans-serif;">}</span>

<span style="font-family: 'comic sans ms', sans-serif;">}

第一段是80跳转,即http强制转到https,第二段监听443端口,打开ssl认证,其他就是你证书存放的位置。然后保存,重启nginx。报错的话,一般是路径问题,修改成自己的实际路径就可以。重启nginx前,使用nginx -t检查一下,也是很好的习惯。

LetsEncrypt的证书三个月有效,请记得续期。或者安装crontab做一个计划任务,让它自动续期。centos一般已经安装,未安装的自行搜索。

crontab -e

然后,粘贴以下命令

30 3 * * 1 /sbin/certbot-auto renew --quiet --no-self-upgrade

35 3 * * 1 /etc/init.d/nginx reload

保存退出。这个命令的意思是,每周一凌晨 3 点 30 分对证书进行续签,并且在 3 点 35 分重启一下 Nginx 。你可以安装自己的习惯自行修改,或者按官方隔两天更新一次也可以的!

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.