Add option to select RSA or ECDSA key type when creating certificates

This commit is contained in:
kk.cheng
2026-01-07 19:07:52 +08:00
parent fec8b3b083
commit 471b62c7fe
17 changed files with 236 additions and 3 deletions

View File

@@ -798,6 +798,11 @@ const internalCertificate = {
certificate.domain_names.join(","), certificate.domain_names.join(","),
]; ];
// Add key-type parameter if specified
if (certificate.meta?.key_type) {
args.push("--key-type", certificate.meta.key_type);
}
const adds = internalCertificate.getAdditionalCertbotArgs(certificate.id); const adds = internalCertificate.getAdditionalCertbotArgs(certificate.id);
args.push(...adds.args); args.push(...adds.args);
@@ -858,6 +863,11 @@ const internalCertificate = {
); );
} }
// Add key-type parameter if specified
if (certificate.meta?.key_type) {
args.push("--key-type", certificate.meta.key_type);
}
const adds = internalCertificate.getAdditionalCertbotArgs(certificate.id, certificate.meta.dns_provider); const adds = internalCertificate.getAdditionalCertbotArgs(certificate.id, certificate.meta.dns_provider);
args.push(...adds.args); args.push(...adds.args);
@@ -938,6 +948,11 @@ const internalCertificate = {
"--disable-hook-validation", "--disable-hook-validation",
]; ];
// Add key-type parameter if specified
if (certificate.meta?.key_type) {
args.push("--key-type", certificate.meta.key_type);
}
const adds = internalCertificate.getAdditionalCertbotArgs(certificate.id, certificate.meta.dns_provider); const adds = internalCertificate.getAdditionalCertbotArgs(certificate.id, certificate.meta.dns_provider);
args.push(...adds.args); args.push(...adds.args);
@@ -979,6 +994,11 @@ const internalCertificate = {
"--no-random-sleep-on-renew", "--no-random-sleep-on-renew",
]; ];
// Add key-type parameter if specified
if (certificate.meta?.key_type) {
args.push("--key-type", certificate.meta.key_type);
}
const adds = internalCertificate.getAdditionalCertbotArgs(certificate.id, certificate.meta.dns_provider); const adds = internalCertificate.getAdditionalCertbotArgs(certificate.id, certificate.meta.dns_provider);
args.push(...adds.args); args.push(...adds.args);

View File

@@ -71,6 +71,11 @@
"propagation_seconds": { "propagation_seconds": {
"type": "integer", "type": "integer",
"minimum": 0 "minimum": 0
},
"key_type": {
"type": "string",
"enum": ["rsa", "ecdsa"],
"default": "rsa"
} }
}, },
"example": { "example": {

View File

@@ -170,6 +170,18 @@
"certificates.http.warning": { "certificates.http.warning": {
"defaultMessage": "Тези домейни трябва вече да сочат към тази инсталация." "defaultMessage": "Тези домейни трябва вече да сочат към тази инсталация."
}, },
"certificates.key-type": {
"defaultMessage": "Тип ключ"
},
"certificates.key-type-description": {
"defaultMessage": "RSA е широко съвместим, ECDSA е по-бърз и по-сигурен, но може да не се поддържа от по-стари системи"
},
"certificates.key-type-ecdsa": {
"defaultMessage": "ECDSA 256"
},
"certificates.key-type-rsa": {
"defaultMessage": "RSA 2048"
},
"certificates.request.subtitle": { "certificates.request.subtitle": {
"defaultMessage": "с Let's Encrypt" "defaultMessage": "с Let's Encrypt"
}, },

View File

@@ -155,6 +155,18 @@
"certificates.http.warning": { "certificates.http.warning": {
"defaultMessage": "Diese Domänen müssen bereits so konfiguriert sein, dass sie auf diese Installation verweisen." "defaultMessage": "Diese Domänen müssen bereits so konfiguriert sein, dass sie auf diese Installation verweisen."
}, },
"certificates.key-type": {
"defaultMessage": "Schlüsseltyp"
},
"certificates.key-type-description": {
"defaultMessage": "RSA ist weit verbreitet, ECDSA ist schneller und sicherer, wird aber möglicherweise von älteren Systemen nicht unterstützt"
},
"certificates.key-type-ecdsa": {
"defaultMessage": "ECDSA 256"
},
"certificates.key-type-rsa": {
"defaultMessage": "RSA 2048"
},
"certificates.request.subtitle": { "certificates.request.subtitle": {
"defaultMessage": "Über Let's Encrypt" "defaultMessage": "Über Let's Encrypt"
}, },

View File

@@ -170,6 +170,18 @@
"certificates.http.warning": { "certificates.http.warning": {
"defaultMessage": "These domains must be already configured to point to this installation." "defaultMessage": "These domains must be already configured to point to this installation."
}, },
"certificates.key-type": {
"defaultMessage": "Key Type"
},
"certificates.key-type-description": {
"defaultMessage": "RSA is widely compatible, ECDSA is faster and more secure but may not be supported by older systems"
},
"certificates.key-type-ecdsa": {
"defaultMessage": "ECDSA 256"
},
"certificates.key-type-rsa": {
"defaultMessage": "RSA 2048"
},
"certificates.request.subtitle": { "certificates.request.subtitle": {
"defaultMessage": "with Let's Encrypt" "defaultMessage": "with Let's Encrypt"
}, },

View File

@@ -170,6 +170,18 @@
"certificates.http.warning": { "certificates.http.warning": {
"defaultMessage": "Estos dominios ya deben estar configurados para apuntar a esta instalación." "defaultMessage": "Estos dominios ya deben estar configurados para apuntar a esta instalación."
}, },
"certificates.key-type": {
"defaultMessage": "Tipo de Clave"
},
"certificates.key-type-description": {
"defaultMessage": "RSA es ampliamente compatible, ECDSA es más rápido y seguro pero puede no ser compatible con sistemas antiguos"
},
"certificates.key-type-ecdsa": {
"defaultMessage": "ECDSA 256"
},
"certificates.key-type-rsa": {
"defaultMessage": "RSA 2048"
},
"certificates.request.subtitle": { "certificates.request.subtitle": {
"defaultMessage": "con Let's Encrypt" "defaultMessage": "con Let's Encrypt"
}, },

View File

@@ -155,6 +155,18 @@
"certificates.http.warning": { "certificates.http.warning": {
"defaultMessage": "Questi domini devono già essere configurati per puntare a questa installazione." "defaultMessage": "Questi domini devono già essere configurati per puntare a questa installazione."
}, },
"certificates.key-type": {
"defaultMessage": "Tipo di Chiave"
},
"certificates.key-type-description": {
"defaultMessage": "RSA è ampiamente compatibile, ECDSA è più veloce e sicuro ma potrebbe non essere supportato da sistemi più vecchi"
},
"certificates.key-type-ecdsa": {
"defaultMessage": "ECDSA 256"
},
"certificates.key-type-rsa": {
"defaultMessage": "RSA 2048"
},
"certificates.request.subtitle": { "certificates.request.subtitle": {
"defaultMessage": "con Let's Encrypt" "defaultMessage": "con Let's Encrypt"
}, },

View File

@@ -155,6 +155,18 @@
"certificates.http.warning": { "certificates.http.warning": {
"defaultMessage": "これらのドメインは、すでにこのインストール先を指すように設定されている必要がありますあ." "defaultMessage": "これらのドメインは、すでにこのインストール先を指すように設定されている必要がありますあ."
}, },
"certificates.key-type": {
"defaultMessage": "鍵タイプ"
},
"certificates.key-type-description": {
"defaultMessage": "RSAは広く互換性があり、ECDSAはより高速で安全ですが、古いシステムではサポートされていない場合があります"
},
"certificates.key-type-ecdsa": {
"defaultMessage": "ECDSA 256"
},
"certificates.key-type-rsa": {
"defaultMessage": "RSA 2048"
},
"certificates.request.subtitle": { "certificates.request.subtitle": {
"defaultMessage": "Let's Encryptを使用する" "defaultMessage": "Let's Encryptを使用する"
}, },

View File

@@ -170,6 +170,18 @@
"certificates.http.warning": { "certificates.http.warning": {
"defaultMessage": "도메인이 이 서버를 가리키도록 설정되어 있어야 합니다." "defaultMessage": "도메인이 이 서버를 가리키도록 설정되어 있어야 합니다."
}, },
"certificates.key-type": {
"defaultMessage": "키 유형"
},
"certificates.key-type-description": {
"defaultMessage": "RSA는 호환성이 넓고, ECDSA는 더 빠르고 안전하지만 오래된 시스템에서 지원되지 않을 수 있습니다"
},
"certificates.key-type-ecdsa": {
"defaultMessage": "ECDSA 256"
},
"certificates.key-type-rsa": {
"defaultMessage": "RSA 2048"
},
"certificates.request.subtitle": { "certificates.request.subtitle": {
"defaultMessage": "Let's Encrypt 사용" "defaultMessage": "Let's Encrypt 사용"
}, },
@@ -218,7 +230,7 @@
"column.provider": { "column.provider": {
"defaultMessage": "공급자" "defaultMessage": "공급자"
}, },
"column.roles": { "column.roles": {
"defaultMessage": "권한" "defaultMessage": "권한"
}, },
"column.rules": { "column.rules": {

View File

@@ -155,6 +155,18 @@
"certificates.http.warning": { "certificates.http.warning": {
"defaultMessage": "Deze domeinen moeten al worden geconfigureerd om naar deze installatie te wijzen." "defaultMessage": "Deze domeinen moeten al worden geconfigureerd om naar deze installatie te wijzen."
}, },
"certificates.key-type": {
"defaultMessage": "Sleuteltype"
},
"certificates.key-type-description": {
"defaultMessage": "RSA is breed compatibel, ECDSA is sneller en veiliger maar wordt mogelijk niet ondersteund door oudere systemen"
},
"certificates.key-type-ecdsa": {
"defaultMessage": "ECDSA 256"
},
"certificates.key-type-rsa": {
"defaultMessage": "RSA 2048"
},
"certificates.request.subtitle": { "certificates.request.subtitle": {
"defaultMessage": "met Let's Encrypt" "defaultMessage": "met Let's Encrypt"
}, },

View File

@@ -155,6 +155,18 @@
"certificates.http.warning": { "certificates.http.warning": {
"defaultMessage": "Te domeny muszą być już skonfigurowane tak, aby wskazywały na ten serwer www" "defaultMessage": "Te domeny muszą być już skonfigurowane tak, aby wskazywały na ten serwer www"
}, },
"certificates.key-type": {
"defaultMessage": "Typ klucza"
},
"certificates.key-type-description": {
"defaultMessage": "RSA jest szeroko kompatybilny, ECDSA jest szybszy i bezpieczniejszy, ale może nie być obsługiwany przez starsze systemy"
},
"certificates.key-type-ecdsa": {
"defaultMessage": "ECDSA 256"
},
"certificates.key-type-rsa": {
"defaultMessage": "RSA 2048"
},
"certificates.request.subtitle": { "certificates.request.subtitle": {
"defaultMessage": "z Let's Encrypt" "defaultMessage": "z Let's Encrypt"
}, },

View File

@@ -155,6 +155,18 @@
"certificates.http.warning": { "certificates.http.warning": {
"defaultMessage": "Эти домены должны быть настроены и указывать на этот экземпляр." "defaultMessage": "Эти домены должны быть настроены и указывать на этот экземпляр."
}, },
"certificates.key-type": {
"defaultMessage": "Тип ключа"
},
"certificates.key-type-description": {
"defaultMessage": "RSA широко совместим, ECDSA быстрее и безопаснее, но может не поддерживаться старыми системами"
},
"certificates.key-type-ecdsa": {
"defaultMessage": "ECDSA 256"
},
"certificates.key-type-rsa": {
"defaultMessage": "RSA 2048"
},
"certificates.request.subtitle": { "certificates.request.subtitle": {
"defaultMessage": "через Let's Encrypt" "defaultMessage": "через Let's Encrypt"
}, },

View File

@@ -155,6 +155,18 @@
"certificates.http.warning": { "certificates.http.warning": {
"defaultMessage": "Tieto domény musia byť už nakonfigurované tak, aby smerovali na túto inštaláciu." "defaultMessage": "Tieto domény musia byť už nakonfigurované tak, aby smerovali na túto inštaláciu."
}, },
"certificates.key-type": {
"defaultMessage": "Typ kľúča"
},
"certificates.key-type-description": {
"defaultMessage": "RSA je široko kompatibilný, ECDSA je rýchlejší a bezpečnejší, ale nemusí byť podporovaný staršími systémami"
},
"certificates.key-type-ecdsa": {
"defaultMessage": "ECDSA 256"
},
"certificates.key-type-rsa": {
"defaultMessage": "RSA 2048"
},
"certificates.request.subtitle": { "certificates.request.subtitle": {
"defaultMessage": "pomocou Let's Encrypt" "defaultMessage": "pomocou Let's Encrypt"
}, },

View File

@@ -155,6 +155,18 @@
"certificates.http.warning": { "certificates.http.warning": {
"defaultMessage": "Các miền này phải được cấu hình sẵn để trỏ đến cài đặt này." "defaultMessage": "Các miền này phải được cấu hình sẵn để trỏ đến cài đặt này."
}, },
"certificates.key-type": {
"defaultMessage": "Loại khóa"
},
"certificates.key-type-description": {
"defaultMessage": "RSA tương thích rộng rãi, ECDSA nhanh hơn và an toàn hơn nhưng có thể không được hỗ trợ bởi các hệ thống cũ"
},
"certificates.key-type-ecdsa": {
"defaultMessage": "ECDSA 256"
},
"certificates.key-type-rsa": {
"defaultMessage": "RSA 2048"
},
"certificates.request.subtitle": { "certificates.request.subtitle": {
"defaultMessage": "bằng Let's Encrypt" "defaultMessage": "bằng Let's Encrypt"
}, },

View File

@@ -155,6 +155,18 @@
"certificates.http.warning": { "certificates.http.warning": {
"defaultMessage": "这些域名必须配置为指向本设备。" "defaultMessage": "这些域名必须配置为指向本设备。"
}, },
"certificates.key-type": {
"defaultMessage": "密钥类型"
},
"certificates.key-type-description": {
"defaultMessage": "RSA 兼容性更好ECDSA 更快更安全但旧系统可能不支持"
},
"certificates.key-type-ecdsa": {
"defaultMessage": "ECDSA 256"
},
"certificates.key-type-rsa": {
"defaultMessage": "RSA 2048"
},
"certificates.request.subtitle": { "certificates.request.subtitle": {
"defaultMessage": "使用 Let's Encrypt" "defaultMessage": "使用 Let's Encrypt"
}, },

View File

@@ -1,6 +1,6 @@
import { useQueryClient } from "@tanstack/react-query"; import { useQueryClient } from "@tanstack/react-query";
import EasyModal, { type InnerModalProps } from "ez-modal-react"; import EasyModal, { type InnerModalProps } from "ez-modal-react";
import { Form, Formik } from "formik"; import { Form, Formik, Field } from "formik";
import { type ReactNode, useState } from "react"; import { type ReactNode, useState } from "react";
import { Alert } from "react-bootstrap"; import { Alert } from "react-bootstrap";
import Modal from "react-bootstrap/Modal"; import Modal from "react-bootstrap/Modal";
@@ -44,6 +44,7 @@ const DNSCertificateModal = EasyModal.create(({ visible, remove }: InnerModalPro
provider: "letsencrypt", provider: "letsencrypt",
meta: { meta: {
dnsChallenge: true, dnsChallenge: true,
keyType: "ecdsa",
}, },
} as any } as any
} }
@@ -63,6 +64,30 @@ const DNSCertificateModal = EasyModal.create(({ visible, remove }: InnerModalPro
<div className="card m-0 border-0"> <div className="card m-0 border-0">
<div className="card-body"> <div className="card-body">
<DomainNamesField isWildcardPermitted dnsProviderWildcardSupported /> <DomainNamesField isWildcardPermitted dnsProviderWildcardSupported />
<Field name="meta.keyType">
{({ field }: any) => (
<div className="mb-3">
<label htmlFor="keyType" className="form-label">
<T id="certificates.key-type" />
</label>
<select
id="keyType"
className="form-select"
{...field}
>
<option value="rsa">
<T id="certificates.key-type-rsa" />
</option>
<option value="ecdsa">
<T id="certificates.key-type-ecdsa" />
</option>
</select>
<small className="form-text text-muted">
<T id="certificates.key-type-description" />
</small>
</div>
)}
</Field>
<DNSProviderFields /> <DNSProviderFields />
</div> </div>
</div> </div>

View File

@@ -1,7 +1,7 @@
import { IconAlertTriangle } from "@tabler/icons-react"; import { IconAlertTriangle } from "@tabler/icons-react";
import { useQueryClient } from "@tanstack/react-query"; import { useQueryClient } from "@tanstack/react-query";
import EasyModal, { type InnerModalProps } from "ez-modal-react"; import EasyModal, { type InnerModalProps } from "ez-modal-react";
import { Form, Formik } from "formik"; import { Form, Formik, Field } from "formik";
import { type ReactNode, useState } from "react"; import { type ReactNode, useState } from "react";
import { Alert } from "react-bootstrap"; import { Alert } from "react-bootstrap";
import Modal from "react-bootstrap/Modal"; import Modal from "react-bootstrap/Modal";
@@ -115,6 +115,9 @@ const HTTPCertificateModal = EasyModal.create(({ visible, remove }: InnerModalPr
{ {
domainNames: [], domainNames: [],
provider: "letsencrypt", provider: "letsencrypt",
meta: {
keyType: "ecdsa",
},
} as any } as any
} }
onSubmit={onSubmit} onSubmit={onSubmit}
@@ -142,6 +145,30 @@ const HTTPCertificateModal = EasyModal.create(({ visible, remove }: InnerModalPr
setTestResults(null); setTestResults(null);
}} }}
/> />
<Field name="meta.keyType">
{({ field }: any) => (
<div className="mb-3">
<label htmlFor="keyType" className="form-label">
<T id="certificates.key-type" />
</label>
<select
id="keyType"
className="form-select"
{...field}
>
<option value="rsa">
<T id="certificates.key-type-rsa" />
</option>
<option value="ecdsa">
<T id="certificates.key-type-ecdsa" />
</option>
</select>
<small className="form-text text-muted">
<T id="certificates.key-type-description" />
</small>
</div>
)}
</Field>
</div> </div>
{testResults ? ( {testResults ? (
<div className="card-footer"> <div className="card-footer">