feat: new ca provider: globalsign atlas

This commit is contained in:
Fu Diwei
2025-09-08 23:29:02 +08:00
parent d2f4117f6f
commit 3ab95db2f3
12 changed files with 114 additions and 6 deletions
+1
View File
@@ -17,6 +17,7 @@ var acmeDirUrls = map[string]string{
string(domain.CAProviderTypeLetsEncryptStaging): "https://acme-staging-v02.api.letsencrypt.org/directory",
string(domain.CAProviderTypeActalisSSL): "https://acme-api.actalis.com/acme/directory",
string(domain.CAProviderTypeBuypass): "https://api.buypass.com/acme/directory",
string(domain.CAProviderTypeGlobalSignAtlas): "https://emea.acme.atlas.globalsign.com/directory",
string(domain.CAProviderTypeGoogleTrustServices): "https://dv.acme-v02.api.pki.goog/directory",
string(domain.CAProviderTypeSSLCom): "https://acme.ssl.com/sslcom-dv-rsa",
string(domain.CAProviderTypeSSLCom) + "RSA": "https://acme.ssl.com/sslcom-dv-rsa",
+4
View File
@@ -220,6 +220,10 @@ type AccessConfigForGoEdge struct {
AllowInsecureConnections bool `json:"allowInsecureConnections,omitempty"`
}
type AccessConfigForGlobalSignAtlas struct {
AccessConfigForACMEExternalAccountBinding
}
type AccessConfigForGoogleTrustServices struct {
AccessConfigForACMEExternalAccountBinding
}
+2
View File
@@ -50,6 +50,7 @@ const (
AccessProviderTypeGcore = AccessProviderType("gcore")
AccessProviderTypeGoDaddy = AccessProviderType("godaddy")
AccessProviderTypeGoEdge = AccessProviderType("goedge")
AccessProviderTypeGlobalSignAtlas = AccessProviderType("globalsignatlas")
AccessProviderTypeGoogleTrustServices = AccessProviderType("googletrustservices")
AccessProviderTypeHetzner = AccessProviderType("hetzner")
AccessProviderTypeHuaweiCloud = AccessProviderType("huaweicloud")
@@ -108,6 +109,7 @@ const (
CAProviderTypeACMECA = CAProviderType(AccessProviderTypeACMECA)
CAProviderTypeActalisSSL = CAProviderType(AccessProviderTypeActalisSSL)
CAProviderTypeBuypass = CAProviderType(AccessProviderTypeBuypass)
CAProviderTypeGlobalSignAtlas = CAProviderType(AccessProviderTypeGlobalSignAtlas)
CAProviderTypeGoogleTrustServices = CAProviderType(AccessProviderTypeGoogleTrustServices)
CAProviderTypeLetsEncrypt = CAProviderType(AccessProviderTypeLetsEncrypt)
CAProviderTypeLetsEncryptStaging = CAProviderType(AccessProviderTypeLetsEncryptStaging)
Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

+4
View File
@@ -45,6 +45,7 @@ import AccessConfigFieldsProviderEdgio from "./forms/AccessConfigFieldsProviderE
import AccessConfigFieldsProviderEmail from "./forms/AccessConfigFieldsProviderEmail";
import AccessConfigFieldsProviderFlexCDN from "./forms/AccessConfigFieldsProviderFlexCDN";
import AccessConfigFieldsProviderGcore from "./forms/AccessConfigFieldsProviderGcore";
import AccessConfigFieldsProviderGlobalSignAtlas from "./forms/AccessConfigFieldsProviderGlobalSignAtlas";
import AccessConfigFieldsProviderGname from "./forms/AccessConfigFieldsProviderGname";
import AccessConfigFieldsProviderGoDaddy from "./forms/AccessConfigFieldsProviderGoDaddy";
import AccessConfigFieldsProviderGoEdge from "./forms/AccessConfigFieldsProviderGoEdge";
@@ -241,6 +242,9 @@ const AccessForm = ({ className, style, disabled, initialValues, mode, usage, ..
case ACCESS_PROVIDERS.GOEDGE: {
return <AccessConfigFieldsProviderGoEdge />;
}
case ACCESS_PROVIDERS.GLOBALSIGNATLAS: {
return <AccessConfigFieldsProviderGlobalSignAtlas />;
}
case ACCESS_PROVIDERS.GOOGLETRUSTSERVICES: {
return <AccessConfigFieldsProviderGoogleTrustServices />;
}
@@ -0,0 +1,70 @@
import { getI18n, useTranslation } from "react-i18next";
import { Form, Input } from "antd";
import { createSchemaFieldRule } from "antd-zod";
import { z } from "zod";
import { useFormNestedFieldsContext } from "./_context";
const AccessConfigFormFieldsProviderGobalSignAtlas = () => {
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, "eabKid"]}
initialValue={initialValues.eabKid}
label={t("access.form.globalsignatlas_eab_kid.label")}
rules={[formRule]}
tooltip={<span dangerouslySetInnerHTML={{ __html: t("access.form.globalsignatlas_eab_kid.tooltip") }}></span>}
>
<Input autoComplete="new-password" placeholder={t("access.form.globalsignatlas_eab_kid.placeholder")} />
</Form.Item>
<Form.Item
name={[parentNamePath, "eabHmacKey"]}
initialValue={initialValues.eabHmacKey}
label={t("access.form.globalsignatlas_eab_hmac_key.label")}
rules={[formRule]}
tooltip={<span dangerouslySetInnerHTML={{ __html: t("access.form.globalsignatlas_eab_hmac_key.tooltip") }}></span>}
>
<Input.Password autoComplete="new-password" placeholder={t("access.form.globalsignatlas_eab_hmac_key.placeholder")} />
</Form.Item>
</>
);
};
const getInitialValues = (): Nullish<z.infer<ReturnType<typeof getSchema>>> => {
return {
eabKid: "",
eabHmacKey: "",
};
};
const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType<typeof getI18n> }) => {
const { t } = i18n;
return z.object({
eabKid: z
.string()
.min(1, t("access.form.globalsignatlas_eab_kid.placeholder"))
.max(256, t("common.errmsg.string_max", { max: 256 })),
eabHmacKey: z
.string()
.min(1, t("access.form.globalsignatlas_eab_hmac_key.placeholder"))
.max(256, t("common.errmsg.string_max", { max: 256 })),
});
};
const _default = Object.assign(AccessConfigFormFieldsProviderGobalSignAtlas, {
getInitialValues,
getSchema,
});
export default _default;
+4
View File
@@ -50,6 +50,7 @@ export const ACCESS_PROVIDERS = Object.freeze({
EMAIL: "email",
FLEXCDN: "flexcdn",
GCORE: "gcore",
GLOBALSIGNATLAS: "globalsignatlas",
GNAME: "gname",
GODADDY: "godaddy",
GOEDGE: "goedge",
@@ -191,6 +192,7 @@ export const accessProvidersMap: Map<AccessProvider["type"] | string, AccessProv
[ACCESS_PROVIDERS.LETSENCRYPTSTAGING, "provider.letsencryptstaging", "/imgs/providers/letsencrypt.svg", [ACCESS_USAGES.CA], "builtin"],
[ACCESS_PROVIDERS.ACTALISSSL, "provider.actalisssl", "/imgs/providers/actalisssl.png", [ACCESS_USAGES.CA]],
[ACCESS_PROVIDERS.BUYPASS, "provider.buypass", "/imgs/providers/buypass.png", [ACCESS_USAGES.CA]],
[ACCESS_PROVIDERS.GLOBALSIGNATLAS, "provider.globalsignatlas", "/imgs/providers/globalsignatlas.png", [ACCESS_USAGES.CA]],
[ACCESS_PROVIDERS.GOOGLETRUSTSERVICES, "provider.googletrustservices", "/imgs/providers/google.svg", [ACCESS_USAGES.CA]],
[ACCESS_PROVIDERS.SSLCOM, "provider.sslcom", "/imgs/providers/sslcom.svg", [ACCESS_USAGES.CA]],
[ACCESS_PROVIDERS.ZEROSSL, "provider.zerossl", "/imgs/providers/zerossl.svg", [ACCESS_USAGES.CA]],
@@ -227,6 +229,7 @@ export const CA_PROVIDERS = Object.freeze({
ACMECA: `${ACCESS_PROVIDERS.ACMECA}`,
ACTALISSSL: `${ACCESS_PROVIDERS.ACTALISSSL}`,
BUYPASS: `${ACCESS_PROVIDERS.BUYPASS}`,
GLOBALSIGNATLAS: `${ACCESS_PROVIDERS.GLOBALSIGNATLAS}`,
GOOGLETRUSTSERVICES: `${ACCESS_PROVIDERS.GOOGLETRUSTSERVICES}`,
LETSENCRYPT: `${ACCESS_PROVIDERS.LETSENCRYPT}`,
LETSENCRYPTSTAGING: `${ACCESS_PROVIDERS.LETSENCRYPTSTAGING}`,
@@ -249,6 +252,7 @@ export const caProvidersMap: Map<CAProvider["type"] | string, CAProvider> = new
[CA_PROVIDERS.LETSENCRYPTSTAGING, "builtin"],
[CA_PROVIDERS.ACTALISSSL],
[CA_PROVIDERS.BUYPASS],
[CA_PROVIDERS.GLOBALSIGNATLAS],
[CA_PROVIDERS.GOOGLETRUSTSERVICES],
[CA_PROVIDERS.SSLCOM],
[CA_PROVIDERS.ZEROSSL],
+6
View File
@@ -284,6 +284,12 @@
"access.form.goedge_access_key.label": "GoEdge AccessKey",
"access.form.goedge_access_key.placeholder": "Please enter GoEdge AccessKey",
"access.form.goedge_access_key.tooltip": "For more information, see <a href=\"https://goedge.cloud/docs/API/Auth.md\" target=\"_blank\">https://goedge.cloud/docs/API/Auth.md</a>",
"access.form.globalsignatlas_eab_kid.label": "ACME EAB KID",
"access.form.globalsignatlas_eab_kid.placeholder": "Please enter ACME EAB KID",
"access.form.globalsignatlas_eab_kid.tooltip": "For more information, see <a href=\"https://www.globalsign.com/en/acme-automated-certificate-management\" target=\"_blank\">https://www.globalsign.com/en/acme-automated-certificate-management</a>",
"access.form.globalsignatlas_eab_hmac_key.label": "ACME EAB HMAC key",
"access.form.globalsignatlas_eab_hmac_key.placeholder": "Please enter ACME EAB HMAC key",
"access.form.globalsignatlas_eab_hmac_key.tooltip": "For more information, see <a href=\"https://www.globalsign.com/en/acme-automated-certificate-management\" target=\"_blank\">https://www.globalsign.com/en/acme-automated-certificate-management</a>",
"access.form.googletrustservices_eab_kid.label": "ACME EAB KID",
"access.form.googletrustservices_eab_kid.placeholder": "Please enter ACME EAB KID",
"access.form.googletrustservices_eab_kid.tooltip": "For more information, see <a href=\"https://cloud.google.com/certificate-manager/docs/public-ca-tutorial\" target=\"_blank\">https://cloud.google.com/certificate-manager/docs/public-ca-tutorial</a>",
+1
View File
@@ -86,6 +86,7 @@
"provider.flexcdn": "FlexCDN",
"provider.gcore": "Gcore",
"provider.gcore.cdn": "Gcore - CDN (Content Delivery Network)",
"provider.globalsignatlas": "GlobalSign Atlas",
"provider.gname": "GNAME",
"provider.godaddy": "GoDaddy",
"provider.goedge": "GoEdge",
+6
View File
@@ -283,6 +283,12 @@
"access.form.goedge_access_key.label": "GoEdge AccessKey",
"access.form.goedge_access_key.placeholder": "请输入 GoEdge AccessKey",
"access.form.goedge_access_key.tooltip": "这是什么?请参阅 <a href=\"https://goedge.cloud/docs/API/Auth.md\" target=\"_blank\">https://goedge.cloud/docs/API/Auth.md</a>",
"access.form.globalsignatlas_eab_kid.label": "ACME EAB KID",
"access.form.globalsignatlas_eab_kid.placeholder": "请输入 ACME EAB KID",
"access.form.globalsignatlas_eab_kid.tooltip": "这是什么?请参阅 <a href=\"https://globalsign.cn/acme-automated-certificate-management\" target=\"_blank\">https://globalsign.cn/acme-automated-certificate-management</a>",
"access.form.globalsignatlas_eab_hmac_key.label": "ACME EAB HMAC Key",
"access.form.globalsignatlas_eab_hmac_key.placeholder": "请输入 ACME EAB HMAC Key",
"access.form.globalsignatlas_eab_hmac_key.tooltip": "这是什么?请参阅 <a href=\"https://globalsign.cn/acme-automated-certificate-management\" target=\"_blank\">https://globalsign.cn/acme-automated-certificate-management</a>",
"access.form.googletrustservices_eab_kid.label": "ACME EAB KID",
"access.form.googletrustservices_eab_kid.placeholder": "请输入 ACME EAB KID",
"access.form.googletrustservices_eab_kid.tooltip": "这是什么?请参阅 <a href=\"https://cloud.google.com/certificate-manager/docs/public-ca-tutorial\" target=\"_blank\">https://cloud.google.com/certificate-manager/docs/public-ca-tutorial</a>",
+1
View File
@@ -86,6 +86,7 @@
"provider.flexcdn": "FlexCDN",
"provider.gcore": "Gcore",
"provider.gcore.cdn": "Gcore - 内容分发网络 CDN",
"provider.globalsignatlas": "GlobalSign Atlas",
"provider.gname": "GNAME",
"provider.godaddy": "GoDaddy",
"provider.goedge": "GoEdge",
+15 -6
View File
@@ -1,6 +1,6 @@
import { createContext, useContext, useEffect, useMemo, useState } from "react";
import { useTranslation } from "react-i18next";
import { App, Button, Card, Form, Input, Skeleton, Typography } from "antd";
import { App, Button, Card, Form, Input, Skeleton } from "antd";
import { createSchemaFieldRule } from "antd-zod";
import { produce } from "immer";
import { z } from "zod";
@@ -43,6 +43,7 @@ const SettingsSSLProvider = () => {
[CA_PROVIDERS.LETSENCRYPTSTAGING, "provider.letsencryptstaging", "letsencrypt.org", "/imgs/providers/letsencrypt.svg"],
[CA_PROVIDERS.ACTALISSSL, "provider.actalisssl", "actalis.com", "/imgs/providers/actalisssl.png"],
[CA_PROVIDERS.BUYPASS, "provider.buypass", "buypass.com", "/imgs/providers/buypass.png"],
[CA_PROVIDERS.GLOBALSIGNATLAS, "provider.globalsignatlas", "atlas.globalsign.com", "/imgs/providers/globalsignatlas.png"],
[CA_PROVIDERS.GOOGLETRUSTSERVICES, "provider.googletrustservices", "pki.goog", "/imgs/providers/google.svg"],
[CA_PROVIDERS.SSLCOM, "provider.sslcom", "ssl.com", "/imgs/providers/sslcom.svg"],
[CA_PROVIDERS.ZEROSSL, "provider.zerossl", "zerossl.com", "/imgs/providers/zerossl.svg"],
@@ -66,6 +67,8 @@ const SettingsSSLProvider = () => {
return <InternalSettingsFormProviderActalisSSL />;
case CA_PROVIDERS.BUYPASS:
return <InternalSettingsFormProviderBuypass />;
case CA_PROVIDERS.GLOBALSIGNATLAS:
return <InternalSettingsFormProviderGlobalSignAtlas />;
case CA_PROVIDERS.GOOGLETRUSTSERVICES:
return <InternalSettingsFormProviderGoogleTrustServices />;
case CA_PROVIDERS.SSLCOM:
@@ -104,11 +107,9 @@ const SettingsSSLProvider = () => {
<h2>{t("settings.sslprovider.ca.title")}</h2>
<Show when={!loading} fallback={<Skeleton active />}>
<Form form={formInst} disabled={formPending} layout="vertical" initialValues={{ provider: providerValue }}>
<div className="mb-2">
<Typography.Text type="secondary">
<span dangerouslySetInnerHTML={{ __html: t("settings.sslprovider.ca.tips") }}></span>
</Typography.Text>
</div>
<Form.Item>
<Tips message={<span dangerouslySetInnerHTML={{ __html: t("settings.sslprovider.ca.tips") }}></span>} />
</Form.Item>
<Form.Item name="provider" label={t("settings.sslprovider.form.provider.label")} extra={t("settings.sslprovider.form.provider.help")}>
<div className="flex w-full flex-wrap items-center gap-4">
@@ -265,6 +266,14 @@ const InternalSettingsFormProviderBuypass = () => {
return <InternalSharedForm provider={CA_PROVIDERS.BUYPASS} />;
};
const InternalSettingsFormProviderGlobalSignAtlas = () => {
return (
<InternalSharedForm provider={CA_PROVIDERS.GLOBALSIGNATLAS}>
<InternalSharedFormEabFields i18nKey="globalsignatlas" />
</InternalSharedForm>
);
};
const InternalSettingsFormProviderGoogleTrustServices = () => {
return (
<InternalSharedForm provider={CA_PROVIDERS.GOOGLETRUSTSERVICES}>