feat: 域名验证方法支持CNAME间接方式,此方式支持所有域名注册商,且无需提供Access授权,但是需要手动添加cname解析

This commit is contained in:
xiaojunnuo
2024-10-07 03:21:16 +08:00
parent 0c8e83e125
commit f3d35084ed
123 changed files with 2373 additions and 456 deletions
@@ -17,13 +17,13 @@ export class AliyunDnsProvider extends AbstractDnsProvider {
async onInstance() {
const access: any = this.access;
this.client = new AliyunClient({logger:this.logger})
this.client = new AliyunClient({ logger: this.logger });
await this.client.init({
accessKeyId: access.accessKeyId,
accessKeySecret: access.accessKeySecret,
endpoint: 'https://alidns.aliyuncs.com',
apiVersion: '2015-01-09',
})
});
}
//
// async getDomainList() {
@@ -101,7 +101,6 @@ export class AliyunDnsProvider extends AbstractDnsProvider {
// Line: 'oversea' // 海外
};
const requestOption = {
method: 'POST',
};
@@ -119,7 +118,8 @@ export class AliyunDnsProvider extends AbstractDnsProvider {
}
}
async removeRecord(options: RemoveRecordOptions<any>): Promise<any> {
const { fullRecord, value, record } = options;
const { fullRecord, value } = options.recordReq;
const record = options.recordRes;
const params = {
RegionId: 'cn-hangzhou',
RecordId: record,
@@ -31,7 +31,7 @@ export class DeployCertToAliyunCDN extends AbstractTaskPlugin {
title: '域名证书',
helper: '请选择前置任务输出的域名证书',
component: {
name: 'pi-output-selector',
name: 'output-selector',
from: ['CertApply', 'CertApplyLego'],
},
required: true,
@@ -42,7 +42,7 @@ export class DeployCertToAliyunCDN extends AbstractTaskPlugin {
title: 'Access授权',
helper: '阿里云授权AccessKeyId、AccessKeySecret',
component: {
name: 'pi-access-selector',
name: 'access-selector',
type: 'aliyun',
},
required: true,
@@ -31,7 +31,7 @@ export class DeployCertToAliyunDCDN extends AbstractTaskPlugin {
title: '域名证书',
helper: '请选择前置任务输出的域名证书',
component: {
name: 'pi-output-selector',
name: 'output-selector',
from: ['CertApply', 'CertApplyLego'],
},
required: true,
@@ -42,7 +42,7 @@ export class DeployCertToAliyunDCDN extends AbstractTaskPlugin {
title: 'Access授权',
helper: '阿里云授权AccessKeyId、AccessKeySecret',
component: {
name: 'pi-access-selector',
name: 'access-selector',
type: 'aliyun',
},
required: true,
@@ -37,7 +37,7 @@ export class UploadCertToAliyun extends AbstractTaskPlugin {
title: '域名证书',
helper: '请选择前置任务输出的域名证书',
component: {
name: 'pi-output-selector',
name: 'output-selector',
from: ['CertApply', 'CertApplyLego'],
},
required: true,
@@ -48,7 +48,7 @@ export class UploadCertToAliyun extends AbstractTaskPlugin {
title: 'Access授权',
helper: '阿里云授权AccessKeyId、AccessKeySecret',
component: {
name: 'pi-access-selector',
name: 'access-selector',
type: 'aliyun',
},
required: true,
@@ -1,9 +1,4 @@
import {
AbstractDnsProvider,
CreateRecordOptions,
IsDnsProvider,
RemoveRecordOptions,
} from '@certd/plugin-cert';
import { AbstractDnsProvider, CreateRecordOptions, IsDnsProvider, RemoveRecordOptions } from '@certd/plugin-cert';
import { Autowire, HttpClient, ILogger } from '@certd/pipeline';
import { CloudflareAccess } from './access.js';
@@ -88,9 +83,7 @@ export class CloudflareDnsProvider extends AbstractDnsProvider<CloudflareRecord>
ttl: 60,
});
const record = res.result as CloudflareRecord;
this.logger.info(
`添加域名解析成功:fullRecord=${fullRecord},value=${value}`
);
this.logger.info(`添加域名解析成功:fullRecord=${fullRecord},value=${value}`);
this.logger.info(`dns解析记录:${JSON.stringify(record)}`);
//本接口需要返回本次创建的dns解析记录,这个记录会在删除的时候用到
@@ -101,10 +94,9 @@ export class CloudflareDnsProvider extends AbstractDnsProvider<CloudflareRecord>
* 删除dns解析记录,清理申请痕迹
* @param options
*/
async removeRecord(
options: RemoveRecordOptions<CloudflareRecord>
): Promise<void> {
const { fullRecord, value, record } = options;
async removeRecord(options: RemoveRecordOptions<CloudflareRecord>): Promise<void> {
const { fullRecord, value } = options.recordReq;
const record = options.recordRes;
this.logger.info('删除域名解析:', fullRecord, value);
if (!record) {
this.logger.info('record不存在');
@@ -115,9 +107,7 @@ export class CloudflareDnsProvider extends AbstractDnsProvider<CloudflareRecord>
const recordId = record.id;
const url = `https://api.cloudflare.com/client/v4/zones/${zoneId}/dns_records/${recordId}`;
await this.doRequestApi(url, null, 'delete');
this.logger.info(
`删除域名解析成功:fullRecord=${fullRecord},value=${value}`
);
this.logger.info(`删除域名解析成功:fullRecord=${fullRecord},value=${value}`);
}
}
@@ -54,7 +54,7 @@ export class CloudflareDeployToCDNPlugin extends AbstractTaskPlugin {
title: '域名证书',
helper: '请选择前置任务输出的域名证书',
component: {
name: 'pi-output-selector',
name: 'output-selector',
from: ['CertApply', 'CertApplyLego'],
},
required: true,
@@ -66,7 +66,7 @@ export class CloudflareDeployToCDNPlugin extends AbstractTaskPlugin {
title: 'demo授权',
helper: 'demoAccess授权',
component: {
name: 'pi-access-selector',
name: 'access-selector',
type: 'plugins',
},
rules: [{ required: true, message: '此项必填' }],
@@ -61,8 +61,9 @@ export class DemoDnsProvider extends AbstractDnsProvider<DemoRecord> {
* @param options
*/
async removeRecord(options: RemoveRecordOptions<DemoRecord>): Promise<void> {
const { fullRecord, value, record } = options;
this.logger.info('删除域名解析:', fullRecord, value, record);
const { fullRecord, value, domain } = options.recordReq;
const record = options.recordRes;
this.logger.info('删除域名解析:', domain, fullRecord, value, record);
//这里调用删除txt dns解析记录接口
//请根据实际接口情况调用,例如:
@@ -53,7 +53,7 @@ export class DemoTestPlugin extends AbstractTaskPlugin {
title: '域名证书',
helper: '请选择前置任务输出的域名证书',
component: {
name: 'pi-output-selector',
name: 'output-selector',
from: ['CertApply', 'CertApplyLego'],
},
// required: true,
@@ -65,7 +65,7 @@ export class DemoTestPlugin extends AbstractTaskPlugin {
title: 'demo授权',
helper: 'demoAccess授权',
component: {
name: 'pi-access-selector',
name: 'access-selector',
type: 'demo', //固定授权类型
},
// rules: [{ required: true, message: '此项必填' }],
@@ -26,7 +26,7 @@ export class DogeCloudDeployToCDNPlugin extends AbstractTaskPlugin {
title: '证书',
helper: '请选择前置任务输出的域名证书',
component: {
name: 'pi-output-selector',
name: 'output-selector',
from: ['CertApply', 'CertApplyLego'],
},
required: true,
@@ -38,7 +38,7 @@ export class DogeCloudDeployToCDNPlugin extends AbstractTaskPlugin {
title: '多吉云授权',
helper: '多吉云AccessKey',
component: {
name: 'pi-access-selector',
name: 'access-selector',
type: 'dogecloud',
},
rules: [{ required: true, message: '此项必填' }],
@@ -66,7 +66,7 @@ export class CopyCertToLocalPlugin extends AbstractTaskPlugin {
title: '域名证书',
helper: '请选择前置任务输出的域名证书',
component: {
name: 'pi-output-selector',
name: 'output-selector',
from: ['CertApply', 'CertApplyLego'],
},
required: true,
@@ -19,7 +19,7 @@ export class HostShellExecutePlugin extends AbstractTaskPlugin {
title: '主机登录配置',
helper: '登录',
component: {
name: 'pi-access-selector',
name: 'access-selector',
type: 'ssh',
},
required: true,
@@ -65,7 +65,7 @@ export class UploadCertToHostPlugin extends AbstractTaskPlugin {
title: '域名证书',
helper: '请选择前置任务输出的域名证书',
component: {
name: 'pi-output-selector',
name: 'output-selector',
from: ['CertApply', 'CertApplyLego'],
},
required: true,
@@ -76,7 +76,7 @@ export class UploadCertToHostPlugin extends AbstractTaskPlugin {
title: '主机登录配置',
helper: 'access授权',
component: {
name: 'pi-access-selector',
name: 'access-selector',
type: 'ssh',
},
required: true,
@@ -73,8 +73,8 @@ export class HuaweiDnsProvider extends AbstractDnsProvider {
if (records && records.length > 0) {
for (const record of records) {
await this.removeRecord({
record,
...options,
recordRes: record,
recordReq: options,
});
}
}
@@ -101,7 +101,8 @@ export class HuaweiDnsProvider extends AbstractDnsProvider {
}
}
async removeRecord(options: RemoveRecordOptions<any>): Promise<any> {
const { fullRecord, value, record } = options;
const { fullRecord, value } = options.recordReq;
const record = options.recordRes;
const req: ApiRequestOptions = {
url: `${this.dnsEndpoint}/v2/zones/${record.zone_id}/recordsets/${record.id}`,
method: 'DELETE',
@@ -102,10 +102,11 @@ export class JDCloudDnsProvider extends AbstractDnsProvider {
/**
* 删除dns解析记录,清理申请痕迹
* @param opts
* @param options
*/
async removeRecord(opts: RemoveRecordOptions<any>): Promise<void> {
const { record } = opts;
async removeRecord(options: RemoveRecordOptions<any>): Promise<void> {
// const { fullRecord, value, domain } = options.recordReq;
const record = options.recordRes;
const deleteResourceRecord = promisfy(this.service.deleteResourceRecord);
const res: any = await deleteResourceRecord(
{
@@ -36,7 +36,7 @@ export class CustomScriptPlugin extends AbstractTaskPlugin {
title: '域名证书',
helper: '请选择前置任务输出的域名证书',
component: {
name: 'pi-output-selector',
name: 'output-selector',
from: ['CertApply', 'CertApplyLego'],
},
required: false,
@@ -26,7 +26,7 @@ export class QiniuDeployCertToCDN extends AbstractTaskPlugin {
title: '域名证书',
helper: '请选择前置任务输出的域名证书,或者上传到七牛云的证书id',
component: {
name: 'pi-output-selector',
name: 'output-selector',
from: ['CertApply', 'CertApplyLego', 'QiniuCertUpload'],
},
required: true,
@@ -37,7 +37,7 @@ export class QiniuDeployCertToCDN extends AbstractTaskPlugin {
title: 'Access授权',
helper: '七牛云授权',
component: {
name: 'pi-access-selector',
name: 'access-selector',
type: 'qiniu',
},
required: true,
@@ -25,7 +25,7 @@ export class QiniuCertUpload extends AbstractTaskPlugin {
title: '域名证书',
helper: '请选择前置任务输出的域名证书',
component: {
name: 'pi-output-selector',
name: 'output-selector',
from: ['CertApply', 'CertApplyLego'],
},
required: true,
@@ -36,7 +36,7 @@ export class QiniuCertUpload extends AbstractTaskPlugin {
title: 'Access授权',
helper: '七牛云授权',
component: {
name: 'pi-access-selector',
name: 'access-selector',
type: 'qiniu',
},
required: true,
@@ -86,7 +86,8 @@ export class DnspodDnsProvider extends AbstractDnsProvider {
}
async removeRecord(options: RemoveRecordOptions<any>) {
const { fullRecord, value, record } = options;
const { fullRecord, value } = options.recordReq;
const record = options.recordRes;
const domain = await this.matchDomain(fullRecord);
const ret = await this.doRequest({
@@ -70,8 +70,8 @@ export class TencentDnsProvider extends AbstractDnsProvider {
}
async removeRecord(options: RemoveRecordOptions<any>) {
const { fullRecord, value, domain, record } = options;
const { fullRecord, value, domain } = options.recordReq;
const record = options.recordRes;
const params = {
Domain: domain,
RecordId: record.RecordId,
@@ -18,7 +18,7 @@ export class DeployToCdnPlugin extends AbstractTaskPlugin {
title: '域名证书',
helper: '请选择前置任务输出的域名证书',
component: {
name: 'pi-output-selector',
name: 'output-selector',
from: ['CertApply', 'CertApplyLego'],
},
required: true,
@@ -29,7 +29,7 @@ export class DeployToCdnPlugin extends AbstractTaskPlugin {
title: 'Access提供者',
helper: 'access 授权',
component: {
name: 'pi-access-selector',
name: 'access-selector',
type: 'tencent',
},
required: true,
@@ -75,7 +75,7 @@ export class DeployToClbPlugin extends AbstractTaskPlugin {
title: '域名证书',
helper: '请选择前置任务输出的域名证书',
component: {
name: 'pi-output-selector',
name: 'output-selector',
from: ['CertApply', 'CertApplyLego'],
},
required: true,
@@ -86,7 +86,7 @@ export class DeployToClbPlugin extends AbstractTaskPlugin {
title: 'Access提供者',
helper: 'access授权',
component: {
name: 'pi-access-selector',
name: 'access-selector',
type: 'tencent',
},
required: true,
@@ -18,7 +18,7 @@ export class DeployToEOPlugin extends AbstractTaskPlugin {
title: '已上传证书ID',
helper: '请选择前置任务上传到腾讯云的证书',
component: {
name: 'pi-output-selector',
name: 'output-selector',
from: 'UploadCertToTencent',
},
required: true,
@@ -29,7 +29,7 @@ export class DeployToEOPlugin extends AbstractTaskPlugin {
title: 'Access提供者',
helper: 'access 授权',
component: {
name: 'pi-access-selector',
name: 'access-selector',
type: 'tencent',
},
required: true,
@@ -21,7 +21,7 @@ export class UploadToTencentPlugin extends AbstractTaskPlugin {
title: 'Access授权',
helper: 'access授权',
component: {
name: 'pi-access-selector',
name: 'access-selector',
type: 'tencent',
},
required: true,
@@ -32,7 +32,7 @@ export class UploadToTencentPlugin extends AbstractTaskPlugin {
title: '域名证书',
helper: '请选择前置任务输出的域名证书',
component: {
name: 'pi-output-selector',
name: 'output-selector',
from: ['CertApply', 'CertApplyLego'],
},
required: true,
@@ -97,7 +97,8 @@ export class WestDnsProvider extends AbstractDnsProvider<westRecord> {
* @param options
*/
async removeRecord(options: RemoveRecordOptions<westRecord>): Promise<void> {
const { fullRecord, value, record, domain } = options;
const { fullRecord, value, domain } = options.recordReq;
const record = options.recordRes;
this.logger.info('删除域名解析:', fullRecord, value, record);
if (!record) {
this.logger.info('record不存在');