Let’s Encrypt ,给你的网站上https!

前几天给我们网站的所有域名都换了https证书,用的是Let‘s Encrypt。

Let‘s Encrypt是一个免费的https证书提供平台,包括chrome,firefox在内的主流浏览器都支持。重点是免费,不过有效期是90天,到期得重新更新证书。

EEF有一个certbot工具可以自动化的在你的网站部署https证书,我试了一下,对centos的支持好像不太友好,于是google一下,搜到了jerryqu大神的一篇博客,利用的另外一种方式部署。

首先创建一个目录:

mkdir ~/ssl && cd ~/ssl

然后我们需要一个账户和网站的私钥。

openssl genrsa 4096 > account.key  //账户私钥,用来识别身份
openssl genrsa 4096 > domain.key   // 域名私钥

接下来要创建CSR(Certificate Signing Request,证书签名请求)文件

openssl req -new -sha256 -key domain.key -out domain.csr

这里,因为需要交互,填的信息比较多,包括国家,公司,域名等等,输错了就得重来。所以我做了一个expect脚本,用来自动化填写信息。脚本如下,供参考

auto_crs.sh
#!/usr/bin/expect

set timeout 20
spawn openssl req -new -sha256 -key domain.key -out domain.csr
expect {
    "*Country Name*" send{"zh\r"}
}
expect {
    "*Province Name*" send{"Beijing\r"}
}
expect {
    "*Locality Name*" send{"Chaoyang\r"}
}
expect {
    "*Organization Name*" send{"your company name\r"}
}
expect {
    "*Unit Name*" send{"your company name\r"}
}
expect {
    "*Common Name*" send{"your domain name\r"}
}
expect {
    "*Email*" send{"your email\r"}
}
expect {
    "*password*" send{"password\r"}
}
expect {
    "*password*" send{"password\r"}
}
interact
chmod +x auto_crs.sh

然后当前目录下会生成一个domain.csr文件,然后我们就可以生成证书了。

CA 在签发 DV(Domain Validation)证书时,需要验证域名所有权。传统 CA 的验证方式一般是往 admin@yoursite.com 发验证邮件,而 Let’s Encrypt 是在你的服务器上生成一个随机验证文件,再通过创建 CSR 时指定的域名访问,如果可以访问则表明你对这个域名有控制权。

所以,我们需要设置一下服务器,比如我们要验证对www.example.com的控制权。以apache为例,设置httpd.conf或者vhost文件:

先创建一个目录用来存放验证文件,

mkdir ~/challenge

然后更改配置

<Directory docuemnt_root>
    <IfModule alias_module>
         Alias /.well-known/challenge/ /home/xxx/challenge/
    </IfModule>
</Directory>

证书服务器会先在challenge目录创建一个随机文件,然后访问www.example.com/.well-known/challenge/随机文件,如果访问正常,则可以验证你对网站的控制权。

然后,我们用acme-tiny这个工具生成证书, 下载脚本:

wget https://raw.githubusercontent.com/diafygi/acme-tiny/master/acme_tiny.py

指定账户私钥、CSR 以及验证目录,执行脚本:

python acme_tiny.py --account-key ./account.key --csr ./domain.csr --acme-dir ~/challenges/ > ./signed.crt

如果一起ok,那么会生成一个crt文件,这就是我们要的证书。

搞定网站证书后,还要下载 Let’s Encrypt 的中间证书:

wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem
cat signed.crt intermediate.pem > chained.pem

最后修改,打开ssl module,修改httpd-ssl.conf文件(先Include),增加证书相关配置,然后重启apache即可。

对于多域名设置,没有深究,我写了一个脚本来设置多域名,如下,供参考:

#!/bin/bash

cd ~/ssl/
domain=$1
dir=`ls -al|grep ${domain} > /dev/null;echo $?`
if [ ${dir} -eq "0" ];then
echo "Domain exists"
exit
fi

cp -R ssl-www.example.com/ ssl-${domain}/ && cd ssl-${domain}/
sed -i 's/www.example.com/'${domain}'/g' auto.csr.sh
./auto_csr.sh
./renew_cert.sh

关于公私钥位数,我用的是4096位,想了一下,除了在ssl握手时会使用一次非对称,传输一次公钥,后面都是使用随机字串对称加密,所以并不会影响性能或者可以忽略不计,使用4096位更加安全。

另外,部署后可以在Qualys上test一下。

参考:

https://imququ.com/post/letsencrypt-certificate.html

https://letsencrypt.org/

www.certbot.com

用php创建一个守护进程

参考文章

示例代码

想到之前看到linux下,nohup和&一起使用可以创建一个后台job,例如:

nohup ping www.google.com & 1>/dev/null 2&>1

意思是让ping命令不接受hangup信号,也就脱离了终端的控制。该命令会在后台变成一个job:

[1]  33765

[1]表示job号码,33765代表进程id。使用jobs可以列出所有的jobs,也可以使用ps -ef|grep查看

bg %num命令可以将一个job后台执行

fg %num命令可以将一个命令前台执行  // num代表job号码

ctrl + z可以将一个job挂起暂停

kill %num 或 kill pid可以终止某个job

自动登录ssh脚本

远程登录服务器,每次都要输命令-复制粘贴密码-切换目录,非常麻烦,于是上网查了一下有没有自动登录的脚本,果然有,研究了一下,使用很方便。

脚本使用的shell不是bash,而是expect。之前我们都是直接把一堆命令写在脚本里,但是如果遇到交互式的命令,比如ssh,telnet等就没有办法了,expect正是为了满足交互式命令的自动化处理。

在使用前,先需要安装tcl和expect,centos下,直接

sudo yum install tcl expect

也可以去官网下载压缩包,解压,然后编译安装。

下载完就可以使用了,具体expect的语法很丰富,网上也有很多文章讲的很详细。

对于ssh登录,我的简单三行脚本就搞定了。

!#/usr/bin/expect
set timeout 10
spawn ssh root@xx.xx.xx.xx -p xxxx
expect {
    "*password*" {send "ur password"}
}
interact

 spawn是我们需要执行的命令

 expect可以理解为接受远程服务器与我们交互所发送的信息,比如让我们输入password,在字符串前面加上-re,表示用正则匹配

 send则可以理解为发送需要的信息给远程服务器。

 interact执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远  程终端上。如果你只是登录过去执行一段命令就退出,可改为 expect eof

bar

#/bin/bash
PATH=${PATH}:~/bin
export PATH

预览
eat[1]="卖当当漢堡包"       # 写下你所收集到的店家!
eat[2]="肯爷爷炸鸡"
eat[3]="彩虹日式便当"
eat[4]="越油越好吃大雅"
eat[5]="想不出吃啥学餐"
eat[6]="太师父便当"
eat[7]="池上便当"
eat[8]="怀念火车便当"
eat[9]="一起吃方便面"

index=0
while [ 1 ]
do

check=$((${RANDOM}*9/32767 +1))

if [ ${#picked[@]} ==  0 ]; then
picked[${index}]=${check}
continue
fi

for ((i=0;i<${#picked[@]};i++))
do
   if [ ${check} == ${picked[${i}]} ]; then
      continue 2
   fi
done

((index++))
picked[${index}]=${check}

if [ ${index} == 2  ]; then
break
fi

done

for pick in $(echo ${picked[*]})
do
echo ${eat[${pick}]}
done