通过Python脚本下载【来此加密的免费HTTPS SSL证书】并自动更新到服务器和阿里云CDN
異想之旅:本人原創博客完全手敲,絕對非搬運,全網不可能有重復;本人無團隊,僅為技術愛好者進行分享,所有內容不牽扯廣告。本人所有文章僅在CSDN、掘金和個人博客(一定是異想之旅域名)發布,除此之外全部是盜文!
本文適用對象:要求證書更新后自動化部署(除了IIS之外的服務器軟件)、能接受一定成本(19元)的個人開發者
去年3月網站使用SSL證書先是使用的騰訊云免費證書。這個證書雖然有一年的有效期,但是免費版只支持單域名,對我這樣做了許多小微服務站點的開發者就很不友好了。于是我在知乎上找到了來此加密(https://letsencrypt.osfipin.com/)。
這是一個基于Let’s Encrypt項目的封裝,選擇它主要是由于它簡單、一勞永逸的驗證方式和API的支持,方便我們部署到自己的服務器。
如果你的需求是上傳到阿里云等云服務商的SSL證書管理,不需要本地部署,可以考慮OHTTPS(https://ohttps.com/),操作更加方便,成本接近。
我們首先注冊賬號,然后點擊左上角的三條橫杠,獲取積分,充值一定金額保證賬戶余額達到200積分,再點擊積分兌換兌換VIP。緊接著去申請證書,如果你已經可以使用自動驗證那么最好,沒有的話也沒關系,先稍微麻煩一下配幾次DNS驗證,申請完后可以更改為自動驗證。
關于自動重申:如果你有錢去自動重申自然是更好的(也不貴,更新一次一塊錢),但是本文接下來的方法如果僅使用自動驗證也是可以的,只是需要你每次更新時上網站來點兩下按鈕罷了。
按照上述操作后應該會看到這樣子的界面:
我們先手動部署一次證書,然后再記住給出的自動驗證ID,接著就可以上代碼了!
代碼很簡單,且相比官方給出的腳本可擴展性更強、同時兼容Linux和Windows。需要改的都在開頭,該講到的在注釋說明了。
每次過期前13天起,程序會每12小時拉取一次證書,直到證書有效期變長(也就是已經在官網重新申請了的)。
API KEY獲取:點擊來此加密網頁左上角三個杠,API接口,創建一個KEY
##### User Info #####email = "mail@yixiangzhilv.com" # 來此加密注冊郵箱 key = "APIKEY" # 你的API KEY cids = ["29dwnz"] # 每個需要更新證書的自動驗證ID crt_files = ["E:/Desktop/fullchain.crt"] # 需要更新的證書文件的本地路徑(順序對應cid) crt_key_files = ["E:/Desktop/private.pem"] # 證書密鑰文件(順序對應cid) reload_shell = ["nginx -s reload"] # 更新證書后需執行的命令##### End User Info #####import os import shutil import time import requests as rq import zipfile# 構建API請求參數 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():# 獲取格式化的時間顯示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]# 檢查當前使用的crt文件到期時間(etime為GMT格式,etimes為時間戳)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天內則更新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))# 重啟服務,并刪除下載的臨時文件for j in reload_shell:os.system(j)os.remove(zname)shutil.rmtree(fname)else:print("%s: 當前證書有效期至%s, 暫未更新。" % (ftime(), etime))# 休眠12小時time.sleep(3600 * 12)使用 nohup 或者 screen 掛起腳本運行,即可在每季度僅僅動一下手指的情況下更新證書了!
另外,本人有更新至阿里云CDN的需求,因此也為這個寫了一個類似的腳本。騰訊云等可以略改一點后使用
##### User Info ###### 下方所有列表配置內容的順序均遵循cids的配置### 來此加密用戶信息 ### email = "" key = "" cids = ["29dwnz", "6d4de1"]### 本地服務器信息(證書和密鑰存儲位置) 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"]] # 每個證書所對應的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獲取結果。房間路徑建議自定義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():# 獲取格式化的時間顯示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]# 檢查當前使用的crt文件到期時間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天內則更新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)# 解壓并復制文件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))# 刪除下載的臨時文件os.remove(zname)shutil.rmtree(fname)else:print("%s: 當前證書有效期至%s, 暫未更新。" % (ftime(), etime))# 休眠12小時time.sleep(3600 * 12)如果有人注冊來此加密,還煩請您可以填寫我的邀請碼獲取積分:ND8Y17QD
點個贊再走吧~
總結
以上是生活随笔為你收集整理的通过Python脚本下载【来此加密的免费HTTPS SSL证书】并自动更新到服务器和阿里云CDN的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 人工智能知识全面讲解:机器学习的过程
- 下一篇: websocket python爬虫_p