diff --git a/internal/certapply/config.go b/internal/certapply/config.go
index d47753fb5..a8c36501f 100644
--- a/internal/certapply/config.go
+++ b/internal/certapply/config.go
@@ -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",
diff --git a/internal/domain/access.go b/internal/domain/access.go
index ceb569b8f..e801109a4 100644
--- a/internal/domain/access.go
+++ b/internal/domain/access.go
@@ -220,6 +220,10 @@ type AccessConfigForGoEdge struct {
AllowInsecureConnections bool `json:"allowInsecureConnections,omitempty"`
}
+type AccessConfigForGlobalSignAtlas struct {
+ AccessConfigForACMEExternalAccountBinding
+}
+
type AccessConfigForGoogleTrustServices struct {
AccessConfigForACMEExternalAccountBinding
}
diff --git a/internal/domain/provider.go b/internal/domain/provider.go
index 4562fda9a..f421d6d44 100644
--- a/internal/domain/provider.go
+++ b/internal/domain/provider.go
@@ -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)
diff --git a/ui/public/imgs/providers/globalsignatlas.png b/ui/public/imgs/providers/globalsignatlas.png
new file mode 100644
index 000000000..a248c3249
Binary files /dev/null and b/ui/public/imgs/providers/globalsignatlas.png differ
diff --git a/ui/src/components/access/AccessForm.tsx b/ui/src/components/access/AccessForm.tsx
index 69112aa59..f868803fa 100644
--- a/ui/src/components/access/AccessForm.tsx
+++ b/ui/src/components/access/AccessForm.tsx
@@ -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 ;
}
+ case ACCESS_PROVIDERS.GLOBALSIGNATLAS: {
+ return ;
+ }
case ACCESS_PROVIDERS.GOOGLETRUSTSERVICES: {
return ;
}
diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderGlobalSignAtlas.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderGlobalSignAtlas.tsx
new file mode 100644
index 000000000..076d28b80
--- /dev/null
+++ b/ui/src/components/access/forms/AccessConfigFieldsProviderGlobalSignAtlas.tsx
@@ -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 (
+ <>
+
}
+ >
+
+
+
+ }
+ >
+
+
+ >
+ );
+};
+
+const getInitialValues = (): Nullish>> => {
+ return {
+ eabKid: "",
+ eabHmacKey: "",
+ };
+};
+
+const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) => {
+ 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;
diff --git a/ui/src/domain/provider.ts b/ui/src/domain/provider.ts
index e5370d3c6..1c2350574 100644
--- a/ui/src/domain/provider.ts
+++ b/ui/src/domain/provider.ts
@@ -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 = new
[CA_PROVIDERS.LETSENCRYPTSTAGING, "builtin"],
[CA_PROVIDERS.ACTALISSSL],
[CA_PROVIDERS.BUYPASS],
+ [CA_PROVIDERS.GLOBALSIGNATLAS],
[CA_PROVIDERS.GOOGLETRUSTSERVICES],
[CA_PROVIDERS.SSLCOM],
[CA_PROVIDERS.ZEROSSL],
diff --git a/ui/src/i18n/locales/en/nls.access.json b/ui/src/i18n/locales/en/nls.access.json
index bbf441815..886f6a1e7 100644
--- a/ui/src/i18n/locales/en/nls.access.json
+++ b/ui/src/i18n/locales/en/nls.access.json
@@ -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 https://goedge.cloud/docs/API/Auth.md",
+ "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 https://www.globalsign.com/en/acme-automated-certificate-management",
+ "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 https://www.globalsign.com/en/acme-automated-certificate-management",
"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 https://cloud.google.com/certificate-manager/docs/public-ca-tutorial",
diff --git a/ui/src/i18n/locales/en/nls.provider.json b/ui/src/i18n/locales/en/nls.provider.json
index 84b006127..00fd9cc30 100644
--- a/ui/src/i18n/locales/en/nls.provider.json
+++ b/ui/src/i18n/locales/en/nls.provider.json
@@ -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",
diff --git a/ui/src/i18n/locales/zh/nls.access.json b/ui/src/i18n/locales/zh/nls.access.json
index 1cda5e6b8..e55c3aac8 100644
--- a/ui/src/i18n/locales/zh/nls.access.json
+++ b/ui/src/i18n/locales/zh/nls.access.json
@@ -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": "这是什么?请参阅 https://goedge.cloud/docs/API/Auth.md",
+ "access.form.globalsignatlas_eab_kid.label": "ACME EAB KID",
+ "access.form.globalsignatlas_eab_kid.placeholder": "请输入 ACME EAB KID",
+ "access.form.globalsignatlas_eab_kid.tooltip": "这是什么?请参阅 https://globalsign.cn/acme-automated-certificate-management",
+ "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": "这是什么?请参阅 https://globalsign.cn/acme-automated-certificate-management",
"access.form.googletrustservices_eab_kid.label": "ACME EAB KID",
"access.form.googletrustservices_eab_kid.placeholder": "请输入 ACME EAB KID",
"access.form.googletrustservices_eab_kid.tooltip": "这是什么?请参阅 https://cloud.google.com/certificate-manager/docs/public-ca-tutorial",
diff --git a/ui/src/i18n/locales/zh/nls.provider.json b/ui/src/i18n/locales/zh/nls.provider.json
index 8d2c7d469..d18a50aaf 100644
--- a/ui/src/i18n/locales/zh/nls.provider.json
+++ b/ui/src/i18n/locales/zh/nls.provider.json
@@ -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",
diff --git a/ui/src/pages/settings/SettingsSSLProvider.tsx b/ui/src/pages/settings/SettingsSSLProvider.tsx
index 2367c67b6..34ba4bbe8 100644
--- a/ui/src/pages/settings/SettingsSSLProvider.tsx
+++ b/ui/src/pages/settings/SettingsSSLProvider.tsx
@@ -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 ;
case CA_PROVIDERS.BUYPASS:
return ;
+ case CA_PROVIDERS.GLOBALSIGNATLAS:
+ return ;
case CA_PROVIDERS.GOOGLETRUSTSERVICES:
return ;
case CA_PROVIDERS.SSLCOM:
@@ -104,11 +107,9 @@ const SettingsSSLProvider = () => {
{t("settings.sslprovider.ca.title")}
}>
+ } />
+
@@ -265,6 +266,14 @@ const InternalSettingsFormProviderBuypass = () => {
return ;
};
+const InternalSettingsFormProviderGlobalSignAtlas = () => {
+ return (
+
+
+
+ );
+};
+
const InternalSettingsFormProviderGoogleTrustServices = () => {
return (