fix: 修复新版本上传到阿里云cas后,其他依赖任务无法部署的bug

This commit is contained in:
xiaojunnuo
2026-02-09 14:29:19 +08:00
parent 9ac33f9b9b
commit 99f5b8ebc1
13 changed files with 206 additions and 167 deletions
@@ -5,7 +5,7 @@ import {
createRemoteSelectInputDefine createRemoteSelectInputDefine
} from "@certd/plugin-lib"; } from "@certd/plugin-lib";
import { AliyunAccess } from "../../../plugin-lib/aliyun/access/index.js"; import { AliyunAccess } from "../../../plugin-lib/aliyun/access/index.js";
import { AliyunClient, AliyunSslClient } from "../../../plugin-lib/aliyun/lib/index.js"; import { AliyunClient, AliyunSslClient, CasCertId } from "../../../plugin-lib/aliyun/lib/index.js";
import { AliyunClientV2 } from "../../../plugin-lib/aliyun/lib/aliyun-client-v2.js"; import { AliyunClientV2 } from "../../../plugin-lib/aliyun/lib/aliyun-client-v2.js";
@IsTaskPlugin({ @IsTaskPlugin({
@@ -31,7 +31,7 @@ export class AliyunDeployCertToALB extends AbstractTaskPlugin {
}, },
required: true required: true
}) })
cert!: CertInfo | number; cert!: CertInfo | CasCertId | number;
@TaskInput(createCertDomainGetterInputDefine({ props: { required: false } })) @TaskInput(createCertDomainGetterInputDefine({ props: { required: false } }))
certDomains!: string[]; certDomains!: string[];
@@ -298,18 +298,25 @@ export class AliyunDeployCertToALB extends AbstractTaskPlugin {
async getAliyunCertId(access: AliyunAccess) { async getAliyunCertId(access: AliyunAccess) {
let certId: any = this.cert; let certId: any = this.cert;
if (typeof this.cert === "object") { if (typeof this.cert === "object") {
const certInfo = this.cert as CertInfo;
const casCert = this.cert as CasCertId;
const sslClient = new AliyunSslClient({ const sslClient = new AliyunSslClient({
access, access,
logger: this.logger, logger: this.logger,
endpoint: this.casEndpoint endpoint: this.casEndpoint
}); });
const certName = this.buildCertName(CertReader.getMainDomain(this.cert.crt)); if (certInfo.crt) {
const certIdRes = await sslClient.uploadCertificate({ const certName = this.buildCertName(CertReader.getMainDomain(certInfo.crt));
name: certName, const certIdRes = await sslClient.uploadCertificate({
cert: this.cert name: certName,
}); cert: certInfo,
certId = certIdRes.certId as any; });
certId = certIdRes.certId as any;
}else if (casCert.certId){
certId = casCert.certId;
}
} }
return certId; return certId;
@@ -2,7 +2,7 @@ import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput
import { CertApplyPluginNames, CertInfo } from "@certd/plugin-cert"; import { CertApplyPluginNames, CertInfo } from "@certd/plugin-cert";
import { createCertDomainGetterInputDefine, createRemoteSelectInputDefine } from "@certd/plugin-lib"; import { createCertDomainGetterInputDefine, createRemoteSelectInputDefine } from "@certd/plugin-lib";
import { AliyunAccess } from "../../../plugin-lib/aliyun/access/index.js"; import { AliyunAccess } from "../../../plugin-lib/aliyun/access/index.js";
import { AliyunSslClient } from "../../../plugin-lib/aliyun/lib/ssl-client.js"; import { AliyunSslClient, CasCertId } from "../../../plugin-lib/aliyun/lib/ssl-client.js";
@IsTaskPlugin({ @IsTaskPlugin({
name: "AliyunDeployCertToAll", name: "AliyunDeployCertToAll",
@@ -27,7 +27,7 @@ export class AliyunDeployCertToAll extends AbstractTaskPlugin {
}, },
required: true, required: true,
}) })
cert!: CertInfo | number; cert!: CertInfo | CasCertId | number;
@TaskInput(createCertDomainGetterInputDefine({ props: { required: false } })) @TaskInput(createCertDomainGetterInputDefine({ props: { required: false } }))
certDomains!: string[]; certDomains!: string[];
@@ -155,11 +155,17 @@ export class AliyunDeployCertToAll extends AbstractTaskPlugin {
// //
let certId: any = this.cert; let certId: any = this.cert;
if (typeof this.cert === "object") { if (typeof this.cert === "object") {
const certIdRes = await sslClient.uploadCertificate({ const certInfo = this.cert as CertInfo;
name: this.appendTimeSuffix("certd"), const casCert = this.cert as CasCertId;
cert: this.cert, if (casCert.certId) {
}); certId = casCert.certId;
certId = certIdRes.certId as any; } else {
const certIdRes = await sslClient.uploadCertificate({
name: this.appendTimeSuffix("certd"),
cert: certInfo,
});
certId = certIdRes.certId as any;
}
} }
const jobId = await this.createDeployJob(sslClient, certId); const jobId = await this.createDeployJob(sslClient, certId);
@@ -4,7 +4,7 @@ import {
createRemoteSelectInputDefine createRemoteSelectInputDefine
} from "@certd/plugin-lib"; } from "@certd/plugin-lib";
import { AliyunAccess } from "../../../plugin-lib/aliyun/access/index.js"; import { AliyunAccess } from "../../../plugin-lib/aliyun/access/index.js";
import { AliyunSslClient } from "../../../plugin-lib/aliyun/lib/ssl-client.js"; import { AliyunSslClient, CasCertId } from "../../../plugin-lib/aliyun/lib/ssl-client.js";
import { CertApplyPluginNames, CertInfo, CertReader } from "@certd/plugin-cert"; import { CertApplyPluginNames, CertInfo, CertReader } from "@certd/plugin-cert";
import {optionsUtils} from "@certd/basic"; import {optionsUtils} from "@certd/basic";
@@ -30,7 +30,7 @@ export class DeployCertToAliyunApig extends AbstractTaskPlugin {
}, },
required: true, required: true,
}) })
cert!: CertInfo | string; cert!: CertInfo | CasCertId |number;
@TaskInput(createCertDomainGetterInputDefine({ props: { required: false } })) @TaskInput(createCertDomainGetterInputDefine({ props: { required: false } }))
certDomains!: string[]; certDomains!: string[];
@@ -137,11 +137,16 @@ export class DeployCertToAliyunApig extends AbstractTaskPlugin {
logger: this.logger, logger: this.logger,
region: this.casRegion, region: this.casRegion,
}); });
const certInfo = this.cert as CertInfo;
certId = await sslClient.uploadCert({ const casCert = this.cert as CasCertId;
name: this.buildCertName(CertReader.getMainDomain(this.cert.crt)), if (casCert.certId) {
cert: this.cert, certId = casCert.certId;
}); } else {
certId = await sslClient.uploadCert({
name: this.buildCertName(CertReader.getMainDomain(certInfo.crt)),
cert: certInfo,
});
}
} }
const certIdentify = `${certId}-${this.casRegion}` const certIdentify = `${certId}-${this.casRegion}`
@@ -1,9 +1,9 @@
import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from '@certd/pipeline'; import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from '@certd/pipeline';
import { createCertDomainGetterInputDefine, createRemoteSelectInputDefine } from '@certd/plugin-lib'; import { CertInfo, createCertDomainGetterInputDefine, createRemoteSelectInputDefine } from '@certd/plugin-lib';
import { AliyunAccess } from "../../../plugin-lib/aliyun/access/index.js"; import { AliyunAccess } from "../../../plugin-lib/aliyun/access/index.js";
import { optionsUtils } from '@certd/basic'; import { optionsUtils } from '@certd/basic';
import { CertApplyPluginNames, CertReader } from "@certd/plugin-cert"; import { CertApplyPluginNames, CertReader } from "@certd/plugin-cert";
import { AliyunClient, AliyunSslClient } from "../../../plugin-lib/aliyun/lib/index.js"; import { AliyunClient, AliyunSslClient, CasCertId } from "../../../plugin-lib/aliyun/lib/index.js";
@IsTaskPlugin({ @IsTaskPlugin({
name: 'DeployCertToAliyunCDN', name: 'DeployCertToAliyunCDN',
title: '阿里云-部署证书至CDN', title: '阿里云-部署证书至CDN',
@@ -43,7 +43,7 @@ export class DeployCertToAliyunCDN extends AbstractTaskPlugin {
template:false, template:false,
required: true, required: true,
}) })
cert!: string; cert!: CertInfo | CasCertId |number;
@TaskInput(createCertDomainGetterInputDefine({ props: { required: false } })) @TaskInput(createCertDomainGetterInputDefine({ props: { required: false } }))
certDomains!: string[]; certDomains!: string[];
@@ -113,13 +113,18 @@ export class DeployCertToAliyunCDN extends AbstractTaskPlugin {
let certName = this.appendTimeSuffix(this.certName); let certName = this.appendTimeSuffix(this.certName);
if (typeof this.cert === 'object') { if (typeof this.cert === 'object') {
// @ts-ignore const certInfo = this.cert as CertInfo;
const certName = this.buildCertName(CertReader.getMainDomain(this.cert.crt)) const casCert = this.cert as CasCertId;
const certIdRes = await sslClient.uploadCertificate({ if (casCert.certId) {
name:certName, certId = casCert.certId;
cert: this.cert, } else {
}); certName = this.buildCertName(CertReader.getMainDomain(certInfo.crt))
certId = certIdRes.certId as any; const certIdRes = await sslClient.uploadCertificate({
name:certName,
cert: certInfo,
});
certId = certIdRes.certId as any;
}
} }
const client = await this.getClient(access); const client = await this.getClient(access);
@@ -7,9 +7,9 @@ import {
import { AliyunAccess } from "../../../plugin-lib/aliyun/access/index.js"; import { AliyunAccess } from "../../../plugin-lib/aliyun/access/index.js";
import { CertInfo } from '@certd/plugin-cert'; import { CertInfo } from '@certd/plugin-cert';
import { CertApplyPluginNames} from '@certd/plugin-cert'; import { CertApplyPluginNames } from '@certd/plugin-cert';
import { optionsUtils } from "@certd/basic"; import { optionsUtils } from "@certd/basic";
import { AliyunClient } from "../../../plugin-lib/aliyun/lib/index.js"; import { AliyunClient, CasCertId } from "../../../plugin-lib/aliyun/lib/index.js";
@IsTaskPlugin({ @IsTaskPlugin({
name: 'DeployCertToAliyunDCDN', name: 'DeployCertToAliyunDCDN',
title: '阿里云-部署证书至DCDN', title: '阿里云-部署证书至DCDN',
@@ -32,7 +32,7 @@ export class DeployCertToAliyunDCDN extends AbstractTaskPlugin {
}, },
required: true, required: true,
}) })
cert!: CertInfo | number; cert!: CertInfo | CasCertId | number;
@TaskInput(createCertDomainGetterInputDefine({ props: { required: false } })) @TaskInput(createCertDomainGetterInputDefine({ props: { required: false } }))
certDomains!: string[]; certDomains!: string[];
@@ -68,18 +68,18 @@ export class DeployCertToAliyunDCDN extends AbstractTaskPlugin {
domainName!: string | string[]; domainName!: string | string[];
async onInstance() {} async onInstance() { }
async execute(): Promise<void> { async execute(): Promise<void> {
this.logger.info('开始部署证书到阿里云DCDN'); this.logger.info('开始部署证书到阿里云DCDN');
if(!this.domainName){ if (!this.domainName) {
throw new Error('您还未选择DCDN域名'); throw new Error('您还未选择DCDN域名');
} }
const access = (await this.getAccess(this.accessId)) as AliyunAccess; const access = (await this.getAccess(this.accessId)) as AliyunAccess;
const client = await this.getClient(access); const client = await this.getClient(access);
if(typeof this.domainName === 'string'){ if (typeof this.domainName === 'string') {
this.domainName = [this.domainName]; this.domainName = [this.domainName];
} }
for (const domainName of this.domainName ) { for (const domainName of this.domainName) {
this.logger.info(`[${domainName}]开始部署`) this.logger.info(`[${domainName}]开始部署`)
const params = await this.buildParams(domainName); const params = await this.buildParams(domainName);
await this.doRequest(client, params); await this.doRequest(client, params);
@@ -100,30 +100,32 @@ export class DeployCertToAliyunDCDN extends AbstractTaskPlugin {
return client; return client;
} }
async buildParams(domainName:string) { async buildParams(domainName: string) {
const CertName = (this.certName ?? 'certd') + '-' + dayjs().format('YYYYMMDDHHmmss'); const CertName = (this.certName ?? 'certd') + '-' + dayjs().format('YYYYMMDDHHmmss');
if (typeof this.cert !== 'object') { let certId: any = this.cert
const certId = this.cert; if (typeof this.cert === 'object') {
this.logger.info('使用已上传的证书:', certId); const certInfo = this.cert as CertInfo;
return { if (certInfo.crt) {
DomainName: domainName, this.logger.info('上传证书:', CertName);
SSLProtocol: 'on', const cert: any = this.cert;
CertType: 'cas', return {
CertName: CertName, DomainName: domainName,
CertId: certId, SSLProtocol: 'on',
}; CertName: CertName,
CertType: 'upload',
SSLPub: cert.crt,
SSLPri: cert.key,
};
}
} }
this.logger.info('使用已上传的证书:', certId);
this.logger.info('上传证书:', CertName);
const cert: any = this.cert;
return { return {
DomainName: domainName, DomainName: domainName,
SSLProtocol: 'on', SSLProtocol: 'on',
CertType: 'cas',
CertName: CertName, CertName: CertName,
CertType: 'upload', CertId: certId,
SSLPub: cert.crt,
SSLPri: cert.key,
}; };
} }
@@ -5,7 +5,7 @@ import {
createRemoteSelectInputDefine createRemoteSelectInputDefine
} from "@certd/plugin-lib"; } from "@certd/plugin-lib";
import { AliyunAccess } from "../../../plugin-lib/aliyun/access/index.js"; import { AliyunAccess } from "../../../plugin-lib/aliyun/access/index.js";
import { AliyunSslClient } from "../../../plugin-lib/aliyun/lib/ssl-client.js"; import { AliyunSslClient, CasCertId } from "../../../plugin-lib/aliyun/lib/ssl-client.js";
import { AliyunClientV2 } from "../../../plugin-lib/aliyun/lib/aliyun-client-v2.js"; import { AliyunClientV2 } from "../../../plugin-lib/aliyun/lib/aliyun-client-v2.js";
import dayjs from "dayjs"; import dayjs from "dayjs";
@@ -32,7 +32,7 @@ export class AliyunDeployCertToESA extends AbstractTaskPlugin {
}, },
required: true required: true
}) })
cert!: CertInfo; cert!: CertInfo | CasCertId | number;
@TaskInput(createCertDomainGetterInputDefine({ props: { required: false } })) @TaskInput(createCertDomainGetterInputDefine({ props: { required: false } }))
certDomains!: string[]; certDomains!: string[];
@@ -117,14 +117,21 @@ export class AliyunDeployCertToESA extends AbstractTaskPlugin {
endpoint: this.casEndpoint endpoint: this.casEndpoint
}); });
certName = this.buildCertName(CertReader.getMainDomain(this.cert.crt)); const certInfo = this.cert as CertInfo;
const casCert = this.cert as CasCertId;
if (casCert.certId) {
certId = casCert.certId;
certName = casCert.certName;
} else {
certName = this.buildCertName(CertReader.getMainDomain(certInfo.crt));
const certIdRes = await sslClient.uploadCertificate({ const certIdRes = await sslClient.uploadCertificate({
name: certName, name: certName,
cert: this.cert cert: certInfo
}); });
certId = certIdRes.certId as any; certId = certIdRes.certId as any;
this.logger.info("上传证书成功", certId, certName); this.logger.info("上传证书成功", certId, certName);
}
} }
return { return {
certId, certId,
@@ -5,7 +5,7 @@ import {
createRemoteSelectInputDefine createRemoteSelectInputDefine
} from "@certd/plugin-lib"; } from "@certd/plugin-lib";
import { AliyunAccess } from "../../../plugin-lib/aliyun/access/index.js"; import { AliyunAccess } from "../../../plugin-lib/aliyun/access/index.js";
import { AliyunSslClient } from "../../../plugin-lib/aliyun/lib/ssl-client.js"; import { AliyunSslClient, CasCertId } from "../../../plugin-lib/aliyun/lib/ssl-client.js";
@IsTaskPlugin({ @IsTaskPlugin({
name: "AliyunDeployCertToGA", name: "AliyunDeployCertToGA",
@@ -30,7 +30,7 @@ export class AliyunDeployCertToGA extends AbstractTaskPlugin {
}, },
required: true required: true
}) })
cert!: CertInfo|number; cert!: CertInfo|number | CasCertId;
@TaskInput(createCertDomainGetterInputDefine({ props: { required: false } })) @TaskInput(createCertDomainGetterInputDefine({ props: { required: false } }))
certDomains!: string[]; certDomains!: string[];
@@ -123,7 +123,7 @@ export class AliyunDeployCertToGA extends AbstractTaskPlugin {
logger: this.logger, logger: this.logger,
endpoint: this.casEndpoint endpoint: this.casEndpoint
}); });
return await sslClient.uploadCertOrGet(this.cert) return await sslClient.uploadCertOrGet(this.cert as any)
} }
async execute(): Promise<void> { async execute(): Promise<void> {
@@ -6,7 +6,7 @@ import {
} from "@certd/plugin-lib"; } from "@certd/plugin-lib";
import { CertApplyPluginNames} from '@certd/plugin-cert'; import { CertApplyPluginNames} from '@certd/plugin-cert';
import { AliyunAccess } from "../../../plugin-lib/aliyun/access/index.js"; import { AliyunAccess } from "../../../plugin-lib/aliyun/access/index.js";
import { AliyunClient, AliyunSslClient } from "../../../plugin-lib/aliyun/lib/index.js"; import { AliyunClient, AliyunSslClient, CasCertId } from "../../../plugin-lib/aliyun/lib/index.js";
import { AliyunClientV2 } from '../../../plugin-lib/aliyun/lib/aliyun-client-v2.js'; import { AliyunClientV2 } from '../../../plugin-lib/aliyun/lib/aliyun-client-v2.js';
@IsTaskPlugin({ @IsTaskPlugin({
name: 'AliyunDeployCertToNLB', name: 'AliyunDeployCertToNLB',
@@ -31,7 +31,7 @@ export class AliyunDeployCertToNLB extends AbstractTaskPlugin {
}, },
required: true, required: true,
}) })
cert!: CertInfo | number; cert!: CertInfo | number | CasCertId;
@TaskInput(createCertDomainGetterInputDefine({ props: { required: false } })) @TaskInput(createCertDomainGetterInputDefine({ props: { required: false } }))
certDomains!: string[]; certDomains!: string[];
@@ -286,17 +286,25 @@ export class AliyunDeployCertToNLB extends AbstractTaskPlugin {
async getAliyunCertId(access: AliyunAccess) { async getAliyunCertId(access: AliyunAccess) {
let certId: any = this.cert; let certId: any = this.cert;
if (typeof this.cert === 'object') { if (typeof this.cert === 'object') {
const casCert = this.cert as CasCertId;
if (casCert.certId) {
return casCert.certId;
}
const certInfo = this.cert as CertInfo;
const sslClient = new AliyunSslClient({ const sslClient = new AliyunSslClient({
access, access,
logger: this.logger, logger: this.logger,
endpoint: this.casEndpoint, endpoint: this.casEndpoint,
}); });
const certName = this.buildCertName(CertReader.getMainDomain(this.cert.crt)) const certName = this.buildCertName(CertReader.getMainDomain(certInfo.crt))
const certIdRes = await sslClient.uploadCertificate({ const certIdRes = await sslClient.uploadCertificate({
name: certName, name: certName,
cert: this.cert, cert: certInfo,
}); });
certId = certIdRes.certId as any; certId = certIdRes.certId as any;
} }
@@ -1,14 +1,13 @@
import {AbstractTaskPlugin, IsTaskPlugin, Pager, pluginGroups, RunStrategy, TaskInput} from '@certd/pipeline'; import { optionsUtils } from "@certd/basic";
import { AbstractTaskPlugin, IsTaskPlugin, Pager, pluginGroups, RunStrategy, TaskInput } from '@certd/pipeline';
import { CertApplyPluginNames, CertInfo } from '@certd/plugin-cert';
import { import {
createCertDomainGetterInputDefine, createCertDomainGetterInputDefine,
createRemoteSelectInputDefine createRemoteSelectInputDefine
} from '@certd/plugin-lib'; } from '@certd/plugin-lib';
import {CertInfo, CertReader} from '@certd/plugin-cert'; import { isArray } from "lodash-es";
import { CertApplyPluginNames} from '@certd/plugin-cert';
import {optionsUtils} from "@certd/basic";
import {isArray} from "lodash-es";
import { AliyunAccess } from '../../../plugin-lib/aliyun/access/index.js'; import { AliyunAccess } from '../../../plugin-lib/aliyun/access/index.js';
import { AliyunSslClient } from '../../../plugin-lib/aliyun/lib/index.js'; import { CasCertId } from '../../../plugin-lib/aliyun/lib/index.js';
@IsTaskPlugin({ @IsTaskPlugin({
name: 'DeployCertToAliyunOSS', name: 'DeployCertToAliyunOSS',
title: '阿里云-部署证书至OSS', title: '阿里云-部署证书至OSS',
@@ -32,7 +31,7 @@ export class DeployCertToAliyunOSS extends AbstractTaskPlugin {
}, },
required: true, required: true,
}) })
cert!: CertInfo | string; cert!: CertInfo | number | CasCertId;
@TaskInput(createCertDomainGetterInputDefine({ props: { required: false } })) @TaskInput(createCertDomainGetterInputDefine({ props: { required: false } }))
certDomains!: string[]; certDomains!: string[];
@@ -147,7 +146,6 @@ export class DeployCertToAliyunOSS extends AbstractTaskPlugin {
this.logger.info('开始部署证书到阿里云OSS'); this.logger.info('开始部署证书到阿里云OSS');
const access = (await this.getAccess(this.accessId)) as AliyunAccess; const access = (await this.getAccess(this.accessId)) as AliyunAccess;
await this.getAliyunCertId(access)
this.logger.info(`bucket: ${this.bucket}, region: ${this.region}, domainName: ${this.domainName}`); this.logger.info(`bucket: ${this.bucket}, region: ${this.region}, domainName: ${this.domainName}`);
const client = await this.getClient(access); const client = await this.getClient(access);
if (typeof this.domainName === "string"){ if (typeof this.domainName === "string"){
@@ -169,12 +167,19 @@ export class DeployCertToAliyunOSS extends AbstractTaskPlugin {
}); });
let certStr = "" let certStr = ""
if (typeof this.cert === "object" ){ if (typeof this.cert === "object" ){
certStr = ` const certInfo = this.cert as CertInfo;
<PrivateKey>${this.cert.key}</PrivateKey> if (certInfo.crt){
<Certificate>${this.cert.crt}</Certificate> certStr = `
` <PrivateKey>${certInfo.key}</PrivateKey>
}else{ <Certificate>${certInfo.crt}</Certificate>
`
}else{
const casCert = this.cert as CasCertId;
certStr = `<CertId>${casCert.certIdentifier}</CertId>`
}
}else {
certStr = `<CertId>${this.cert}-${this.casRegion}</CertId>` certStr = `<CertId>${this.cert}-${this.casRegion}</CertId>`
} }
@@ -196,34 +201,6 @@ export class DeployCertToAliyunOSS extends AbstractTaskPlugin {
return res; return res;
} }
async getAliyunCertId(access: AliyunAccess) {
let certId: any = this.cert;
let certName: any = this.appendTimeSuffix("certd");
if (typeof this.cert === "object") {
let endpoint = `cas.${this.casRegion}.aliyuncs.com`;
if (this.casRegion === "cn-hangzhou" || !this.casRegion){
endpoint = "cas.aliyuncs.com";
}
const sslClient = new AliyunSslClient({
access,
logger: this.logger,
endpoint: endpoint
});
certName = this.buildCertName(CertReader.getMainDomain(this.cert.crt));
const certIdRes = await sslClient.uploadCertificate({
name: certName,
cert: this.cert
});
certId = certIdRes.certId as any;
this.logger.info("上传证书成功", certId, certName);
}
return {
certId,
certName
};
}
async getClient(access: AliyunAccess) { async getClient(access: AliyunAccess) {
// @ts-ignore // @ts-ignore
@@ -1,10 +1,10 @@
import {AbstractTaskPlugin, IsTaskPlugin, PageSearch, pluginGroups, RunStrategy, TaskInput} from '@certd/pipeline'; import { AbstractTaskPlugin, IsTaskPlugin, PageSearch, pluginGroups, RunStrategy, TaskInput } from '@certd/pipeline';
import {CertInfo} from '@certd/plugin-cert'; import { CertInfo } from '@certd/plugin-cert';
import { import {
createCertDomainGetterInputDefine, createCertDomainGetterInputDefine,
createRemoteSelectInputDefine createRemoteSelectInputDefine
} from '@certd/plugin-lib'; } from '@certd/plugin-lib';
import {CertApplyPluginNames} from '@certd/plugin-cert'; import { CertApplyPluginNames } from '@certd/plugin-cert';
import { AliyunAccess } from '../../../plugin-lib/aliyun/access/index.js'; import { AliyunAccess } from '../../../plugin-lib/aliyun/access/index.js';
import { AliyunClient, AliyunSslClient, CasCertInfo } from '../../../plugin-lib/aliyun/lib/index.js'; import { AliyunClient, AliyunSslClient, CasCertInfo } from '../../../plugin-lib/aliyun/lib/index.js';
@@ -31,9 +31,9 @@ export class AliyunDeployCertToSLB extends AbstractTaskPlugin {
}, },
required: true, required: true,
}) })
cert!: CertInfo | number; cert!: CertInfo | number | CasCertInfo;
@TaskInput(createCertDomainGetterInputDefine({props: {required: false}})) @TaskInput(createCertDomainGetterInputDefine({ props: { required: false } }))
certDomains!: string[]; certDomains!: string[];
@@ -44,9 +44,9 @@ export class AliyunDeployCertToSLB extends AbstractTaskPlugin {
component: { component: {
name: 'a-select', name: 'a-select',
options: [ options: [
{value: 'cas.aliyuncs.com', label: '中国大陆'}, { value: 'cas.aliyuncs.com', label: '中国大陆' },
{value: 'cas.ap-southeast-1.aliyuncs.com', label: '新加坡'}, { value: 'cas.ap-southeast-1.aliyuncs.com', label: '新加坡' },
{value: 'cas.eu-central-1.aliyuncs.com', label: '德国(法兰克福)'}, { value: 'cas.eu-central-1.aliyuncs.com', label: '德国(法兰克福)' },
], ],
}, },
required: true, required: true,
@@ -99,24 +99,24 @@ export class AliyunDeployCertToSLB extends AbstractTaskPlugin {
@TaskInput({ @TaskInput({
title: "部署默认证书", title: "部署默认证书",
value: true, value: true,
component: { component: {
name: "a-switch", name: "a-switch",
vModel: "checked" vModel: "checked"
}
} }
}
) )
deployDefault!: boolean; deployDefault!: boolean;
@TaskInput({ @TaskInput({
title: "部署扩展证书", title: "部署扩展证书",
value: false, value: false,
component: { component: {
name: "a-switch", name: "a-switch",
vModel: "checked" vModel: "checked"
}
} }
}
) )
deployExtension!: boolean; deployExtension!: boolean;
@@ -126,8 +126,8 @@ export class AliyunDeployCertToSLB extends AbstractTaskPlugin {
title: '扩展域名列表', title: '扩展域名列表',
helper: '要部署扩展域名列表', helper: '要部署扩展域名列表',
action: AliyunDeployCertToSLB.prototype.onGetExtensionDomainList.name, action: AliyunDeployCertToSLB.prototype.onGetExtensionDomainList.name,
watches: ['listeners','deployExtension'], watches: ['listeners', 'deployExtension'],
mergeScript:` mergeScript: `
return { return {
show: ctx.compute(({form})=>{ show: ctx.compute(({form})=>{
return form.deployExtension; return form.deployExtension;
@@ -143,7 +143,7 @@ export class AliyunDeployCertToSLB extends AbstractTaskPlugin {
} }
async getLBClient(access: AliyunAccess, region: string) { async getLBClient(access: AliyunAccess, region: string) {
const client = new AliyunClient({logger: this.logger}); const client = new AliyunClient({ logger: this.logger });
const version = '2014-05-15'; const version = '2014-05-15';
await client.init({ await client.init({
accessKeyId: access.accessKeyId, accessKeyId: access.accessKeyId,
@@ -163,10 +163,10 @@ export class AliyunDeployCertToSLB extends AbstractTaskPlugin {
const aliyunCert = await this.getAliyunCertId(access); const aliyunCert = await this.getAliyunCertId(access);
const slbServerCertId = await this.uploadServerCert(client, aliyunCert); const slbServerCertId = await this.uploadServerCert(client, aliyunCert);
if (this.deployDefault!==false) { if (this.deployDefault !== false) {
this.logger.info("部署监听器默认证书") this.logger.info("部署监听器默认证书")
for (const listener of this.listeners) { for (const listener of this.listeners) {
const {port, loadBalanceId} = this.resolveListenerKey(listener) const { port, loadBalanceId } = this.resolveListenerKey(listener)
const params = { const params = {
RegionId: this.regionId, RegionId: this.regionId,
LoadBalancerId: loadBalanceId, LoadBalancerId: loadBalanceId,
@@ -185,7 +185,7 @@ export class AliyunDeployCertToSLB extends AbstractTaskPlugin {
const clientV2 = this.getCLBClientV2(access); const clientV2 = this.getCLBClientV2(access);
for (const domainStr of this.extensionDomains) { for (const domainStr of this.extensionDomains) {
const {extensionDomainId} = this.resolveListenerKey(domainStr) const { extensionDomainId } = this.resolveListenerKey(domainStr)
const res = await clientV2.doRequest({ const res = await clientV2.doRequest({
action: "SetDomainExtensionAttribute", action: "SetDomainExtensionAttribute",
// 接口版本 // 接口版本
@@ -251,11 +251,20 @@ export class AliyunDeployCertToSLB extends AbstractTaskPlugin {
if (typeof this.cert === 'object') { if (typeof this.cert === 'object') {
const name = this.appendTimeSuffix('certd'); const name = this.appendTimeSuffix('certd');
const certIdRes = await sslClient.uploadCertificate({
name: name, const casCert = this.cert as CasCertInfo;
cert: this.cert, if (casCert.certIdentifier) {
}); certId = casCert.certId;
certId = certIdRes.certId as any; } else {
const cert = this.cert as CertInfo;
const certIdRes = await sslClient.uploadCertificate({
name: name,
cert: cert,
});
certId = certIdRes.certId as any;
}
} }
return await sslClient.getCertInfo(certId); return await sslClient.getCertInfo(certId);
@@ -360,7 +369,7 @@ export class AliyunDeployCertToSLB extends AbstractTaskPlugin {
const allDomains: any[] = [] const allDomains: any[] = []
for (const ls of this.listeners) { for (const ls of this.listeners) {
const {port, loadBalanceId, protocol} = this.resolveListenerKey(ls) const { port, loadBalanceId, protocol } = this.resolveListenerKey(ls)
const domains = await this.doGetExtensionDomainList({ const domains = await this.doGetExtensionDomainList({
access, access,
loadBalancerId: loadBalanceId, loadBalancerId: loadBalanceId,
@@ -381,7 +390,7 @@ export class AliyunDeployCertToSLB extends AbstractTaskPlugin {
listenerProtocol: string, listenerProtocol: string,
access: AliyunAccess access: AliyunAccess
}) { }) {
const {loadBalancerId, listenerPort, listenerProtocol, access} = data; const { loadBalancerId, listenerPort, listenerProtocol, access } = data;
const client = access.getClient(`slb.${this.regionId}.aliyuncs.com`) const client = access.getClient(`slb.${this.regionId}.aliyuncs.com`)
let queries = { let queries = {
@@ -412,7 +421,7 @@ export class AliyunDeployCertToSLB extends AbstractTaskPlugin {
return { return {
value: value, value: value,
label: label, label: label,
domain:i.Domain domain: i.Domain
}; };
}); });
} }
@@ -1,11 +1,11 @@
import { AbstractTaskPlugin, IsTaskPlugin, Pager,PageSearch, pluginGroups, RunStrategy, TaskInput } from "@certd/pipeline"; import { AbstractTaskPlugin, IsTaskPlugin, Pager, PageSearch, pluginGroups, RunStrategy, TaskInput } from "@certd/pipeline";
import { CertApplyPluginNames, CertInfo, CertReader } from "@certd/plugin-cert"; import { CertApplyPluginNames, CertInfo, CertReader } from "@certd/plugin-cert";
import { import {
createCertDomainGetterInputDefine, createCertDomainGetterInputDefine,
createRemoteSelectInputDefine createRemoteSelectInputDefine
} from "@certd/plugin-lib"; } from "@certd/plugin-lib";
import { AliyunAccess } from "../../../plugin-lib/aliyun/access/index.js"; import { AliyunAccess } from "../../../plugin-lib/aliyun/access/index.js";
import { AliyunClient, AliyunSslClient } from "../../../plugin-lib/aliyun/lib/index.js"; import { AliyunClient, AliyunSslClient, CasCertInfo } from "../../../plugin-lib/aliyun/lib/index.js";
@IsTaskPlugin({ @IsTaskPlugin({
name: 'AliyunDeployCertToWaf', name: 'AliyunDeployCertToWaf',
@@ -30,7 +30,7 @@ export class AliyunDeployCertToWaf extends AbstractTaskPlugin {
}, },
required: true, required: true,
}) })
cert!: CertInfo | number; cert!: CertInfo | number | CasCertInfo;
@TaskInput(createCertDomainGetterInputDefine({ props: { required: false } })) @TaskInput(createCertDomainGetterInputDefine({ props: { required: false } }))
certDomains!: string[]; certDomains!: string[];
@@ -83,8 +83,8 @@ export class AliyunDeployCertToWaf extends AbstractTaskPlugin {
helper: '请选择要部署证书的CNAME站点', helper: '请选择要部署证书的CNAME站点',
action: AliyunDeployCertToWaf.prototype.onGetCnameList.name, action: AliyunDeployCertToWaf.prototype.onGetCnameList.name,
watches: ['accessId', 'regionId'], watches: ['accessId', 'regionId'],
pager:true, pager: true,
search:true, search: true,
}) })
) )
cnameDomains!: string[]; cnameDomains!: string[];
@@ -105,7 +105,7 @@ export class AliyunDeployCertToWaf extends AbstractTaskPlugin {
}) })
tlsVersion!: string; tlsVersion!: string;
@TaskInput({ @TaskInput({
title: '启用TLSv3', title: '启用TLSv3',
value: true, value: true,
component: { component: {
@@ -118,7 +118,7 @@ export class AliyunDeployCertToWaf extends AbstractTaskPlugin {
async onInstance() {} async onInstance() { }
async getWafClient(access: AliyunAccess) { async getWafClient(access: AliyunAccess) {
const client = new AliyunClient({ logger: this.logger }); const client = new AliyunClient({ logger: this.logger });
@@ -152,11 +152,17 @@ export class AliyunDeployCertToWaf extends AbstractTaskPlugin {
endpoint: this.casEndpoint, endpoint: this.casEndpoint,
}); });
const certIdRes = await sslClient.uploadCertificate({ const cert = this.cert as CertInfo;
name: this.buildCertName(CertReader.getMainDomain(this.cert.crt)), if (cert.crt) {
cert: this.cert, const certIdRes = await sslClient.uploadCertificate({
}); name: this.buildCertName(CertReader.getMainDomain(cert.crt)),
certId = certIdRes.certId as any; cert: cert,
});
certId = certIdRes.certId as any;
}else {
const casCert = this.cert as CasCertInfo;
certId = casCert.certId;
}
} }
const client = await this.getWafClient(access); const client = await this.getWafClient(access);
@@ -211,13 +217,13 @@ export class AliyunDeployCertToWaf extends AbstractTaskPlugin {
const pager = new Pager(data) const pager = new Pager(data)
const instanceId = await this.getInstanceId(client); const instanceId = await this.getInstanceId(client);
const params:any = { const params: any = {
RegionId: this.regionId, RegionId: this.regionId,
InstanceId: instanceId, InstanceId: instanceId,
PageSize: pager.pageSize, PageSize: pager.pageSize,
PageNumber: pager.pageNo, PageNumber: pager.pageNo,
}; };
if (data.searchKey){ if (data.searchKey) {
params.Domain = data.searchKey params.Domain = data.searchKey
} }
@@ -235,7 +241,7 @@ export class AliyunDeployCertToWaf extends AbstractTaskPlugin {
domain: item.Domain, domain: item.Domain,
}; };
}); });
const list= this.ctx.utils.options.buildGroupOptions(options, this.certDomains); const list = this.ctx.utils.options.buildGroupOptions(options, this.certDomains);
// const list = [{value:"1",label:"1"},{value:"2",label:"2"}] // const list = [{value:"1",label:"1"},{value:"2",label:"2"}]
// const total = 120 // const total = 120
@@ -1,7 +1,7 @@
import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput, TaskOutput } from '@certd/pipeline'; import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput, TaskOutput } from '@certd/pipeline';
import { CertApplyPluginNames, CertReader } from "@certd/plugin-cert"; import { CertApplyPluginNames, CertReader } from "@certd/plugin-cert";
import { AliyunAccess } from '../../../plugin-lib/aliyun/access/index.js'; import { AliyunAccess } from '../../../plugin-lib/aliyun/access/index.js';
import { AliyunSslClient } from '../../../plugin-lib/aliyun/lib/index.js'; import { AliyunSslClient, CasCertId } from '../../../plugin-lib/aliyun/lib/index.js';
/** /**
* 华东1(杭州) cn-hangzhou cas.aliyuncs.com cas-vpc.cn-hangzhou.aliyuncs.com * 华东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 * 马来西亚(吉隆坡) ap-southeast-3 cas.ap-southeast-3.aliyuncs.com cas-vpc.ap-southeast-3.aliyuncs.com
@@ -78,7 +78,7 @@ export class UploadCertToAliyun extends AbstractTaskPlugin {
@TaskOutput({ @TaskOutput({
title: '上传成功后的阿里云CertId', title: '上传成功后的阿里云CertId',
}) })
aliyunCertId!: string; aliyunCertId!: CasCertId;
async onInstance() {} async onInstance() {}
@@ -126,18 +126,25 @@ export class AliyunSslClient {
} }
} }
async uploadCertOrGet(cert: CertInfo | number ) :Promise<CasCertId>{ async uploadCertOrGet(cert: CertInfo | number | CasCertId ) :Promise<CasCertId>{
if (typeof cert === "object") { if (typeof cert === "object") {
const casCert = cert as CasCertId;
if (casCert.certId) {
return casCert;
}
const certInfo = cert as CertInfo;
// 上传证书到阿里云 // 上传证书到阿里云
this.logger.info(`开始上传证书`); this.logger.info(`开始上传证书`);
const certName = CertReader.buildCertName(cert); const certName = CertReader.buildCertName(certInfo);
const res = await this.uploadCertificate({ const res = await this.uploadCertificate({
name: certName, name: certName,
cert: cert cert: certInfo
}); });
this.logger.info("上传证书成功", JSON.stringify(res)); this.logger.info("上传证书成功", JSON.stringify(res));
return res return res
} }
//number类型
const certId = cert as any; const certId = cert as any;
let certName: any = utils.string.appendTimeSuffix(certId); let certName: any = utils.string.appendTimeSuffix(certId);
const certIdentifier = this.getCertIdentifier(certId); const certIdentifier = this.getCertIdentifier(certId);