feat(provider): new acme dns-01 provider: yandexcloud

This commit is contained in:
Fu Diwei
2026-07-29 17:07:58 +08:00
committed by RHQYZ
parent 1f1b45767a
commit cb7e388bd3
17 changed files with 214 additions and 13 deletions
+9
View File
@@ -203,6 +203,7 @@ require (
github.com/fsnotify/fsnotify v1.10.1 // indirect
github.com/gabriel-vasile/mimetype v1.4.13 // indirect
github.com/ganigeorgiev/fexpr v0.5.0 // indirect
github.com/ghodss/yaml v1.0.0 // indirect
github.com/go-acme/alidns-20150109/v5 v5.4.1 // indirect
github.com/go-acme/esa-20240910/v3 v3.2.2 // indirect
github.com/go-acme/jdcloud-sdk-go v1.64.0 // indirect
@@ -212,6 +213,8 @@ require (
github.com/go-ozzo/ozzo-validation/v4 v4.3.0 // indirect
github.com/go-test/deep v1.1.1 // indirect
github.com/gofrs/flock v0.13.0 // indirect
github.com/golang-jwt/jwt/v4 v4.5.2 // indirect
github.com/golang/protobuf v1.5.4 // indirect
github.com/google/s2a-go v0.1.9 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/googleapis/enterprise-certificate-proxy v0.3.17 // indirect
@@ -254,6 +257,9 @@ require (
github.com/spf13/cast v1.10.0 // indirect
github.com/tinylib/msgp v1.6.4 // indirect
github.com/tjfoc/gmsm v1.4.1 // indirect
github.com/yandex-cloud/go-genproto v0.84.0 // indirect
github.com/yandex-cloud/go-sdk/services/dns v0.0.65 // indirect
github.com/yandex-cloud/go-sdk/v2 v2.114.0 // indirect
github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect
github.com/zeebo/xxh3 v1.1.0 // indirect
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
@@ -261,6 +267,8 @@ require (
go.opentelemetry.io/otel v1.43.0 // indirect
go.opentelemetry.io/otel/metric v1.43.0 // indirect
go.opentelemetry.io/otel/trace v1.43.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.27.0 // indirect
golang.org/x/image v0.41.0 // indirect
golang.org/x/mod v0.37.0 // indirect
golang.org/x/net v0.56.0 // indirect
@@ -268,6 +276,7 @@ require (
golang.org/x/text v0.40.0 // indirect
golang.org/x/time v0.15.0 // indirect
golang.org/x/tools v0.47.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20260630182238-925bb5da69e7 // indirect
google.golang.org/grpc v1.82.0 // indirect
google.golang.org/protobuf v1.36.11 // indirect
+17
View File
@@ -349,6 +349,7 @@ github.com/gabriel-vasile/mimetype v1.4.13 h1:46nXokslUBsAJE/wMsp5gtO500a4F3Nkz9
github.com/gabriel-vasile/mimetype v1.4.13/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s=
github.com/ganigeorgiev/fexpr v0.5.0 h1:XA9JxtTE/Xm+g/JFI6RfZEHSiQlk+1glLvRK1Lpv/Tk=
github.com/ganigeorgiev/fexpr v0.5.0/go.mod h1:RyGiGqmeXhEQ6+mlGdnUleLHgtzzu/VGO2WtJkF5drE=
github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/go-acme/alidns-20150109/v5 v5.4.1 h1:Bp+EDtIGxBVKnIq1hPECBFf6eueTiESYqsHkY+T+CIQ=
github.com/go-acme/alidns-20150109/v5 v5.4.1/go.mod h1:L+SrZRmoQFx2UzOqng3z3+LA/gNgFCaLXrwr/ndyW6g=
@@ -448,6 +449,8 @@ github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRx
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI=
github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
github.com/golang-jwt/jwt/v5 v5.3.1 h1:kYf81DTWFe7t+1VvL7eS+jKFVWaUnK9cB1qbwn63YCY=
github.com/golang-jwt/jwt/v5 v5.3.1/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE=
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
@@ -704,6 +707,8 @@ github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXx
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU=
github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8=
github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
@@ -948,6 +953,12 @@ github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6
github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM=
github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc=
github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU=
github.com/yandex-cloud/go-genproto v0.84.0 h1:lzptMyo1wleGBGNkkEb8bzpgbnW3xPlha0f94g4prBE=
github.com/yandex-cloud/go-genproto v0.84.0/go.mod h1:0LDD/IZLIUIV4iPH+YcF+jysO3jkSvADFGm4dCAuwQo=
github.com/yandex-cloud/go-sdk/services/dns v0.0.65 h1:7jhZMHsK1GThGzAKC7Mjq8wu/Xbr/TbhRUoNFzot4K4=
github.com/yandex-cloud/go-sdk/services/dns v0.0.65/go.mod h1:Qm5HbUbmFI2Y8eDv8tcwr7OHgNumHuN/RtK3icd3bYU=
github.com/yandex-cloud/go-sdk/v2 v2.114.0 h1:gx03giWYrzMhgpFK4NJNuOnASSgdCuv4nkLUFejnCSs=
github.com/yandex-cloud/go-sdk/v2 v2.114.0/go.mod h1:XrF79/a3olVf0YUUCMYePI8Ik0m4KDcQlTooHGGZJB0=
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 h1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM=
github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI=
@@ -1000,12 +1011,18 @@ go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak=
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
go.uber.org/ratelimit v0.3.1 h1:K4qVE+byfv/B3tC+4nYWP7v/6SimcO7HzHekoMNBma0=
go.uber.org/ratelimit v0.3.1/go.mod h1:6euWsTB6U/Nb3X++xEUXA8ciPJvr19Q/0h1+oDcJhRk=
go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI=
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ=
go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ=
go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=
@@ -0,0 +1,29 @@
package certifiers
import (
"fmt"
"github.com/certimate-go/certimate/internal/domain"
"github.com/certimate-go/certimate/pkg/core"
chlgimpl "github.com/certimate-go/certimate/pkg/core/certifier/challengers/dns01/yandexcloud"
xmaps "github.com/certimate-go/certimate/pkg/utils/maps"
)
func init() {
ACMEDns01Registries.MustRegister(domain.ACMEDns01ProviderTypeYandexCloudDNS, func(options *ProviderFactoryOptions) (core.ACMEChallenger, error) {
credentials := domain.AccessConfigForYandexCloud{}
if err := xmaps.Populate(options.ProviderAccessConfig, &credentials); err != nil {
return nil, fmt.Errorf("failed to populate provider access config: %w", err)
}
provider, err := chlgimpl.NewChallenger(&chlgimpl.ChallengerConfig{
FolderId: credentials.FolderId,
ServiceAccountKey: credentials.ServiceAccountKey,
DnsPropagationTimeout: options.DnsPropagationTimeout,
DnsTTL: options.DnsTTL,
})
return provider, err
})
ACMEDns01Registries.MustRegisterAlias(domain.ACMEDns01ProviderTypeYandexCloud, domain.ACMEDns01ProviderTypeYandexCloudDNS)
}
+5
View File
@@ -688,6 +688,11 @@ type AccessConfigForXinnet struct {
ApiPassword string `json:"apiPassword"`
}
type AccessConfigForYandexCloud struct {
FolderId string `json:"folderId"`
ServiceAccountKey string `json:"serviceAccountKey"`
}
type AccessConfigForZenlayer struct {
AccessKeyId string `json:"accessKeyId"`
AccessKeyPassword string `json:"accessKeyPassword"`
+3
View File
@@ -136,6 +136,7 @@ const (
AccessProviderTypeWeComBot = AccessProviderType("wecombot")
AccessProviderTypeWestcn = AccessProviderType("westcn")
AccessProviderTypeXinnet = AccessProviderType("xinnet")
AccessProviderTypeYandexCloud = AccessProviderType("yandexcloud")
AccessProviderTypeZenlayer = AccessProviderType("zenlayer")
AccessProviderTypeZeroSSL = AccessProviderType("zerossl")
)
@@ -275,6 +276,8 @@ const (
ACMEDns01ProviderTypeVultr = ACMEDns01ProviderType(AccessProviderTypeVultr)
ACMEDns01ProviderTypeWestcn = ACMEDns01ProviderType(AccessProviderTypeWestcn)
ACMEDns01ProviderTypeXinnet = ACMEDns01ProviderType(AccessProviderTypeXinnet)
ACMEDns01ProviderTypeYandexCloud = ACMEDns01ProviderType(AccessProviderTypeYandexCloud) // 兼容旧值,等同于 [ACMEDns01ProviderTypeYandexCloudDNS]
ACMEDns01ProviderTypeYandexCloudDNS = ACMEDns01ProviderType(AccessProviderTypeYandexCloud + "-dns")
)
type ACMEHttp01ProviderType ACMEChallengeProviderType
@@ -0,0 +1,41 @@
package yandexcloud
import (
"encoding/base64"
"fmt"
"time"
"github.com/go-acme/lego/v5/providers/dns/yandexcloud"
"github.com/certimate-go/certimate/pkg/core"
)
type ChallengerConfig struct {
FolderId string `json:"folderId"`
ServiceAccountKey string `json:"serviceAccountKey"`
DnsPropagationTimeout int `json:"dnsPropagationTimeout,omitempty"`
DnsTTL int `json:"dnsTTL,omitempty"`
}
func NewChallenger(config *ChallengerConfig) (core.ACMEChallenger, error) {
if config == nil {
return nil, fmt.Errorf("the configuration of the acme challenge provider is nil")
}
providerConfig := yandexcloud.NewDefaultConfig()
providerConfig.FolderID = config.FolderId
providerConfig.IamToken = base64.StdEncoding.EncodeToString([]byte(config.ServiceAccountKey))
if config.DnsPropagationTimeout != 0 {
providerConfig.PropagationTimeout = time.Duration(config.DnsPropagationTimeout) * time.Second
}
if config.DnsTTL != 0 {
providerConfig.TTL = config.DnsTTL
}
provider, err := yandexcloud.NewDNSProviderConfig(providerConfig)
if err != nil {
return nil, err
}
return provider, nil
}
+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200" fill="currentColor"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 32 32"><path fill="#2a9fff" d="M23.858 27.411c-2.813 1.925-6.204 1.825-13.01 1.866l-5.403-.01 2.734-7.362 4.05-.008c3.295.008 5.26-.242 6.86-1.387 1.555-1.114 2.503-2.828 3.642-5.919l1.415-3.795L32 10.793l-1.885 5.048c-2.39 6.389-3.475 9.603-6.257 11.57M8.142 4.589c2.813-1.925 6.204-1.825 13.01-1.866l5.403.01-2.734 7.362-4.05.008c-3.294-.008-5.26.242-6.86 1.387-1.555 1.114-2.503 2.828-3.642 5.919l-1.415 3.795L0 21.207l1.885-5.048C4.275 9.77 5.36 6.556 8.142 4.59"/></svg></svg>

After

Width:  |  Height:  |  Size: 632 B

@@ -120,6 +120,7 @@ import AccessConfigFieldsProviderWebhook from "./AccessConfigFieldsProviderWebho
import AccessConfigFieldsProviderWeComBot from "./AccessConfigFieldsProviderWeComBot";
import AccessConfigFieldsProviderWestcn from "./AccessConfigFieldsProviderWestcn";
import AccessConfigFieldsProviderXinnet from "./AccessConfigFieldsProviderXinnet";
import AccessConfigFieldsProviderYandexCloud from "./AccessConfigFieldsProviderYandexCloud";
import AccessConfigFieldsProviderZenlayer from "./AccessConfigFieldsProviderZenlayer";
import AccessConfigFieldsProviderZeroSSL from "./AccessConfigFieldsProviderZeroSSL";
@@ -246,6 +247,7 @@ const providerComponentMap: Partial<Record<AccessProviderType, React.ComponentTy
[ACCESS_PROVIDERS.WECOMBOT]: AccessConfigFieldsProviderWeComBot,
[ACCESS_PROVIDERS.WESTCN]: AccessConfigFieldsProviderWestcn,
[ACCESS_PROVIDERS.XINNET]: AccessConfigFieldsProviderXinnet,
[ACCESS_PROVIDERS.YANDEXCLOUD]: AccessConfigFieldsProviderYandexCloud,
[ACCESS_PROVIDERS.ZENLAYER]: AccessConfigFieldsProviderZenlayer,
[ACCESS_PROVIDERS.ZEROSSL]: AccessConfigFieldsProviderZeroSSL,
};
@@ -25,6 +25,7 @@ const AccessConfigFieldsProviderGoogleCloud = () => {
initialValue={initialValues.projectId}
label={t("access.form.googlecloud_project_id.label")}
rules={[formRule]}
tooltip={<span dangerouslySetInnerHTML={{ __html: t("access.form.googlecloud_project_id.tooltip") }}></span>}
>
<Input type="url" placeholder={t("access.form.googlecloud_project_id.placeholder")} />
</Form.Item>
@@ -0,0 +1,67 @@
import { getI18n, useTranslation } from "react-i18next";
import { Form, Input } from "antd";
import { createSchemaFieldRule } from "antd-zod";
import { z } from "zod";
import FileTextInput from "@/components/FileTextInput";
import { isJsonObject } from "@/utils/validator";
import { useFormNestedFieldsContext } from "./_context";
const AccessConfigFieldsProviderYandexCloud = () => {
const { i18n, t } = useTranslation();
const { parentNamePath } = useFormNestedFieldsContext();
const formSchema = z.object({
[parentNamePath]: getSchema({ i18n }),
});
const formRule = createSchemaFieldRule(formSchema);
const initialValues = getInitialValues();
return (
<>
<Form.Item
name={[parentNamePath, "folderId"]}
initialValue={initialValues.folderId}
label={t("access.form.yandexcloud_folder_id.label")}
rules={[formRule]}
tooltip={<span dangerouslySetInnerHTML={{ __html: t("access.form.yandexcloud_folder_id.tooltip") }}></span>}
>
<Input type="url" placeholder={t("access.form.yandexcloud_folder_id.placeholder")} />
</Form.Item>
<Form.Item
name={[parentNamePath, "serviceAccountKey"]}
initialValue={initialValues.serviceAccountKey}
label={t("access.form.yandexcloud_service_account_key.label")}
rules={[formRule]}
tooltip={<span dangerouslySetInnerHTML={{ __html: t("access.form.yandexcloud_service_account_key.tooltip") }}></span>}
>
<FileTextInput autoSize={{ minRows: 3, maxRows: 10 }} placeholder={t("access.form.yandexcloud_service_account_key.placeholder")} />
</Form.Item>
</>
);
};
const getInitialValues = (): Nullish<z.infer<ReturnType<typeof getSchema>>> => {
return {
folderId: "",
serviceAccountKey: "",
};
};
const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType<typeof getI18n> }) => {
const { t } = i18n;
return z.object({
folderId: z.string().nonempty(),
serviceAccountKey: z.string().refine((v) => isJsonObject(v), t("common.errmsg.json_invalid")),
});
};
const _default = Object.assign(AccessConfigFieldsProviderYandexCloud, {
getInitialValues,
getSchema,
});
export default _default;
+2
View File
@@ -136,6 +136,7 @@ export const ACCESS_PROVIDERS = Object.freeze({
WECOMBOT: "wecombot",
WESTCN: "westcn",
XINNET: "xinnet",
YANDEXCLOUD: "yandexcloud",
ZENLAYER: "zenlayer",
ZEROSSL: "zerossl",
} as const);
@@ -257,6 +258,7 @@ export const accessProvidersMap: Map<AccessProvider["type"] | string, AccessProv
[ACCESS_PROVIDERS.SIMPLYCOM, "provider.simplycom", "/imgs/providers/simplycom.png", [ACCESS_USAGES.DNS]],
[ACCESS_PROVIDERS.SPACESHIP, "provider.spaceship", "/imgs/providers/spaceship.png", [ACCESS_USAGES.DNS]],
[ACCESS_PROVIDERS.VULTR, "provider.vultr", "/imgs/providers/vultr.svg", [ACCESS_USAGES.DNS]],
[ACCESS_PROVIDERS.YANDEXCLOUD, "provider.yandexcloud", "/imgs/providers/yandexcloud.svg", [ACCESS_USAGES.DNS]],
[ACCESS_PROVIDERS["35CN"], "provider.35cn", "/imgs/providers/35cn.png", [ACCESS_USAGES.DNS]],
[ACCESS_PROVIDERS["51DNSCOM"], "provider.51dnscom", "/imgs/providers/51dnscom.png", [ACCESS_USAGES.DNS]],
[ACCESS_PROVIDERS.DNSLA, "provider.dnsla", "/imgs/providers/dnsla.svg", [ACCESS_USAGES.DNS]],
+13 -3
View File
@@ -145,7 +145,7 @@
},
"acmedns_credentials": {
"label": "ACME-DNS credentials",
"placeholder": "Please enter ACME-DNS credentials",
"placeholder": "Please enter ACME-DNS credentials\r\n\r\n{\r\n \"allowfrom\": [\r\n \"192.168.100.1/24\",\r\n \"1.2.3.4/32\",\r\n \"2002:c0a8:2a00::0/40\"\r\n ],\r\n \"fulldomain\": \"SUBDOMAIN.auth.acme-dns.io\",\r\n \"subdomain\": \"SUBDOMAIN\",\r\n \"username\": \"USERNAME\",\r\n \"password\": \"PASSWORD\"\r\n}",
"tooltip": "For more information, see <a href=\"https://github.com/joohoi/acme-dns\" target=\"_blank\">https://github.com/joohoi/acme-dns</a>"
},
"acmehttpreq_endpoint": {
@@ -737,7 +737,7 @@
},
"googlecloud_project_id": {
"label": "GCP project ID",
"placeholder": "Please enter GCP project ID",
"placeholder": "Please enter GCP project ID\r\n\r\n{\r\n \"name\": \"projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_EMAIL/keys/KEY_ID\",\r\n \"privateKeyType\": \"TYPE_GOOGLE_CREDENTIALS_FILE\",\r\n \"privateKeyData\": \"ENCODED_PRIVATE_KEY\",\r\n \"validAfterTime\": \"DATE\",\r\n \"validBeforeTime\": \"DATE\",\r\n \"keyAlgorithm\": \"KEY_ALG_RSA_2048\"\r\n}",
"tooltip": "For more information, see <a href=\"https://docs.cloud.google.com/resource-manager/docs/creating-managing-projects\" target=\"_blank\">https://docs.cloud.google.com/resource-manager/docs/creating-managing-projects</a>"
},
"googlecloud_service_account_key": {
@@ -1353,7 +1353,7 @@
},
"ssh_key": {
"label": "SSH key",
"placeholder": "Please enter SSH key"
"placeholder": "Please enter SSH key\r\n\r\n-----BEGIN OPENSSH PRIVATE KEY-----\r\n...\r\n-----END OPENSSH PRIVATE KEY-----"
},
"ssh_key_passphrase": {
"label": "SSH key passphrase (Optional)",
@@ -1586,6 +1586,16 @@
"xinnet_agent": {
"guide": "Xinnet.com API only supports calls from agents. Learn more about this: <br><a href=\"https://apidoc.xin.cn/doc-7283837\" target=\"_blank\">https://apidoc.xin.cn/doc-7283837</a>"
},
"yandexcloud_folder_id": {
"label": "Yandex Cloud folder ID",
"placeholder": "Please enter Yandex Cloud folder ID",
"tooltip": "For more information, see <a href=\"https://yandex.cloud/en/docs/resource-manager/operations/folder/get-id\" target=\"_blank\">https://yandex.cloud/en/docs/resource-manager/operations/folder/get-id</a>"
},
"yandexcloud_service_account_key": {
"label": "Yandex Cloud service account authorized key",
"placeholder": "Please enter Yandex Cloud service account authorized key\r\n\r\n{\r\n \"id\": \"AUTHORIZED_KEY_ID\",\r\n \"service_account_id\": \"SERVICE_ACCOUNT_ID\",\r\n \"created_at\": \"DATE\",\r\n \"key_algorithm\": \"RSA_2048\",\r\n \"public_key\": \"ENCODED_PUBLIC_KEY\",\r\n \"private_key\": \"ENCODED_PRIVATE_KEY\"\r\n}",
"tooltip": "For more information, see <a href=\"https://yandex.cloud/en/docs/iam/operations/authentication/manage-authorized-keys\" target=\"_blank\">https://yandex.cloud/en/docs/iam/operations/authentication/manage-authorized-keys</a>"
},
"zenlayer_access_key_id": {
"label": "Zenlayer AccessKeyID",
"placeholder": "Please enter Zenlayer AccessKeyID",
@@ -298,6 +298,8 @@
"wecombot": "WeCom Bot",
"westcn": "West.cn",
"xinnet": "Xinnet.com",
"yandexcloud": "Yandex Cloud",
"yandexcloud_dns": "Yandex Cloud - DNS",
"zerossl": "ZeroSSL",
"zenlayer": "Zenlayer",
"zenlayer_cdn": "Zenlayer - CDN (Content Delivery Network)",
@@ -183,7 +183,7 @@
},
"key_content": {
"label": "Private key (PEM format)",
"placeholder": "-----BEGIN (RSA|EC) PRIVATE KEY-----...-----END(RSA|EC) PRIVATE KEY-----",
"placeholder": "Please enter private key\r\n\r\n-----BEGIN (RSA|EC) PRIVATE KEY-----\r\n...\r\n-----END (RSA|EC) PRIVATE KEY-----",
"errmsg": {
"invalid": "Invalid PEM private key",
"not_matched": "Private key does not match the key algorithm (Expected: {{expected}}, Actual: {{actual}})"
@@ -375,11 +375,11 @@
},
"name": {
"label": "Domains / IP addresses",
"placholder": "Please select certificate file"
"placeholder": "Please select certificate file"
},
"certificate_pem": {
"label": "Certificate (PEM format)",
"placeholder": "-----BEGIN CERTIFICATE-----...-----END CERTIFICATE-----",
"placeholder": "Please enter certificate\r\n\r\n-----BEGIN CERTIFICATE-----\r\n...\r\n-----END CERTIFICATE-----",
"errmsg": {
"invalid": "Invalid PEM certificate"
}
@@ -394,7 +394,7 @@
},
"private_key_pem": {
"label": "Private key (PEM format)",
"placeholder": "-----BEGIN (RSA|EC) PRIVATE KEY-----...-----END(RSA|EC) PRIVATE KEY-----",
"placeholder": "Please enter private key\r\n\r\n-----BEGIN (RSA|EC) PRIVATE KEY-----\r\n...\r\n-----END (RSA|EC) PRIVATE KEY-----",
"errmsg": {
"invalid": "Invalid PEM private key"
}
+13 -3
View File
@@ -145,7 +145,7 @@
},
"acmedns_credentials": {
"label": "ACME-DNS 凭证文件",
"placeholder": "请输入 ACME-DNS 凭证文件",
"placeholder": "请输入 ACME-DNS 凭证文件\r\n\r\n{\r\n \"allowfrom\": [\r\n \"192.168.100.1/24\",\r\n \"1.2.3.4/32\",\r\n \"2002:c0a8:2a00::0/40\"\r\n ],\r\n \"fulldomain\": \"SUBDOMAIN.auth.acme-dns.io\",\r\n \"subdomain\": \"SUBDOMAIN\",\r\n \"username\": \"USERNAME\",\r\n \"password\": \"PASSWORD\"\r\n}",
"tooltip": "这是什么?请参阅 <a href=\"https://github.com/joohoi/acme-dns\" target=\"_blank\">https://github.com/joohoi/acme-dns</a>"
},
"acmehttpreq_endpoint": {
@@ -742,7 +742,7 @@
},
"googlecloud_service_account_key": {
"label": "GCP 服务账号密钥",
"placeholder": "请输入 GCP 服务账号密钥",
"placeholder": "请输入 GCP 服务账号密钥\r\n\r\n{\r\n \"name\": \"projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_EMAIL/keys/KEY_ID\",\r\n \"privateKeyType\": \"TYPE_GOOGLE_CREDENTIALS_FILE\",\r\n \"privateKeyData\": \"ENCODED_PRIVATE_KEY\",\r\n \"validAfterTime\": \"DATE\",\r\n \"validBeforeTime\": \"DATE\",\r\n \"keyAlgorithm\": \"KEY_ALG_RSA_2048\"\r\n}",
"tooltip": "这是什么?请参阅 <a href=\"https://docs.cloud.google.com/iam/docs/keys-create-delete?hl=zh-cn\" target=\"_blank\">https://docs.cloud.google.com/iam/docs/keys-create-delete</a>"
},
"googletrustservices_eab": {
@@ -1353,7 +1353,7 @@
},
"ssh_key": {
"label": "SSH 密钥",
"placeholder": "请输入 SSH 密钥文件内容"
"placeholder": "请输入 SSH 密钥文件内容\r\n\r\n-----BEGIN OPENSSH PRIVATE KEY-----\r\n...\r\n-----END OPENSSH PRIVATE KEY-----"
},
"ssh_key_passphrase": {
"label": "SSH 密钥口令(可选)",
@@ -1585,6 +1585,16 @@
"xinnet_agent": {
"guide": "新网数码 API 仅支持代理商调用。点击下方链接了解更多:<br><a href=\"https://apidoc.xin.cn/doc-7283837\" target=\"_blank\">https://apidoc.xin.cn/doc-7283837</a>"
},
"yandexcloud_folder_id": {
"label": "Yandex Cloud 项目文件夹 ID",
"placeholder": "请输入 Yandex Cloud 项目文件夹 ID",
"tooltip": "这是什么?请参阅 <a href=\"https://yandex.cloud/en/docs/resource-manager/operations/folder/get-id\" target=\"_blank\">https://yandex.cloud/en/docs/resource-manager/operations/folder/get-id</a>"
},
"yandexcloud_service_account_key": {
"label": "Yandex Cloud 服务账号授权密钥",
"placeholder": "请输入Yandex Cloud 服务账号授权密钥\r\n\r\n{\r\n \"id\": \"AUTHORIZED_KEY_ID\",\r\n \"service_account_id\": \"SERVICE_ACCOUNT_ID\",\r\n \"created_at\": \"DATE\",\r\n \"key_algorithm\": \"RSA_2048\",\r\n \"public_key\": \"ENCODED_PUBLIC_KEY\",\r\n \"private_key\": \"ENCODED_PRIVATE_KEY\"\r\n}",
"tooltip": "这是什么?请参阅 <a href=\"https://yandex.cloud/en/docs/iam/operations/authentication/manage-authorized-keys\" target=\"_blank\">https://yandex.cloud/en/docs/iam/operations/authentication/manage-authorized-keys</a>"
},
"zenlayer_access_key_id": {
"label": "Zenlayer AccessKeyID",
"placeholder": "请输入 Zenlayer AccessKeyID",
@@ -298,6 +298,8 @@
"wecombot": "企业微信群机器人",
"westcn": "西部数码",
"xinnet": "新网数码",
"yandexcloud": "Yandex Cloud",
"yandexcloud_dns": "Yandex Cloud - DNS",
"zerossl": "ZeroSSL",
"zenlayer": "Zenlayer",
"zenlayer_cdn": "Zenlayer - 内容分发网络 CDN",
@@ -183,7 +183,7 @@
},
"key_content": {
"label": "私钥文件(PEM 格式)",
"placeholder": "-----BEGIN (RSA|EC) PRIVATE KEY-----...-----END(RSA|EC) PRIVATE KEY-----",
"placeholder": "请输入私钥文件内容\r\n\r\n-----BEGIN (RSA|EC) PRIVATE KEY-----\r\n...\r\n-----END (RSA|EC) PRIVATE KEY-----",
"errmsg": {
"invalid": "无效的 PEM 格式私钥文件",
"not_matched": "私钥内容与算法不匹配(预期:{{expected}},实际:{{actual}})"
@@ -378,7 +378,7 @@
},
"certificate_pem": {
"label": "证书文件(PEM 格式)",
"placeholder": "-----BEGIN CERTIFICATE-----...-----END CERTIFICATE-----",
"placeholder": "请输入证书文件内容\r\n\r\n-----BEGIN CERTIFICATE-----\r\n...\r\n-----END CERTIFICATE-----",
"errmsg": {
"invalid": "无效的 PEM 格式证书文件"
}
@@ -393,7 +393,7 @@
},
"private_key_pem": {
"label": "私钥文件(PEM 格式)",
"placeholder": "-----BEGIN (RSA|EC) PRIVATE KEY-----...-----END(RSA|EC) PRIVATE KEY-----",
"placeholder": "请输入私钥文件内容\r\n\r\n-----BEGIN (RSA|EC) PRIVATE KEY-----\r\n...\r\n-----END (RSA|EC) PRIVATE KEY-----",
"errmsg": {
"invalid": "无效的 PEM 格式私钥文件"
}