Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >[php实现]通过腾讯云Api上传SSL证书

[php实现]通过腾讯云Api上传SSL证书

原创
作者头像
TDP-苏苏
发布于 2022-03-01 08:27:10
发布于 2022-03-01 08:27:10
9.7K00
代码可运行
举报
文章被收录于专栏:上云实践笔记上云实践笔记
运行总次数:0
代码可运行

背景

笔者使用的轻量应用服务器安装的Windows系统(集成环境没有更新证书功能),SSL证书是acme.sh生成的多域名证书,有效期90天。因为使用了腾讯云的CDN,每次生成新证书需要手动上传到腾讯云,太麻烦了。既然官方提供了上传证书的ApiUploadCertificate),服务器是php环境,就想用php撸个小工具,实现自动上传SSL证书到腾讯云。

主要思路

acme.sh(计划任务)更新证书 -> 证书更新成功hook工具网址实现上传

核心代码

执行acme.sh时,额外增加如下参数:(5秒延时可取消,网址换成自己脚本存放位置)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--renew-hook "sleep 5s && curl http://127.0.0.1/Qcloud/ssl_update.php"

简版腾讯云SDK文件:Qcloud.php

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
//腾讯云SDK

class Qcloud {
	private $SecretId;
	private $SecretKey;
	private $endpoint = "scf.tencentcloudapi.com"; //接口请求域名
	private $service = "scf"; //服务名称
	private $version = "2018-04-16"; //API版本号
	private $region = "ap-shanghai"; //地域参数

	/**
	 * SecretId 腾讯云SecretId
	 * SecretKey 腾讯云SecretKey
	*/
	function __construct($SecretId, $SecretKey){
        $this->SecretId = $SecretId;
        $this->SecretKey = $SecretKey;
    }
    
    /**
     * $api 接口请求域名
    */
    public function SetApi($api){
        $this->endpoint = $api;
        $ex = explode('.', $api);
        $this->service = $ex[0];
        //print_r($ex);
    }
    
    /**
     * $api 服务名称
    */
    public function SetService($ser){
        $this->service = $ser;
    }
    
    /**
     * $api API版本号
    */
    public function SetVersion($ver){
        $this->version = $ver;
    }
    
    /**
     * $api 地域参数
    */
    public function SetRegion($reg=null){
        $this->region = $reg;
    }
	
	public function send_reuqest($action, $param){
		$payload = json_encode($param);
		$time = time();
		$authorization = $this->generateSign($payload, $time);
		$header = [
			'Authorization: '.$authorization,
			'Content-Type: application/json; charset=utf-8',
			'X-TC-Action: '.$action,
			'X-TC-Timestamp: '.$time,
			'X-TC-Version: '.$this->version,
			'X-TC-Region: '.$this->region,
		];
		return $this->curl_post($payload, $header);
	}

	private function generateSign($payload, $time){
		$algorithm = "TC3-HMAC-SHA256";

		// step 1: build canonical request string
		$httpRequestMethod = "POST";
		$canonicalUri = "/";
		$canonicalQueryString = "";
		$canonicalHeaders = "content-type:application/json; charset=utf-8\n"."host:".$this->endpoint."\n";
		$signedHeaders = "content-type;host";
		$hashedRequestPayload = hash("SHA256", $payload);
		$canonicalRequest = $httpRequestMethod."\n"
			.$canonicalUri."\n"
			.$canonicalQueryString."\n"
			.$canonicalHeaders."\n"
			.$signedHeaders."\n"
			.$hashedRequestPayload;
		
		// step 2: build string to sign
		$date = gmdate("Y-m-d", $time);
		$credentialScope = $date."/".$this->service."/tc3_request";
		$hashedCanonicalRequest = hash("SHA256", $canonicalRequest);
		$stringToSign = $algorithm."\n"
			.$time."\n"
			.$credentialScope."\n"
			.$hashedCanonicalRequest;
		
		// step 3: sign string
		$secretDate = hash_hmac("SHA256", $date, "TC3".$this->SecretKey, true);
		$secretService = hash_hmac("SHA256", $this->service, $secretDate, true);
		$secretSigning = hash_hmac("SHA256", "tc3_request", $secretService, true);
		$signature = hash_hmac("SHA256", $stringToSign, $secretSigning);

		// step 4: build authorization
		$authorization = $algorithm
			." Credential=".$this->SecretId."/".$credentialScope
			.", SignedHeaders=content-type;host, Signature=".$signature;

		return $authorization;
	}

	private function curl_post($payload, $header){
		$url = 'https://'.$this->endpoint.'/';
		$ch=curl_init($url);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
		curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($ch, CURLOPT_TIMEOUT, 10);
		curl_setopt($ch, CURLOPT_POST, 1);
		curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
		$json=curl_exec($ch);
		$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
		curl_close($ch);
		if($httpCode==200){
			$arr=json_decode($json,true);
			return $arr['Response'];
		}else{
			return false;
		}
	}
}

受访文件:ssl_upload.php

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
include 'Qcloud.php';
$SecretId = 'xxxx';
$SecretKey='xxxxxx';

$param['pbk'] = file_get_contents('证书路径');
$param['pak'] = file_get_contents('私钥路径');

new ssl_upload($param, $SecretId, $SecretKey);

//输出json信息
function msg($msg='ok', $code=200){
	$arr = array(
		'code'=>$code,
		'msg'=>$msg,
	);
	exit(json_encode($arr, JSON_UNESCAPED_UNICODE));
}

//上传ssl证书
class ssl_upload{
	function __construct($opt, $SecretId, $SecretKey){
		$QC = new Qcloud($SecretId, $SecretKey);
		//公共参数
		$api = 'ssl.tencentcloudapi.com';
		$ver = '2019-12-05';
		
		$pbk = $opt['pbk'];
		$pak = isset($opt['pak']) ? $opt['pak']: null;
		$type = isset($opt['type']) ? $opt['type']:'SVR';
		$alias = isset($opt['alias']) ? $opt['alias']:'upload_'.date('Ymd');


		//功能参数
		$action = 'UploadCertificate';          //公共参数 功能
		$param['CertificatePublicKey']=$pbk;    //证书内容
		$param['CertificatePrivateKey']=$pak;   //私钥内容,证书类型为 SVR 时必填,为 CA 时可不填。
		$param['CertificateType']=$type;        //证书类型,默认 SVR。CA = 客户端证书,SVR = 服务器证书。
		$param['Alias']=$alias;                 //备注名称

		$QC->SetApi($api);      //接口请求域名
		$QC->SetVersion($ver);  //API版本号
		$rsp = $QC->send_reuqest($action, $param);

		if(isset($rsp['CertificateId'])){
			//上传成功
			$result = $rsp['CertificateId'];
			msg($result);
		}else if(isset($rsp['Error'])){
			//上传失败
			$code = $rsp['Error']['Code'];
			$msg = $rsp['Error']['Message'];
			msg($msg, $code);
		}else{
			//未知错误
			$msg = $rsp;
			$code = 500;
			msg($msg, $code);
		}
	}
}

后记

其实更新成功后,还可以做一些事情,比如通过Email/短信发送更新成功的信息,甚至可以再写代码,遍历CDN加速的域名,实现自动更换所有网站的ssl证书(主要用到的接口有DescribeDomainsConfigUpdateDomainConfig),可以自行拓展。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
利用API自动更新腾讯dnspod子域名解析记录实现ddns
由于个人网络是动态IP地址,导致每次重启路由器都会更换IP地址,或者是租约到期也会更新IP地址。 更换IP地址后每次都需要重新设置DNSPod,假如设置不及时还可能会影响到个人搭建的某些服务。 所以当时我就在想有没有办法实现定期查询本地IP地址与DNSPod记录IP地址是否相同, 相同则不进行任何操作,不同则自动上报更新IP地址。于是乎有了下面这个利用DNSPod的API实现动态更新IP地址的方法。
铭心
2024/12/20
5780
180行代码实现全球短信发送功能(无SKD依赖)
本文提供的代码不依赖官方SDK,为方便读者理解,文章中提供的代码片段包含详细的注释。完整功能代码见文末,删减冗余注释和空行后不足180行。
若海
2023/08/12
18K1
GitHub Actions + 腾讯云COS + SCF云函数 + 自动刷新CDN 完美自动化部署静态网站
作为强迫症患者,一直对自动化部署非常痴迷,个人认为全自动部署最重要的就是稳定可靠,经过研究测试,最终使用GitHub和腾讯云两大平台,成功完成了全自动部署网站的实践.
用户8851537
2021/07/30
1.6K0
【玩转腾讯云】WordPress配置腾讯云CDN并实现发布/更新文章审核评论自动清理CDN缓存
博客在CDN是加了又下,下了又加。昨天访问张戈博客学习的时候,感叹大牛的站优化的就是好!惊叹速度快之余发现张戈博客的服务器在国外,而且配置也不是很高。(优化出奇迹)
AlexTao
2020/04/22
5.5K3
V3手动鉴权失败之PHP篇
腾讯云 API 全新升级 3.0 ,该版本进行了性能优化且全地域部署、支持就近和按地域接入、访问时延下降显著,接口描述更加详细、错误码描述更加全面、SDK增加接口级注释,让您更加方便快捷的使用腾讯云产品。人脸识别、文字识别,语音识别等众多产品均已接入云API 3.0。
周朋伟
2020/12/25
2.2K0
V3手动鉴权失败之PHP篇
【腾讯云的1001种玩法】WordPress 发布/更新文章、提交/审核评论自动清理腾讯云CDN缓存
张戈
2017/03/17
2.9K0
【腾讯云的1001种玩法】WordPress 发布/更新文章、提交/审核评论自动清理腾讯云CDN缓存
腾讯云ASR产品-PHP实现录音文件识别极速版鉴权请求
(2)腾讯云控制台开通实时语音权限 https://console.cloud.tencent.com/asr
HI hero
2021/10/11
6.5K14
cos-临时密钥生成(附php脚本)
https://cloud.tencent.com/document/product/436/14048
杜志强
2019/03/07
3.6K3
cos-临时密钥生成(附php脚本)
[腾讯云] PHP实现无SDK依赖的EdgeOne缓存刷新
看最近EdgeOne活动力度很大,忍不住买了一年,准备把博客从CDN换成EdgeOne。
kr
2023/09/28
1.1K0
智能识别,一键兑换:腾讯云OCR智能结构化高级版识别在零售行业的应用实践
https://cloud.tencent.com/developer/article/2323707
快乐的小白
2025/01/12
2290
智能识别,一键兑换:腾讯云OCR智能结构化高级版识别在零售行业的应用实践
【玩转腾讯云】GitHub Actions + 腾讯云COS + SCF云函数刷新CDN 自动化部署静态网站
作为强迫症患者,一直对自动化部署非常痴迷,个人认为全自动部署最重要的就是稳定可靠,经过研究测试,最终使用GitHub和腾讯云两大平台,成功完成了全自动部署网站的实践.
Stille
2020/04/21
6.1K3
【玩转腾讯云】GitHub Actions + 腾讯云COS + SCF云函数刷新CDN 自动化部署静态网站
简化车辆登记流程:利用腾讯云OCR实现自动化信息识别
项目中有一块,需要用到上传车牌车牌号到系统里,用了下腾讯云的ocr车牌号识别做了个小功能。通过腾讯云的orc识别,将车牌号录入到后台。
快乐的小白
2023/09/05
4980
简化车辆登记流程:利用腾讯云OCR实现自动化信息识别
腾讯云服务视频,腾讯云点播的视频上传和转码功能
有些用户烦恼腾讯云储存上传大文件的各种不方便,比如不能转码(要转码得先把mp4文件从云存储上下载下来,然后通过服务器执行ffmpeg操作,最后再把切割的ts文件上传到腾讯云,过程复杂且容易出错),不能获取实时的上传进度等等,所以就发现腾讯云点播这项技术。相对来说通过腾讯云点播既能实现上传进度的获取,而且还能上传完成后自动转码,比如自动把mp4转换为m3u8格式的清单文件来进行分片加载,这样子既能大大加快加载速度,还能保护视频链接的url,所以就记录一下这种技术的使用原理。
tengxunyun8点com活动整理
2019/04/30
16.2K0
腾讯云服务视频,腾讯云点播的视频上传和转码功能
纯shell实现腾讯云APIv3签名及访问
腾讯云 API 会对每个请求进行身份验证,用户需要使用安全凭证,经过特定的步骤对请求进行签名(Signature),每个请求都需要在公共参数中指定该签名结果并以指定的方式和格式发送请求。
若海
2023/09/10
7.3K1
PHP实现微信提现V3版本2022-5更新接口:商家转账到零钱
一:开通条件:需满足入驻满90天,连续正常交易30天,保持正常健康交易。 二:分为页面发起和api接口操作,均需要手动开启才可。 三:需要设置IP白名单,否则不能发起接口调用。 四:商家转账的户口为商户平台的运营账户,非商户基本账户,注意保证运营账户的余额充足! 五:注意提现额度的变化,超过设置的免密额度,该笔提现会自动发送给超级管理员审核,输入密码确定此笔提现操作。
郑洪志
2023/03/05
1.5K0
PHP实现微信提现V3版本2022-5更新接口:商家转账到零钱
Python 和 PHP 对腾讯云签名 hmac_sha256 算法实现
开宗明义,米扑科技在使用腾讯云的API接口签名中,按照官方示例开发PHP、Python的接口,经常会提示签名错误
阳光岛主
2019/02/18
2.6K0
钉钉扫码登录-PHP版本
今天写了一个第三方登录的功能,使用的是钉钉,实现的功能就是打开网页,使用的钉钉APP扫描二维码,快捷登录网站,下面一起来看一下!
申霖
2020/04/10
2.5K0
钉钉扫码登录-PHP版本
【有奖征文】用"云API"和PHP写一个查找域名是否可注册的API
在批量查询时,可以直接通过Python调用,比起官网的批量查询要灵活得多(官网的还要先用Python生成列表再复制,而且一次查太多网页还容易出问题)。
kr
2022/09/06
8.3K1
【有奖征文】用"云API"和PHP写一个查找域名是否可注册的API
基于(PHP)人脸核身微信H5页面(普通模式)搭建
(2)腾讯云控制台开通人脸核身权限 https://console.cloud.tencent.com/faceid/access
HI hero
2020/11/23
3.4K0
环信-(php)服务器端REST API
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/112332.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/08
1.4K0
推荐阅读
相关推荐
利用API自动更新腾讯dnspod子域名解析记录实现ddns
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验