python获取https证书有效期

首先要安装一个依赖

pyOpenSSL==19.1.0

下面是简单的代码:

# coding: UTF-8


import re
import select
import socket
import OpenSSL
from datetime import datetime, timedelta


class CertInfo:
    def __init__(self, host, cert_host, start_time, end_time):
        self.host = host
        self.cert_host = cert_host
        self.start_time = datetime.strptime(start_time.decode("UTF-8"), "%Y%m%d%H%M%SZ")
        self.end_time = datetime.strptime(end_time.decode("UTF-8"), "%Y%m%d%H%M%SZ")

        now = datetime.now()
        self.warn = now + timedelta(days=10) >= self.end_time

        self.days = (self.end_time - now).days

    def __str__(self):
        return "域名:" + self.host + ",证书dns:" + self.cert_host + ",过期时间:" + self.end_time.strftime(
            "%Y-%m-%d %H:%M:%S") + ",剩余天数:" + str(
            self.days)


def _get_cert_from_domain(domain):
    ctx = OpenSSL.SSL.Context(OpenSSL.SSL.SSLv23_METHOD)
    sock = socket.socket()
    sock.settimeout(15)
    wrapped_sock = OpenSSL.SSL.Connection(ctx, sock)
    wrapped_sock.set_tlsext_host_name(domain.encode('ascii'))
    wrapped_sock.connect((domain, 443))
    while True:
        try:
            wrapped_sock.do_handshake()
            break
        except OpenSSL.SSL.WantReadError:
            select.select([wrapped_sock], [], [])
    return wrapped_sock.get_peer_cert_chain()


def check(host):
    data = _get_cert_from_domain(host)
    for cert in data:
        cert_host = cert.get_subject().get_components()[0][1].decode("UTF-8")
        re_cert_host = cert_host.replace("*", ".*")
        if not re.match(re_cert_host, host):
            continue
        return CertInfo(host, cert_host, cert.get_notBefore(), cert.get_notAfter())


if __name__ == '__main__':
    info = check("tech.yubangweb.com")
    print(info)

后端全docker化之后日志处理问题

现在大部分中小型企业也用上了docker了,为何?因为不用那么复杂的配置各种环境了。并且可以简单的基于docker swarm打通多台服务器,应用越来越多的时候,只需要不断增加机器,不用处理复杂的运维。但是这种便利的背后是并不知道某个时刻应用跑在那台服务器上,如果应用出现异常需要查询日志的时候,每台机去寻找应用所在容器,然后进入查看应用日志文件,那未免过于复杂了。

网上推荐的都是elk来收集日志,但是对于只有几个开发的小团队,可没有那种精力来维护一套如此庞大的系统。并且elk那么占用资源,对于小企业来说也太不划算了吧。

最简单的解决办法是什么呢?我们团队的做法是,自己做一个http的日志应用,然后所有应用写日志变成post数据到日志应用,只要封装一个小SDK给每个应用就能简单方便的调用了。日志应用存入数据库即可,对于小团队来说选择最合适自己的方案还是好的方案。

第一次打开https很慢的问题

最近由于产品网页上了https,证书直接用Let’s Encrypt的免费证书,想着虽然每90天就要续签一次,但是成本低呀也无所谓。但是却发现每天第一次打开网站的时候总有一种卡顿的感觉,那么当然要分析一下原因来。

从chrome的控制台可以看到,耗时主要在SSL上,那么说明建立https的时候消耗了大量时间从而造成卡顿。建立连接怎么会这么慢呢,别人的网站也不至于呀。网上找了一轮资料,有点帮助的就是说要开启OCSP Stapling,就是说服务器代替浏览器去拿什么校验的数据,避免浏览器去访问很慢的校验服务器,细节就没去了解。

既然要开启OCSP Stapling,那就尝试用nginx开启OCSP Stapling,结果我自己测试是没有什么效果的。配置的是什么,就是网上都在说的:

ssl_stapling on;
ssl_stapling_verify on;

但是企业产品,不能一直就第一次打开那么慢,既然校验慢,换一家https证书服务商来试一下,是不是服务商的问题。结果换了服务商速度就好了。

小团队遇到的运维难题

初创企业往往是没有专门的运维的,但是企业的性质觉得产品是要快速迭代的。往往发生的事情是一天投产5,6次,别觉得不可思议,经历过的人都懂。

对于小团队而言,后端的同学往往兼任了运维的职责,那么无论前后端项目的发布都要自己手动或者自动化去部署,这个时候我们后端的同学肯定不愿意手动上服务器去更新代码,重启服务。如果说编写自动化脚本,一个是工作量的问题,一个是前端同学发布还是要找后端同学去发布。所以带GUI的部署工具是最优解了,前端同学部署也可以自己操作了。

先放上一些常见部署方案

  • 手动上服务器,git更新代码,shell脚本重启服务
  • 接收git钩子推送信息,自动pull代码,重启服务
  • 定时拉取最新代码(适合php,静态页面,或者配置了自动加载代码的服务)
  • 使用带GUI的CI/CD工具

上面的方案没有最好的,只有最适合自己的方案。毕竟如果整个团队只有一个研发,并且只有一个工程的项目,直接上去手动更新代码不好么。如果一个团队几个后端几个前端,我弄一个有GUI的部署工具,每个人自己上去部署不好么。

下面给出本人所在团队的部署方案:

基于腾讯工蜂来托管代码,瓦力(开源的CI/CD工具)来可视化构建部署项目,构建过程都基于docker容器,灵活隔离多环境的构建,而部署通过docker swarm来管理,毕竟k8s太消耗资源了,对小企业来说不太划算。