diff --git a/packages/core/pipeline/src/plugin/api.ts b/packages/core/pipeline/src/plugin/api.ts index ba3dfc89..f6184dd9 100644 --- a/packages/core/pipeline/src/plugin/api.ts +++ b/packages/core/pipeline/src/plugin/api.ts @@ -227,6 +227,14 @@ export abstract class AbstractTaskPlugin implements ITaskPlugin { return name + "_" + dayjs().format("YYYYMMDDHHmmssSSS"); } + buildCertName(domain: string) { + if (domain.includes("*")) { + domain = domain.replaceAll("*", "_"); + } + return `${domain}_${dayjs().format("YYYYMMDDHHmmssSSS")}`; + } + + async onRequest(req: PluginRequestHandleReq) { if (!req.action) { throw new Error("action is required"); diff --git a/packages/plugins/plugin-cert/src/plugin/cert-plugin/cert-reader.ts b/packages/plugins/plugin-cert/src/plugin/cert-plugin/cert-reader.ts index 08df4d9d..1c331d8b 100644 --- a/packages/plugins/plugin-cert/src/plugin/cert-plugin/cert-reader.ts +++ b/packages/plugins/plugin-cert/src/plugin/cert-plugin/cert-reader.ts @@ -93,6 +93,16 @@ export class CertReader { return domains; } + static getMainDomain(crt: string) { + const { detail } = CertReader.readCertDetail(crt); + return detail.domains.commonName; + } + + getMainDomain() { + const { detail } = this.getCrtDetail(); + return detail.domains.commonName; + } + saveToFile(type: "crt" | "key" | "pfx" | "der" | "oc" | "one" | "ic" | "jks", filepath?: string) { if (!this.cert[type]) { return; diff --git a/packages/plugins/plugin-lib/package.json b/packages/plugins/plugin-lib/package.json index 40fcd1b0..5379c0be 100644 --- a/packages/plugins/plugin-lib/package.json +++ b/packages/plugins/plugin-lib/package.json @@ -16,7 +16,9 @@ "pub": "npm publish" }, "dependencies": { + "@alicloud/openapi-client": "^0.4.14", "@alicloud/pop-core": "^1.7.10", + "@alicloud/tea-util": "^1.4.10", "@aws-sdk/client-s3": "^3.787.0", "@certd/basic": "^1.34.5", "@certd/pipeline": "^1.34.5", diff --git a/packages/plugins/plugin-lib/src/aliyun/access/aliyun-access.ts b/packages/plugins/plugin-lib/src/aliyun/access/aliyun-access.ts index 5d05a3d6..6a20ab92 100644 --- a/packages/plugins/plugin-lib/src/aliyun/access/aliyun-access.ts +++ b/packages/plugins/plugin-lib/src/aliyun/access/aliyun-access.ts @@ -1,4 +1,88 @@ import { IsAccess, AccessInput, BaseAccess } from "@certd/pipeline"; +import { ILogger } from "@certd/basic"; + +export type AliyunClientV2Req = { + action: string; + version: string; + protocol?: "HTTPS"; + // 接口 HTTP 方法 + method?: "GET" | "POST"; + authType?: "AK"; + style?: "RPC"; + // 接口 PATH + pathname?: `/`; + + data?: any; + query?: any; +}; +export class AliyunClientV2 { + access: AliyunAccess; + logger: ILogger; + endpoint: string; + + client: any; + constructor(opts: { access: AliyunAccess; logger: ILogger; endpoint: string }) { + this.access = opts.access; + this.logger = opts.logger; + this.endpoint = opts.endpoint; + } + + async getClient() { + if (this.client) { + return this.client; + } + const $OpenApi = await import("@alicloud/openapi-client"); + const config = new $OpenApi.Config({ + accessKeyId: this.access.accessKeyId, + accessKeySecret: this.access.accessKeySecret, + }); + // Endpoint 请参考 https://api.aliyun.com/product/FC + // config.endpoint = `esa.${this.regionId}.aliyuncs.com`; + config.endpoint = this.endpoint; + //@ts-ignore + this.client = new $OpenApi.default.default(config); + return this.client; + } + + async doRequest(req: AliyunClientV2Req) { + const client = await this.getClient(); + + const $OpenApi = await import("@alicloud/openapi-client"); + const $Util = await import("@alicloud/tea-util"); + + const params = new $OpenApi.Params({ + // 接口名称 + action: req.action, + // 接口版本 + version: req.version, + // 接口协议 + protocol: "HTTPS", + // 接口 HTTP 方法 + method: req.method ?? "POST", + authType: "AK", + style: "RPC", + // 接口 PATH + pathname: `/`, + // 接口请求体内容格式 + reqBodyType: "json", + // 接口响应体内容格式 + bodyType: "json", + }); + + const runtime = new $Util.RuntimeOptions({}); + const request = new $OpenApi.OpenApiRequest({ + body: req.data, + query: req.query, + }); + // 复制代码运行请自行打印 API 的返回值 + // 返回值实际为 Map 类型,可从 Map 中获得三类数据:响应体 body、响应头 headers、HTTP 返回的状态码 statusCode。 + const res = await client.callApi(params, request, runtime); + /** + * res?.body?. + */ + return res?.body; + } +} @IsAccess({ name: "aliyun", @@ -27,6 +111,14 @@ export class AliyunAccess extends BaseAccess { helper: "注意:证书申请需要dns解析权限;其他阿里云插件,需要对应的权限,比如证书上传需要证书管理权限;嫌麻烦就用主账号的全量权限的accessKey", }) accessKeySecret = ""; + + getClient(endpoint: string) { + return new AliyunClientV2({ + access: this, + logger: this.ctx.logger, + endpoint: endpoint, + }); + } } new AliyunAccess(); diff --git a/packages/ui/certd-server/src/modules/sys/settings/safe-service.ts b/packages/ui/certd-server/src/modules/sys/settings/safe-service.ts index 46fbbc2a..f04ff7b5 100644 --- a/packages/ui/certd-server/src/modules/sys/settings/safe-service.ts +++ b/packages/ui/certd-server/src/modules/sys/settings/safe-service.ts @@ -57,15 +57,12 @@ export class SafeService { async reloadHiddenStatus(immediate = false) { const hidden = await this.getHiddenSetting() if (hidden.enabled) { - logger.error("启动站点隐藏"); - hiddenStatus.isHidden = false - if (immediate) { - hiddenStatus.isHidden = true; - } + logger.info("启动站点隐藏"); + hiddenStatus.isHidden = immediate; const autoHiddenTimes = hidden.autoHiddenTimes || 5; hiddenStatus.startCheck(autoHiddenTimes); } else { - logger.error("关闭站点隐藏"); + logger.info("当前站点隐藏已关闭"); hiddenStatus.isHidden = false; hiddenStatus.stopCheck() } diff --git a/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-alb/index.ts b/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-alb/index.ts index 40d5cc50..2e1cc40b 100644 --- a/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-alb/index.ts +++ b/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-alb/index.ts @@ -1,5 +1,5 @@ import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from '@certd/pipeline'; -import { CertInfo ,CertApplyPluginNames} from '@certd/plugin-cert'; +import { CertInfo ,CertApplyPluginNames, CertReader} from '@certd/plugin-cert'; import { AliyunAccess, AliyunClient, AliyunSslClient, createCertDomainGetterInputDefine, createRemoteSelectInputDefine } from '@certd/plugin-lib'; @IsTaskPlugin({ @@ -143,8 +143,9 @@ export class AliyunDeployCertToALB extends AbstractTaskPlugin { endpoint: this.casEndpoint, }); + const certName = this.buildCertName(CertReader.getMainDomain(this.cert.crt)) certId = await sslClient.uploadCert({ - name: this.appendTimeSuffix('certd'), + name: certName, cert: this.cert, }); } diff --git a/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-cdn/index.ts b/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-cdn/index.ts index 65e29876..154bc0c2 100644 --- a/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-cdn/index.ts +++ b/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-cdn/index.ts @@ -1,7 +1,7 @@ import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from '@certd/pipeline'; import { AliyunAccess, AliyunClient, AliyunSslClient, createCertDomainGetterInputDefine, createRemoteSelectInputDefine } from '@certd/plugin-lib'; import { optionsUtils } from '@certd/basic/dist/utils/util.options.js'; -import { CertApplyPluginNames} from '@certd/plugin-cert'; +import { CertApplyPluginNames, CertReader } from "@certd/plugin-cert"; @IsTaskPlugin({ name: 'DeployCertToAliyunCDN', title: '阿里云-部署证书至CDN', @@ -107,9 +107,11 @@ export class DeployCertToAliyunCDN extends AbstractTaskPlugin { let certId: any = this.cert; - const certName = this.appendTimeSuffix(this.certName); + let certName = this.appendTimeSuffix(this.certName); if (typeof this.cert === 'object') { + // @ts-ignore + const certName = this.buildCertName(CertReader.getMainDomain(this.cert.crt)) certId = await sslClient.uploadCert({ name:certName, cert: this.cert, diff --git a/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-esa/index.ts b/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-esa/index.ts new file mode 100644 index 00000000..44793eaf --- /dev/null +++ b/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-esa/index.ts @@ -0,0 +1,226 @@ +import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from "@certd/pipeline"; +import { CertApplyPluginNames, CertInfo, CertReader } from "@certd/plugin-cert"; +import { + AliyunAccess, AliyunClientV2, + AliyunSslClient, + createCertDomainGetterInputDefine, + createRemoteSelectInputDefine +} from "@certd/plugin-lib"; + +@IsTaskPlugin({ + name: "AliyunDeployCertToESA", + title: "阿里云-部署至ESA", + icon: "svg:icon-aliyun", + group: pluginGroups.aliyun.key, + desc: "部署证书到阿里云ESA(边缘安全加速)", + needPlus: false, + default: { + strategy: { + runStrategy: RunStrategy.SkipWhenSucceed + } + } +}) +export class AliyunDeployCertToESA extends AbstractTaskPlugin { + @TaskInput({ + title: "域名证书", + helper: "请选择证书申请任务输出的域名证书", + component: { + name: "output-selector", + from: [...CertApplyPluginNames] + }, + required: true + }) + cert!: CertInfo; + + @TaskInput(createCertDomainGetterInputDefine({ props: { required: false } })) + certDomains!: string[]; + + @TaskInput({ + title: "大区", + value: "cn-hangzhou", + component: { + name: "a-auto-complete", + vModel: "value", + options: [ + { value: "cn-hangzhou", label: "华东1(杭州)" }, + { value: "ap-southeast-1", label: "新加坡" } + ] + }, + required: true + }) + regionId!: string; + + @TaskInput({ + title: "证书接入点", + helper: "不会选就保持默认即可", + value: "cas.aliyuncs.com", + component: { + name: "a-select", + options: [ + { value: "cas.aliyuncs.com", label: "中国大陆" }, + { value: "cas.ap-southeast-1.aliyuncs.com", label: "新加坡" }, + { value: "cas.eu-central-1.aliyuncs.com", label: "德国(法兰克福)" } + ] + }, + required: true + }) + casEndpoint!: string; + + + @TaskInput({ + title: "Access授权", + helper: "阿里云授权AccessKeyId、AccessKeySecret", + component: { + name: "access-selector", + type: "aliyun" + }, + required: true + }) + accessId!: string; + + @TaskInput( + createRemoteSelectInputDefine({ + title: "站点", + helper: "请选择要部署证书的站点", + action: AliyunDeployCertToESA.prototype.onGetSiteList.name, + watches: ["accessId", "regionId"] + }) + ) + siteIds!: string[]; + + + async onInstance() { + } + + async getAliyunCertId(access: AliyunAccess) { + let certId: any = this.cert; + let certName: any = this.appendTimeSuffix("certd"); + if (typeof this.cert === "object") { + const sslClient = new AliyunSslClient({ + access, + logger: this.logger, + endpoint: this.casEndpoint + }); + + certName = this.buildCertName(CertReader.getMainDomain(this.cert.crt)); + + certId = await sslClient.uploadCert({ + name: certName, + cert: this.cert + }); + this.logger.info("上传证书成功", certId, certName); + } + return { + certId, + certName + }; + } + + async execute(): Promise { + this.logger.info("开始部署证书到阿里云"); + const access = await this.getAccess(this.accessId); + + const client = await this.getClient(access); + + const { certId, certName } = await this.getAliyunCertId(access); + + for (const siteId of this.siteIds) { + try { + const res = await client.doRequest({ + // 接口名称 + action: "SetCertificate", + // 接口版本 + version: "2024-09-10", + data: { + SiteId: siteId, + CasId: certId, + Type: "cas", + Name: certName + } + }); + this.logger.info(`部署站点[${siteId}]证书成功:${JSON.stringify(res)}`); + + } catch (e) { + if (e.message.includes("Certificate.Duplicated")) { + this.logger.info(`站点[${siteId}]证书已存在,无需重复部署`); + }else{ + throw e; + } + } + + try{ + await this.clearSiteCert(client,siteId); + }catch (e) { + this.logger.error("清理站点[${siteId}]证书失败",e) + } + + } + } + + async getClient(access: AliyunAccess) { + const endpoint = `esa.${this.regionId}.aliyuncs.com`; + return access.getClient(endpoint); + } + + async onGetSiteList(data: any) { + if (!this.accessId) { + throw new Error("请选择Access授权"); + } + const access = await this.getAccess(this.accessId); + + const client = await this.getClient(access); + const res = await client.doRequest({ + action: "ListSites", + version: "2024-09-10", + method: "GET", + data: {} + }); + + const list = res?.Sites; + if (!list || list.length === 0) { + throw new Error("没有找到站点,请先创建站点"); + } + + const options = list.map((item: any) => { + return { + label: item.SiteName, + value: item.SiteId, + domain: item.SiteName + }; + }); + return this.ctx.utils.options.buildGroupOptions(options, this.certDomains); + } + + async clearSiteCert(client: AliyunClientV2, siteId: string) { + this.logger.info(`开始清理站点[${siteId}]过期证书`); + const certListRes = await client.doRequest({ + action: "ListCertificates", + version: "2024-09-10", + method: "GET", + query: { + SiteId: siteId + } + }); + + const list = certListRes.Result; + for (const item of list) { + this.logger.info(`证书${item.Name}状态:${item.Status}`); + if (item.Status === "Expired") { + this.logger.info(`证书${item.Name}已过期,执行删除`); + await client.doRequest({ + action: "DeleteCertificate", + version: "2024-09-10", + // 接口 HTTP 方法 + method: "GET", + query: { + SiteId: siteId, + Id: item.id + } + }); + this.logger.info(`证书${item.Name}已删除`); + } + } + } +} + +new AliyunDeployCertToESA(); diff --git a/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-fc/index.ts b/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-fc/index.ts index 7fdaa829..15cf6f4d 100644 --- a/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-fc/index.ts +++ b/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-fc/index.ts @@ -1,5 +1,5 @@ import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from "@certd/pipeline"; -import { CertApplyPluginNames, CertInfo } from "@certd/plugin-cert"; +import { CertApplyPluginNames, CertInfo, CertReader } from "@certd/plugin-cert"; import { AliyunAccess, createCertDomainGetterInputDefine, createRemoteSelectInputDefine } from "@certd/plugin-lib"; @IsTaskPlugin({ @@ -141,9 +141,11 @@ export class AliyunDeployCertToFC extends AbstractTaskPlugin { bodyType: 'json', }); // body params + const certName = this.buildCertName(CertReader.getMainDomain(this.cert.crt)) + const body: { [key: string]: any } = { certConfig: { - certName: this.appendTimeSuffix('certd_fc'), + certName: certName, certificate: this.cert.crt, privateKey: this.cert.key, }, diff --git a/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-nlb/index.ts b/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-nlb/index.ts index b8c46471..e61ca3b0 100644 --- a/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-nlb/index.ts +++ b/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-nlb/index.ts @@ -1,5 +1,5 @@ import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from '@certd/pipeline'; -import { CertInfo } from '@certd/plugin-cert'; +import { CertInfo, CertReader } from "@certd/plugin-cert"; import { AliyunAccess, AliyunClient, AliyunSslClient, createCertDomainGetterInputDefine, createRemoteSelectInputDefine } from '@certd/plugin-lib'; import { CertApplyPluginNames} from '@certd/plugin-cert'; @IsTaskPlugin({ @@ -139,8 +139,10 @@ export class AliyunDeployCertToNLB extends AbstractTaskPlugin { endpoint: this.casEndpoint, }); + const certName = this.buildCertName(CertReader.getMainDomain(this.cert.crt)) + certId = await sslClient.uploadCert({ - name: this.appendTimeSuffix('certd'), + name: certName, cert: this.cert, }); } diff --git a/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-waf/index.ts b/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-waf/index.ts index 108c975c..6ff58c3c 100644 --- a/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-waf/index.ts +++ b/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/deploy-to-waf/index.ts @@ -1,5 +1,5 @@ import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from "@certd/pipeline"; -import { CertApplyPluginNames, CertInfo } from "@certd/plugin-cert"; +import { CertApplyPluginNames, CertInfo, CertReader } from "@certd/plugin-cert"; import { AliyunAccess, AliyunClient, @@ -124,7 +124,7 @@ export class AliyunDeployCertToWaf extends AbstractTaskPlugin { }); certId = await sslClient.uploadCert({ - name: this.appendTimeSuffix('certd'), + name: this.buildCertName(CertReader.getMainDomain(this.cert.crt)), cert: this.cert, }); } diff --git a/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/upload-to-aliyun/index.ts b/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/upload-to-aliyun/index.ts index 89305e5e..1d4e1a32 100644 --- a/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/upload-to-aliyun/index.ts +++ b/packages/ui/certd-server/src/plugins/plugin-aliyun/plugin/upload-to-aliyun/index.ts @@ -1,7 +1,7 @@ import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput, TaskOutput } from '@certd/pipeline'; import { AliyunAccess } from '@certd/plugin-lib'; import { AliyunSslClient } from '@certd/plugin-lib'; -import { CertApplyPluginNames} from '@certd/plugin-cert'; +import { CertApplyPluginNames, CertReader } from "@certd/plugin-cert"; /** * 华东1(杭州) cn-hangzhou cas.aliyuncs.com cas-vpc.cn-hangzhou.aliyuncs.com * 马来西亚(吉隆坡) ap-southeast-3 cas.ap-southeast-3.aliyuncs.com cas-vpc.ap-southeast-3.aliyuncs.com @@ -97,8 +97,9 @@ export class UploadCertToAliyun extends AbstractTaskPlugin { logger: this.logger, endpoint, }); + const certName = this.buildCertName(CertReader.getMainDomain(this.cert.crt)) this.aliyunCertId = await client.uploadCert({ - name: this.appendTimeSuffix('certd'), + name: certName, cert: this.cert, }); } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1d116183..0b9fd1e7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -46,7 +46,7 @@ importers: packages/core/acme-client: dependencies: '@certd/basic': - specifier: ^1.34.4 + specifier: ^1.34.5 version: link:../basic '@peculiar/x509': specifier: ^1.11.0 @@ -207,10 +207,10 @@ importers: packages/core/pipeline: dependencies: '@certd/basic': - specifier: ^1.34.4 + specifier: ^1.34.5 version: link:../basic '@certd/plus-core': - specifier: ^1.34.4 + specifier: ^1.34.5 version: link:../../pro/plus-core dayjs: specifier: ^1.11.7 @@ -415,7 +415,7 @@ importers: packages/libs/lib-k8s: dependencies: '@certd/basic': - specifier: ^1.34.4 + specifier: ^1.34.5 version: link:../../core/basic '@kubernetes/client-node': specifier: 0.21.0 @@ -455,16 +455,16 @@ importers: packages/libs/lib-server: dependencies: '@certd/acme-client': - specifier: ^1.34.4 + specifier: ^1.34.5 version: link:../../core/acme-client '@certd/basic': - specifier: ^1.34.4 + specifier: ^1.34.5 version: link:../../core/basic '@certd/pipeline': - specifier: ^1.34.4 + specifier: ^1.34.5 version: link:../../core/pipeline '@certd/plus-core': - specifier: ^1.34.4 + specifier: ^1.34.5 version: link:../../pro/plus-core '@midwayjs/cache': specifier: ~3.14.0 @@ -607,16 +607,16 @@ importers: packages/plugins/plugin-cert: dependencies: '@certd/acme-client': - specifier: ^1.34.4 + specifier: ^1.34.5 version: link:../../core/acme-client '@certd/basic': - specifier: ^1.34.4 + specifier: ^1.34.5 version: link:../../core/basic '@certd/pipeline': - specifier: ^1.34.4 + specifier: ^1.34.5 version: link:../../core/pipeline '@certd/plugin-lib': - specifier: ^1.34.4 + specifier: ^1.34.5 version: link:../plugin-lib '@google-cloud/publicca': specifier: ^1.3.0 @@ -682,17 +682,23 @@ importers: packages/plugins/plugin-lib: dependencies: + '@alicloud/openapi-client': + specifier: ^0.4.14 + version: 0.4.14 '@alicloud/pop-core': specifier: ^1.7.10 version: 1.8.0 + '@alicloud/tea-util': + specifier: ^1.4.10 + version: 1.4.10 '@aws-sdk/client-s3': specifier: ^3.787.0 version: 3.810.0(aws-crt@1.26.2) '@certd/basic': - specifier: ^1.34.4 + specifier: ^1.34.5 version: link:../../core/basic '@certd/pipeline': - specifier: ^1.34.4 + specifier: ^1.34.5 version: link:../../core/pipeline '@kubernetes/client-node': specifier: 0.21.0 @@ -780,19 +786,19 @@ importers: packages/pro/commercial-core: dependencies: '@certd/basic': - specifier: ^1.34.4 + specifier: ^1.34.5 version: link:../../core/basic '@certd/lib-server': - specifier: ^1.34.4 + specifier: ^1.34.5 version: link:../../libs/lib-server '@certd/pipeline': - specifier: ^1.34.4 + specifier: ^1.34.5 version: link:../../core/pipeline '@certd/plugin-plus': - specifier: ^1.34.4 + specifier: ^1.34.5 version: link:../plugin-plus '@certd/plus-core': - specifier: ^1.34.4 + specifier: ^1.34.5 version: link:../plus-core '@midwayjs/core': specifier: ~3.20.3 @@ -877,22 +883,22 @@ importers: specifier: ^1.0.2 version: 1.0.3 '@certd/basic': - specifier: ^1.34.4 + specifier: ^1.34.5 version: link:../../core/basic '@certd/lib-k8s': - specifier: ^1.34.4 + specifier: ^1.34.5 version: link:../../libs/lib-k8s '@certd/pipeline': - specifier: ^1.34.4 + specifier: ^1.34.5 version: link:../../core/pipeline '@certd/plugin-cert': - specifier: ^1.34.4 + specifier: ^1.34.5 version: link:../../plugins/plugin-cert '@certd/plugin-lib': - specifier: ^1.34.4 + specifier: ^1.34.5 version: link:../../plugins/plugin-lib '@certd/plus-core': - specifier: ^1.34.4 + specifier: ^1.34.5 version: link:../plus-core ali-oss: specifier: ^6.21.0 @@ -995,7 +1001,7 @@ importers: packages/pro/plus-core: dependencies: '@certd/basic': - specifier: ^1.34.4 + specifier: ^1.34.5 version: link:../../core/basic dayjs: specifier: ^1.11.7 @@ -1285,10 +1291,10 @@ importers: version: 0.1.3(zod@3.24.4) devDependencies: '@certd/lib-iframe': - specifier: ^1.34.4 + specifier: ^1.34.5 version: link:../../libs/lib-iframe '@certd/pipeline': - specifier: ^1.34.4 + specifier: ^1.34.5 version: link:../../core/pipeline '@rollup/plugin-commonjs': specifier: ^25.0.7 @@ -1468,43 +1474,43 @@ importers: specifier: ^3.705.0 version: 3.810.0(aws-crt@1.26.2) '@certd/acme-client': - specifier: ^1.34.4 + specifier: ^1.34.5 version: link:../../core/acme-client '@certd/basic': - specifier: ^1.34.4 + specifier: ^1.34.5 version: link:../../core/basic '@certd/commercial-core': - specifier: ^1.34.4 + specifier: ^1.34.5 version: link:../../pro/commercial-core '@certd/jdcloud': - specifier: ^1.34.4 + specifier: ^1.34.5 version: link:../../libs/lib-jdcloud '@certd/lib-huawei': - specifier: ^1.34.4 + specifier: ^1.34.5 version: link:../../libs/lib-huawei '@certd/lib-k8s': - specifier: ^1.34.4 + specifier: ^1.34.5 version: link:../../libs/lib-k8s '@certd/lib-server': - specifier: ^1.34.4 + specifier: ^1.34.5 version: link:../../libs/lib-server '@certd/midway-flyway-js': - specifier: ^1.34.4 + specifier: ^1.34.5 version: link:../../libs/midway-flyway-js '@certd/pipeline': - specifier: ^1.34.4 + specifier: ^1.34.5 version: link:../../core/pipeline '@certd/plugin-cert': - specifier: ^1.34.4 + specifier: ^1.34.5 version: link:../../plugins/plugin-cert '@certd/plugin-lib': - specifier: ^1.34.4 + specifier: ^1.34.5 version: link:../../plugins/plugin-lib '@certd/plugin-plus': - specifier: ^1.34.4 + specifier: ^1.34.5 version: link:../../pro/plugin-plus '@certd/plus-core': - specifier: ^1.34.4 + specifier: ^1.34.5 version: link:../../pro/plus-core '@corsinvest/cv4pve-api-javascript': specifier: ^8.3.0 @@ -15652,7 +15658,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 18.19.100 + '@types/node': 20.17.47 '@types/yargs': 17.0.33 chalk: 4.1.2 @@ -17108,7 +17114,7 @@ snapshots: '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 - '@types/node': 18.19.100 + '@types/node': 20.17.47 '@types/cache-manager@4.0.6': {} @@ -17122,7 +17128,7 @@ snapshots: '@types/connect@3.4.38': dependencies: - '@types/node': 18.19.100 + '@types/node': 20.17.47 '@types/content-disposition@0.5.8': {} @@ -17146,7 +17152,7 @@ snapshots: '@types/express-serve-static-core@5.0.6': dependencies: - '@types/node': 18.19.100 + '@types/node': 20.17.47 '@types/qs': 6.9.18 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -17159,7 +17165,7 @@ snapshots: '@types/got@9.6.12': dependencies: - '@types/node': 18.19.100 + '@types/node': 20.17.47 '@types/tough-cookie': 4.0.5 form-data: 2.5.3 @@ -17198,7 +17204,7 @@ snapshots: '@types/keyv@3.1.4': dependencies: - '@types/node': 18.19.100 + '@types/node': 20.17.47 '@types/koa-compose@3.2.8': dependencies: @@ -17293,19 +17299,19 @@ snapshots: '@types/responselike@1.0.3': dependencies: - '@types/node': 18.19.100 + '@types/node': 20.17.47 '@types/semver@7.7.0': {} '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 18.19.100 + '@types/node': 20.17.47 '@types/serve-static@1.15.7': dependencies: '@types/http-errors': 2.0.4 - '@types/node': 18.19.100 + '@types/node': 20.17.47 '@types/send': 0.17.4 '@types/ssh2@1.15.5': @@ -17337,7 +17343,7 @@ snapshots: '@types/ws@6.0.4': dependencies: - '@types/node': 18.19.100 + '@types/node': 20.17.47 '@types/ws@8.18.1': dependencies: @@ -17345,7 +17351,7 @@ snapshots: '@types/xml2js@0.4.14': dependencies: - '@types/node': 18.19.100 + '@types/node': 20.17.47 '@types/yargs-parser@21.0.3': {} @@ -22357,7 +22363,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 18.19.100 + '@types/node': 20.17.47 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11