之前,有一个域名使用了网上免费的 ssl 证书,然后想在该证书过期后更换为 Let's encrypt 的免费证书,便想查询下该域名 ssl 证书还剩多少天过期。
查询证书到期时间的方法还是很简单的,以下使用 sslforfree.com 这个域名进行测试,下面简单的记录一下步骤。
该方法的前提是你的域名已经指向了 web 服务器,在浏览器上可以正常访问。
首先使用浏览器访问你的站点域名,然后单击地址栏上面的锁图标进行查看:
上面使用的是firefox浏览器进行查看,其它浏览器应该查看的方法也基本一样。
由于我服务端是搭建在 Centos 上,所以用 xshell 或者 putty 工具登录后,进入证书目录,使用 openssl 命令进行查看:
# cd
:/etc/letsencrypt/sslforfree.com_ecc
#
openssl x509 -in cert.pem -noout -dates
上面改成你自己证书的所在目录,证书名称也改成你自己服务端上证书的名称。
如果你有多个可访问的域名,那么使用代码的方法进行查看就会容易很多,省得一个一个手动查看。下面贴上代码:
/**
* 获取证书有效期
*/
public function getValidity(){
$domain = "sslforfree.com";
$context = stream_context_create(array("ssl" => array("capture_peer_cert_chain" => true)));
$socket = stream_socket_client("ssl://$domain:443", $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $context);
$context = stream_context_get_params($socket);
foreach ($context["options"]["ssl"]["peer_certificate_chain"] as $value) {
//使用openssl扩展解析证书,这里使用x509证书验证函数
$cerInfo = openssl_x509_parse($value);
if(strpos($cerInfo['name'],$domain)) {
echo "start:".date("Y-m-d",$cerInfo['validFrom_time_t'])."
";
echo "end:".date("Y-m-d",$cerInfo['validTo_time_t']);
}
}
}
输出内容:
start:2018-04-06
end:2018-07-05
上面的 $cerInfo 信息参数很多,敢兴趣的可以打印出来看下。
上面介绍了几个查看 ssl 证书到期的方法,一般来说最常用的方法就是直接在浏览器上进行查看了,方便快捷
获取Let's Encrypt的ssl
##获取
wget https://dl.eff.org/certbot-auto
##设置为可执行
chmod a+x certbot-auto
执行自动部署
./certbot-auto
部署过程中会下载一大堆的依赖包,不需要紧张。如果需要确认,(输入"y")确认就好了
这里注意下,在执行过程中,会卡在'Installing Python packages',等待一段时间下载Phthon lib
依赖包下载完后会进入交互界面,依次是: 填写邮箱、域名(多域名用空格或逗号隔开)、条款确认、验证域名所有权(这一步可以选择第一种方式,手动选择tomcat的root目录)
执行成功后会显示
Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/xxx.com/fullchain.pem. Your cert will
expire on 2016-10-05. To obtain a new or tweaked version of this
certificate in the future, simply run certbot-auto again. To
non-interactively renew *all* of your certificates, run
"certbot-auto renew"
此时的生成的证书文件(.pem)都已经在如下路径了
/etc/letsencrypt/
#主要用到的文件(.pem)在
/etc/letsencrypt/live/xxxxx(域名)/
Let's Encrypt申请的证书会有三个月的有效期,可以到期前手动续约,也可以自己写定时脚本任务自动续约。嫌手动麻烦,就写了个简单的续期脚本。
1、脚本
#/bin/sh #续期 说明:只用renew的话,会先检查证书是否需要更新,大概是距离到期还有三天或者十几天之内才会执行更新,否则会提示不需要更新。(昨天更新了证书,今天直接用renew,提示不允许更新) #这里方便测试,增加参数--force-renew,能够强制立即更新(但好像也会有检查,时间会变短,比如我刚才更新过了,马上再次执行会报错并提示不需要更新)。 ./certbot-auto renew --force-renew #生成p12 cd /mnt/web/letsTemp && openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out fullchain_and_key.p12 -name tomcat -passin passyourPKCS12pass -passout pass:yourPKCS12pass #移动新生成的证书文件 cp /etc/letsencrypt/live/yourDomain/fullchain.pem /mnt/web/letsTemp cp /etc/letsencrypt/live/yourDomain/privkey.pem /mnt/web/letsTemp #生成jks文件 #备份并删除原jks文件 mv /mnt/web/letsTemp/MyDSKeyStore.jks /mnt/web/letsTemp/MyDSKeyStore`date '+%Y-%m-%d'`.jks cd /mnt/web/letsTemp && keytool -importkeystore -deststorepass yourKeyPass -destkeypass yourKeyPass -destkeystore MyDSKeyStore.jks -srckeystore fullchain_and_key.p12 -srcstoretype PKCS12 -srcstorepass yourPKCS12pass -alias tomcat #重启服务器 /mnt/web/tomcat/tomcat8/bin/restartup.sh
2、定时任务
脚本有了,还需要在linux中添加一个定期执行脚本的任务,这里用linux自带的cron来处理这部分。
crontab -e
在打开的编辑器中添加如下内容(每个月1号凌晨3点更新)
0 0 3 * * sh /mnt/web/lets/ssl_auto_auth.sh >/dev/null 2>&1 &