通过Python脚本下载【来此加密的免费HTTPS SSL证书】并自动更新到服务器和阿里云CDN
異想之旅:本人原創(chuàng)博客完全手敲,絕對(duì)非搬運(yùn),全網(wǎng)不可能有重復(fù);本人無團(tuán)隊(duì),僅為技術(shù)愛好者進(jìn)行分享,所有內(nèi)容不牽扯廣告。本人所有文章僅在CSDN、掘金和個(gè)人博客(一定是異想之旅域名)發(fā)布,除此之外全部是盜文!
本文適用對(duì)象:要求證書更新后自動(dòng)化部署(除了IIS之外的服務(wù)器軟件)、能接受一定成本(19元)的個(gè)人開發(fā)者
去年3月網(wǎng)站使用SSL證書先是使用的騰訊云免費(fèi)證書。這個(gè)證書雖然有一年的有效期,但是免費(fèi)版只支持單域名,對(duì)我這樣做了許多小微服務(wù)站點(diǎn)的開發(fā)者就很不友好了。于是我在知乎上找到了來此加密(https://letsencrypt.osfipin.com/)。
這是一個(gè)基于Let’s Encrypt項(xiàng)目的封裝,選擇它主要是由于它簡(jiǎn)單、一勞永逸的驗(yàn)證方式和API的支持,方便我們部署到自己的服務(wù)器。
如果你的需求是上傳到阿里云等云服務(wù)商的SSL證書管理,不需要本地部署,可以考慮OHTTPS(https://ohttps.com/),操作更加方便,成本接近。
我們首先注冊(cè)賬號(hào),然后點(diǎn)擊左上角的三條橫杠,獲取積分,充值一定金額保證賬戶余額達(dá)到200積分,再點(diǎn)擊積分兌換兌換VIP。緊接著去申請(qǐng)證書,如果你已經(jīng)可以使用自動(dòng)驗(yàn)證那么最好,沒有的話也沒關(guān)系,先稍微麻煩一下配幾次DNS驗(yàn)證,申請(qǐng)完后可以更改為自動(dòng)驗(yàn)證。
關(guān)于自動(dòng)重申:如果你有錢去自動(dòng)重申自然是更好的(也不貴,更新一次一塊錢),但是本文接下來的方法如果僅使用自動(dòng)驗(yàn)證也是可以的,只是需要你每次更新時(shí)上網(wǎng)站來點(diǎn)兩下按鈕罷了。
按照上述操作后應(yīng)該會(huì)看到這樣子的界面:
我們先手動(dòng)部署一次證書,然后再記住給出的自動(dòng)驗(yàn)證ID,接著就可以上代碼了!
代碼很簡(jiǎn)單,且相比官方給出的腳本可擴(kuò)展性更強(qiáng)、同時(shí)兼容Linux和Windows。需要改的都在開頭,該講到的在注釋說明了。
每次過期前13天起,程序會(huì)每12小時(shí)拉取一次證書,直到證書有效期變長(zhǎng)(也就是已經(jīng)在官網(wǎng)重新申請(qǐng)了的)。
API KEY獲取:點(diǎn)擊來此加密網(wǎng)頁左上角三個(gè)杠,API接口,創(chuàng)建一個(gè)KEY
##### User Info #####email = "mail@yixiangzhilv.com" # 來此加密注冊(cè)郵箱 key = "APIKEY" # 你的API KEY cids = ["29dwnz"] # 每個(gè)需要更新證書的自動(dòng)驗(yàn)證ID crt_files = ["E:/Desktop/fullchain.crt"] # 需要更新的證書文件的本地路徑(順序?qū)?yīng)cid) crt_key_files = ["E:/Desktop/private.pem"] # 證書密鑰文件(順序?qū)?yīng)cid) reload_shell = ["nginx -s reload"] # 更新證書后需執(zhí)行的命令##### End User Info #####import os import shutil import time import requests as rq import zipfile# 構(gòu)建API請(qǐng)求參數(shù) head = {"Authorization": "Bearer %s:%s" % (key, email)} url = "https://api.osfipin.com/letsencrypt/api/order/down?type=auto&day&id=" # 從下載的文件取fullchain.crt和private.pem crt_file_name = "fullchain.crt" crt_key_file_name = "private.pem"def unzip(file_name):# 解壓zip文件zip_file = zipfile.ZipFile(file_name)if os.path.isdir(file_name + "_files"):passelse:os.mkdir(file_name + "_files")for names in zip_file.namelist():zip_file.extract(names, file_name + "_files/")zip_file.close()return file_name + "_files"def ftime():# 獲取格式化的時(shí)間顯示return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())def get_etime(file):# 檢查crt文件的有效期,返回GMT格式字符串return os.popen("openssl x509 -in %s -noout -enddate -checkend 9123200" %file).read().splitlines()[0].split("=")[1]while True:# 遍歷所有證書信息for i in range(len(cids)):# 初始化名稱信息crt_file = crt_files[i]crt_key_file = crt_key_files[i]cid = cids[i]# 檢查當(dāng)前使用的crt文件到期時(shí)間(etime為GMT格式,etimes為時(shí)間戳)etime = ""etimes = 0if os.path.isfile(crt_file):etime = get_etime(crt_file)etimes = time.mktime(time.strptime(etime, "%b %d %H:%M:%S %Y GMT"))# 到期13天內(nèi)則更新if etimes - time.time() < 86400 * 13:# 下載并保存證書文件(zip格式)r = rq.get(url + cid, headers=head)zname = r.headers["Content-Disposition"].split("=")[-1]with open(zname, "wb") as f:f.write(r.content)# 解壓并更新文件fname = unzip(zname)shutil.copyfile(fname + "/" + crt_file_name, crt_file)shutil.copyfile(fname + "/" + crt_key_file_name, crt_key_file)etime = get_etime(crt_file)print("%s: 更新成功。更新后有效期至%s。" % (ftime(), etime))# 重啟服務(wù),并刪除下載的臨時(shí)文件for j in reload_shell:os.system(j)os.remove(zname)shutil.rmtree(fname)else:print("%s: 當(dāng)前證書有效期至%s, 暫未更新。" % (ftime(), etime))# 休眠12小時(shí)time.sleep(3600 * 12)使用 nohup 或者 screen 掛起腳本運(yùn)行,即可在每季度僅僅動(dòng)一下手指的情況下更新證書了!
另外,本人有更新至阿里云CDN的需求,因此也為這個(gè)寫了一個(gè)類似的腳本。騰訊云等可以略改一點(diǎn)后使用
##### User Info ###### 下方所有列表配置內(nèi)容的順序均遵循cids的配置### 來此加密用戶信息 ### email = "" key = "" cids = ["29dwnz", "6d4de1"]### 本地服務(wù)器信息(證書和密鑰存儲(chǔ)位置) crt_files = ["yixiangzhilv.com_fullchain.crt", "yxzl.top_fullchain.crt"] crt_key_files = ["yixiangzhilv.com_private.pem", "yxzl.top_private.pem"]### 阿里云CDN信息 ACCESS_KEY = "" ACCESS_TOKEN = "" domains = [["www.yixiangzhilv.com"], ["login.yxzl.top"]] # 每個(gè)證書所對(duì)應(yīng)的CDN域名##### End User Info #####import os import shutil import time import requests as rq import zipfile from aliyunsdkcore.client import AcsClient from aliyunsdkcore.auth.credentials import AccessKeyCredential from aliyunsdkcdn.request.v20180510.SetDomainServerCertificateRequest import SetDomainServerCertificateRequestcrt_file_name = "fullchain.crt" crt_key_file_name = "private.pem" head = {"Authorization": "Bearer %s:%s" % (key, email)} url = "https://api.osfipin.com/letsencrypt/api/order/down?type=auto&day&id=" credentials = AccessKeyCredential(ACCESS_KEY, ACCESS_TOKEN) client = AcsClient(region_id="cn-hangzhou", credential=credentials)def log(l):print(l)rq.post("https://chat.yixiangzhilv.com/public-cdnssl", # 可選,使用異想之旅chat獲取結(jié)果。房間路徑建議自定義data={"send_type": "secret","text": l},cookies={"send_type": "secret"})def upload(domain, cert_name, cert, cert_key):with open(cert, "r") as f:cert_content = f.read()with open(cert_key, "r") as f:cert_key_content = f.read()request = SetDomainServerCertificateRequest()request.set_accept_format("json")request.set_DomainName(domain)request.set_CertName(cert_name)request.set_CertType("upload")request.set_ServerCertificateStatus("on")request.set_ForceSet("1")request.set_ServerCertificate(cert_content)request.set_PrivateKey(cert_key_content)response = client.do_action_with_exception(request)print(str(response, encoding='utf-8'))def unzip(file_name):# 解壓zip文件到同一路徑zip_file = zipfile.ZipFile(file_name)if os.path.isdir(file_name + "_files"):passelse:os.mkdir(file_name + "_files")for names in zip_file.namelist():zip_file.extract(names, file_name + "_files/")zip_file.close()return file_name + "_files"def ftime():# 獲取格式化的時(shí)間顯示return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())def get_etime(file):# 檢查crt文件的有效期,返回GMT格式字符串return os.popen("openssl x509 -in %s -noout -enddate -checkend 9123200" %file).read().splitlines()[0].split("=")[1]while True:# 遍歷所有證書信息for i in range(len(cids)):# 初始化名稱信息crt_file = crt_files[i]crt_key_file = crt_key_files[i]cid = cids[i]# 檢查當(dāng)前使用的crt文件到期時(shí)間etime = ""etimes = 0if os.path.isfile(crt_file):etime = get_etime(crt_file)etimes = time.mktime(time.strptime(etime, "%b %d %H:%M:%S %Y GMT"))# 到期13天內(nèi)則更新if etimes - time.time() < 86400 * 13:r = rq.get(url + cid, headers=head)zname = r.headers["Content-Disposition"].split("=")[-1]with open(zname, "wb") as f:f.write(r.content)# 解壓并復(fù)制文件fname = unzip(zname)shutil.copyfile(fname + "/" + crt_file_name, crt_file)shutil.copyfile(fname + "/" + crt_key_file_name, crt_key_file)etime = get_etime(crt_file)for j in domains[i]:upload(j, cid, crt_file, crt_key_file)log("%s: 更新成功%s。更新后有效期至%s。" % (ftime(), cid, etime))# 刪除下載的臨時(shí)文件os.remove(zname)shutil.rmtree(fname)else:print("%s: 當(dāng)前證書有效期至%s, 暫未更新。" % (ftime(), etime))# 休眠12小時(shí)time.sleep(3600 * 12)如果有人注冊(cè)來此加密,還煩請(qǐng)您可以填寫我的邀請(qǐng)碼獲取積分:ND8Y17QD
點(diǎn)個(gè)贊再走吧~
總結(jié)
以上是生活随笔為你收集整理的通过Python脚本下载【来此加密的免费HTTPS SSL证书】并自动更新到服务器和阿里云CDN的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 人工智能知识全面讲解:机器学习的过程
- 下一篇: 五天拼出一款提词器软件之一项目立项与准备