diff --git a/security/acme-client/Makefile b/security/acme-client/Makefile
index 97ee0b6ea..aa8f7cc86 100644
--- a/security/acme-client/Makefile
+++ b/security/acme-client/Makefile
@@ -1,6 +1,6 @@
PLUGIN_NAME= acme-client
-PLUGIN_VERSION= 2.6
-PLUGIN_COMMENT= Let's Encrypt client
+PLUGIN_VERSION= 3.0
+PLUGIN_COMMENT= ACME Client
PLUGIN_MAINTAINER= opnsense@moov.de
PLUGIN_DEPENDS= acme.sh py${PLUGIN_PYTHON}-dns-lexicon
diff --git a/security/acme-client/pkg-descr b/security/acme-client/pkg-descr
index 0f08eea38..a78db9bed 100644
--- a/security/acme-client/pkg-descr
+++ b/security/acme-client/pkg-descr
@@ -8,6 +8,30 @@ WWW: https://github.com/acmesh-official/acme.sh
Plugin Changelog
================
+3.0
+
+Added:
+* add support for new ACME CAs: buypass, buypass_test, sslcom, zerossl (#2361)
+* add CA setting to accounts, make it possible to use multiple CAs
+* add introduction pages and an option to hide them
+* add tooltips for account command buttons (#2188)
+* add support for custom ACME EAB kid/hmac when registering accounts
+
+Fixed:
+* properly set/get the UUID of LE objects
+
+Changed:
+* rename plugin from "Let's Encrypt client" to "ACME Client" (#2361)
+* change the suffix for imports to the certificate storage to "ACME Client" (#2361)
+* rename "Let's Encrypt Environment" to "ACME CA" and move to account settings (#2361)
+* preserve old LE accounts/certs by adding a compatibility layer (#2361)
+* update tooltip style for 21.7 (#2188)
+* show more options in list view for challenge types and automations
+
+Removed:
+* remove the legacy log file and only rely on syslog logging (#2366)
+* remove obsolete account parameters: certificateAuthority, lastUpdate
+
2.6
Added:
diff --git a/security/acme-client/src/etc/inc/plugins.inc.d/acmeclient.inc b/security/acme-client/src/etc/inc/plugins.inc.d/acmeclient.inc
index 801a1fb07..92b8881e2 100644
--- a/security/acme-client/src/etc/inc/plugins.inc.d/acmeclient.inc
+++ b/security/acme-client/src/etc/inc/plugins.inc.d/acmeclient.inc
@@ -1,7 +1,7 @@
gettext('Let\'s Encrypt client'),
+ 'description' => gettext('ACME client'),
'pidfile' => '/var/run/lighttpd-acme-challenge.pid',
'configd' => array(
'restart' => array('acme-http-challenge restart'),
diff --git a/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/AccountsController.php b/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/AccountsController.php
index 374112c23..202b578fd 100644
--- a/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/AccountsController.php
+++ b/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/AccountsController.php
@@ -1,7 +1,7 @@
view->formDialogAccount = $this->getForm("dialogAccount");
+ // set additional view parameters
+ $mdlAcme = new \OPNsense\AcmeClient\AcmeClient();
+ $this->view->showIntro = (string)$mdlAcme ->settings->showIntro;
// choose template
$this->view->pick('OPNsense/AcmeClient/accounts');
}
diff --git a/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/ActionsController.php b/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/ActionsController.php
index 002446342..fb438bff6 100644
--- a/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/ActionsController.php
+++ b/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/ActionsController.php
@@ -1,7 +1,7 @@
view->formDialogAction = $this->getForm("dialogAction");
+ // set additional view parameters
+ $mdlAcme = new \OPNsense\AcmeClient\AcmeClient();
+ $this->view->showIntro = (string)$mdlAcme ->settings->showIntro;
// choose template
$this->view->pick('OPNsense/AcmeClient/actions');
}
diff --git a/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/Api/ActionsController.php b/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/Api/ActionsController.php
index 0dec0e4b9..2634c404d 100644
--- a/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/Api/ActionsController.php
+++ b/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/Api/ActionsController.php
@@ -72,7 +72,7 @@ class ActionsController extends ApiMutableModelControllerBase
public function searchAction()
{
- return $this->searchBase('actions.action', array('enabled', 'name', 'description'), 'name');
+ return $this->searchBase('actions.action', array('enabled', 'name', 'type', 'description'), 'name');
}
public function sftpGetIdentityAction()
diff --git a/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/Api/SettingsController.php b/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/Api/SettingsController.php
index 3dee7cfb2..c8bef9805 100644
--- a/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/Api/SettingsController.php
+++ b/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/Api/SettingsController.php
@@ -1,7 +1,7 @@
newAcl(
"find_acme_challenge",
- "Added by Let's Encrypt plugin",
+ "Added by ACME Client plugin",
"path_beg",
"0",
array("path_beg" => "/.well-known/acme-challenge/")
@@ -273,7 +273,7 @@ class SettingsController extends ApiMutableModelControllerBase
$backend_uuid = $mdlHAProxy->newBackend(
"1",
"acme_challenge_backend",
- "Added by Let's Encrypt plugin",
+ "Added by ACME Client plugin",
"http",
"source",
"",
@@ -283,7 +283,7 @@ class SettingsController extends ApiMutableModelControllerBase
// Add a new HAProxy action
$action_uuid = $mdlHAProxy->newAction(
"redirect_acme_challenges",
- "Added by Let's Encrypt plugin",
+ "Added by ACME Client plugin",
"if",
"",
"and",
@@ -298,7 +298,7 @@ class SettingsController extends ApiMutableModelControllerBase
// Add a new HAProxy server
$server_uuid = $mdlHAProxy->newServer(
"acme_challenge_host",
- "Added by Let's Encrypt plugin",
+ "Added by ACME Client plugin",
"127.0.0.1",
$acme_port,
"active",
diff --git a/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/Api/ValidationsController.php b/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/Api/ValidationsController.php
index 8dd689313..703a8fef3 100644
--- a/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/Api/ValidationsController.php
+++ b/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/Api/ValidationsController.php
@@ -73,6 +73,6 @@ class ValidationsController extends ApiMutableModelControllerBase
public function searchAction()
{
- return $this->searchBase('validations.validation', array('enabled', 'name', 'description'), 'name');
+ return $this->searchBase('validations.validation', array('enabled', 'name', 'method', 'description'), 'name');
}
}
diff --git a/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/CertificatesController.php b/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/CertificatesController.php
index 8e58c37ef..df9b8fd53 100644
--- a/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/CertificatesController.php
+++ b/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/CertificatesController.php
@@ -1,7 +1,7 @@
view->formDialogCertificate = $this->getForm("dialogCertificate");
+ // set additional view parameters
+ $mdlAcme = new \OPNsense\AcmeClient\AcmeClient();
+ $this->view->showIntro = (string)$mdlAcme ->settings->showIntro;
// choose template
$this->view->pick('OPNsense/AcmeClient/certificates');
}
diff --git a/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/IndexController.php b/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/IndexController.php
index f13b7e9c1..59a0f966c 100644
--- a/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/IndexController.php
+++ b/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/IndexController.php
@@ -1,7 +1,7 @@
view->settingsForm = $this->getForm("settings");
+ // set additional view parameters
+ $mdlAcme = new \OPNsense\AcmeClient\AcmeClient();
+ $this->view->showIntro = (string)$mdlAcme ->settings->showIntro;
// pick the template to serve
$this->view->pick('OPNsense/AcmeClient/settings');
}
diff --git a/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/ValidationsController.php b/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/ValidationsController.php
index 8c2f2a365..32a8e613b 100644
--- a/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/ValidationsController.php
+++ b/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/ValidationsController.php
@@ -1,7 +1,7 @@
view->formDialogValidation = $this->getForm("dialogValidation");
+ // set additional view parameters
+ $mdlAcme = new \OPNsense\AcmeClient\AcmeClient();
+ $this->view->showIntro = (string)$mdlAcme ->settings->showIntro;
// choose template
$this->view->pick('OPNsense/AcmeClient/validations');
}
diff --git a/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/forms/dialogAccount.xml b/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/forms/dialogAccount.xml
index 2800717bd..33854114a 100644
--- a/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/forms/dialogAccount.xml
+++ b/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/forms/dialogAccount.xml
@@ -17,6 +17,10 @@
textDescription for this account.
+
+
+ header
+ account.email
@@ -24,10 +28,25 @@
Optional e-mail address for this account.
- account.certificateAuthority
-
+ account.ca
+
dropdown
-
- true
+ acme.sh documentation for a list of supported CAs.]]>
+
+
+
+ header
+
+
+ account.eab_kid
+
+ text
+
+
+
+ account.eab_hmac
+
+ password
+
diff --git a/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/forms/dialogCertificate.xml b/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/forms/dialogCertificate.xml
index ee0eb8daf..a78b2f051 100644
--- a/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/forms/dialogCertificate.xml
+++ b/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/forms/dialogCertificate.xml
@@ -27,24 +27,24 @@
select_multipletrue
-
NOTE:You need to forcefully re-issue the certificate if you change "Alt Names" after the certificate was signed by the Let's Encrypt Authority! Use the "issue" button in the Commands column in this case.
]]>
+
NOTE:You need to forcefully re-issue the certificate if you change "Alt Names" after the certificate was signed by the ACME CA! Use the "issue" button in the Commands column in this case.
]]>Enter FQDN here. Finish with TAB.
-
+
headercertificate.accountdropdown
-
+ certificate.validationMethoddropdown
-
+ certificate.autoRenewal
diff --git a/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/forms/dialogValidation.xml b/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/forms/dialogValidation.xml
index 527601cfd..4faa6b778 100644
--- a/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/forms/dialogValidation.xml
+++ b/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/forms/dialogValidation.xml
@@ -21,7 +21,7 @@
validation.methoddropdown
- Set the Let's Encrypt challenge type. You'll have to add configuration for the selected challenge type below.
+ Set the ACME challenge type. You'll have to add configuration for the selected challenge type below.
@@ -48,7 +48,7 @@
validation.http_opn_interfacedropdown
-
NOTE:This will ONLY work if the official IP addresses are LOCALLY configured on your OPNsense firewall.
]]>
+
NOTE:This will ONLY work if the official IP addresses are LOCALLY configured on your OPNsense firewall.
NOTE:Certificates signed by the staging environment are NOT valid. You need to forcefully re-sign (or delete and re-create) them after switching from staging to production environment.
{{ lang._('In order to create certificates, an account is required. Also the following information should be considered:') }}
+
+
{{ lang._('The account will be %sregistered automatically%s at the chosen CA. The CA will then associate new certificates to the selected account.') | format('', '') }}
+
{{ lang._('Usually CAs will let you know if something went wrong and a certificate is about to expire, therefore a %svalid e-mail address%s should be provided.') | format('', '') }}
+
{{ lang._('For certain use-cases it can be useful to register %smultiple accounts%s, but the policy of the CA should be respected with this regard.') | format('', '') }}
+
+
{{ lang._('When requesting support from a CA the account ID may be required, %sthis documentation%s contains information how to get the internal account ID from the log files.') | format('', '') }}
{{ lang._('Automations are a completely optional feature, but they can make life much easier, especially when using short-lived certificates. Typically use-cases include:') }}
+
+
{{ lang._("%sRestart a service%s when a certificate was renewed to ensure that the newest certificate is being used. This is especially useful when using an ACME certificate for the OPNsense WebGUI or in combination with the HAProxy or NGINX plugins. Any OPNsense core service or plugin service may be restarted.") | format('', '') }}
+
{{ lang._("Copy a certificate to one or more other hosts using the %sSFTP/SSH protocol%s. This way OPNsense can be used as a central authority for ACME certificates and secrets for DNS providers can be kept on a secure device.") | format('', '') }}
+
{{ lang._("Deploy a certificate to an external service, for example a %sCDN%s provider.") | format('', '') }}
+
+
{{ lang._("This plugin can theoretically utilize most of %sacme.sh's webhooks%s. However, not all webhooks are currently implemented. Feel free to submit a %sfeature request%s if support for a acme.sh webhook should be added to the plugin.") | format('', '', '', '') }}
{{ lang._('This plugin supports an unlimited number of certificates. However, the CA may restrict the number of certificates per week or implement other rate-limits. Retrying a failed validation many times in a row may also cause further attempts to fail due to rate-limits. The CA documentation should contain further information.') }}
+
{{ lang._('The following principles apply when managing certificates with this plugin:') }}
+
+
{{ lang._('Certificates must be %svalidated%s by the CA before they can be used. This process runs in the background and may take several minutes to complete. The progress can be monitored by using the %slog files%s.') | format('', '', '', '') }}
+
{{ lang._('Certificates are stored in the %sOPNsense certificate storage%s. When a CA has completed the validation of a certificate request, the resulting certificate is then automatically imported into the OPNsense certificate storage. The same applies when renewing certificates, the existing entry in the OPNsense certificate storage will automatically be updated.') | format('', '') }}
+
{{ lang._('When removing a certificate from the plugin, the certificate in the %sOPNsense certificate storage%s is %sNOT removed%s, because it may still be used by a core application or another plugin. Obsolete certificates should be manually removed from the OPNsense certificate storage. Note that when creating a new certificate with the same name, a new certificated will be imported into the OPNsense certificate storage (instead of updating the existing entry).') | format('', '', '', '') }}
+
+
{{ lang._('When experiencing issues, try setting the log level to "debug" on the %ssettings%s page.') | format('', '') }}
+
+
+
+
@@ -443,8 +461,8 @@ POSSIBILITY OF SUCH DAMAGE.
{{ lang._('Multi-Domain (SAN)') }}
{{ lang._('Description') }}
{{ lang._('Issue/Renewal Date') }}
-
{{ lang._('Last Acme Status') }}
-
{{ lang._('Last Acme Run') }}
+
{{ lang._('Last ACME Status') }}
+
{{ lang._('Last ACME Run') }}
{{ lang._('Commands') }}
{{ lang._('ID') }}
@@ -461,15 +479,12 @@ POSSIBILITY OF SUCH DAMAGE.
-
-
-
-
-
-
-
- {{ lang._('Use the Issue/Renew button to let the acme client automatically issue any new certificate and renew existing certificates (only if required). If you want to only issue/renew or revoke a single certificate, use the buttons in the Commands column. This will forcefully issue/renew the certificate, even if it is not required.') }} {{ lang._('The process may take some time and thus will run in the background, you will not get any notification in the GUI. Use the log file to monitor the progress and to see error messages.') }}
-
{{ lang._("Welcome to the ACME Client plugin! This plugin allows you to create SSL certificates by using one of the following Certificate Authorities (CAs):") }}
+
+
{{ lang._("%sLet's Encrypt:%s A free, automated, and open certificate authority, run for the public's benefit. It is a service provided by the Internet Security Research Group (ISRG). Read more about the ACME protocol in %stheir documentation%s.") | format('', '', '', '') }}
+
{{ lang._('%sBuypass:%s A commercial, european certificate authority, based in Norway. Check out %stheir documentation%s for details about rate-limits and the usage policy.') | format('', '', '', '') }}
+
{{ lang._('%sSSL.com:%s A commercial, globally trusted certificate authority. They provide an %sextensive guide%s for using their paid services with the ACME protocol.') | format('', '', '', '') }}
+
{{ lang._("%sZeroSSL:%s A commercial, european certificate authority, based in Austria. They provide a feature overview on %stheir website%s for users of Let's Encrypt.") | format('', '', '', '') }}
+
+
{{ lang._("Setting up this plugin for the first time involves the following steps") }}
+
+
{{ lang._('%sEnable%s the plugin: When enabling this plugin on the %ssettings%s page, a lightweight service is started and a cron job is added to run periodic tasks.') | format('', '', '', '') }}
+
{{ lang._('Create an %saccount%s: An %saccount%s is required. It determines which CA will be used for all associated certificates.') | format('', '', '', '') }}
+
{{ lang._('Set up a %schallenge type%s: Choose the %schallenge type%s that works best for you and if necessary, add the credentials for your DNS provider.') | format('', '', '', '') }}
+
{{ lang._('Add %sautomations%s: This is optional, but recommended when using short-lived certificates. %sAutomations%s allow to automatically run tasks when a certificate was created or renewed.') | format('', '', '', '') }}
+
{{ lang._('Create %scertificates%s: Finally create the %scertificates%s and let the CA complete the validation process.') | format('', '', '', '') }}
+
+
{{ lang._("Please read the official documentation for the preferred CA before using this plugin. It should give you a good overview about how their implementation of the ACME protocol works, so you do not hit their %srate limits%s and avoid common misconfigurations. Otherwise all attempts to issue a certificate would most likely fail. ") | format('', '') }}{{ lang._("Ensure to use a %stest CA%s when using this plugin for the first time or while testing a new challenge type. Note that you will have to reissue your certificates when switching from a test CA to a production CA to get valid certificates.") | format('', '') }}
+
{{ lang._('Please use the %sissue tracker%s to report bugs or request new features. Note that some CAs offer paid services. These services are not affiliated to this plugin. The maintainers and developers of this plugin will not provide support for paid services.') | format('', '') }}
- {{ lang._("Please read the official %sLet's Encrypt documentation%s before using this plugin. Otherwise you will easily hit its %srate limits%s and thus all your attempts to issue a certificate will fail.") | format('', '', '', '') }}{{ lang._("Please use Let's Encrypt's %sstaging servers%s when using this plugin for the first time or while testing a new challenge type. You will have to reissue your certificates when switching from staging to production servers to get valid certificates.") | format('', '') }}
- {{ lang._('Please use the %sissue tracker%s to report bugs or request new features.') | format('', '') }}
-
-
-
{{ lang._('This plugin includes code from the %s project.') | format('acmesh-official/acme.sh' ) }} {{ lang._('Licensed under GPLv3.') }} {{ lang._('Let"s Encrypt(tm) is a trademark of the Internet Security Research Group. All rights reserved.') }}
+
{{ lang._('This plugin includes code from the %s project.') | format('acmesh-official/acme.sh' ) }} {{ lang._('Licensed under %sGPLv3%s.') | format('', '' ) }} {{ lang._("Let's Encrypt(tm) is a trademark of the Internet Security Research Group. All rights reserved.") }}
{{ lang._('As defined by the ACME standard, Certificate Authorities (CAs) must validate that you control a domain name. This is done by using "challenges". The following challenge types are supported:') }}
+
+
{{ lang._('%sDNS-01:%s This is the most reliable challenge type and thus highly recommended when using this plugin. It requires that you control the DNS for your domain name and that your DNS provider is supported both %sby acme.sh%s and this plugin.') | format('', '', '', '') }}
+
{{ lang._("%sHTTP-01:%s This challenge type usually requires manual configuration and is not recommended. The DNS name used in the certificate must point to the OPNsense host where the ACME Client plugin is running on. The integrated web service will try to guess the correct settings for your setup, but this may not always work out-of-the-box. Furthermore this challenge type cannot be used to create %swildcard certificates with Let's Encrypt%s.") | format('', '', '', '') }}
+
+
{{ lang._('When experiencing issues with a challenge type, try setting the log level to "debug". Please provide full logs when %sreporting issues%s for a challenge type. You should also consider to ask the Certificate Authority for support, if you choose to use a commercial CA.') | format('', '') }}
+
+
+
+
{{ lang._('Enabled') }}
{{ lang._('Name') }}
+
{{ lang._('Challenge Type') }}
{{ lang._('Description') }}
{{ lang._('Commands') }}
{{ lang._('ID') }}
@@ -119,6 +134,7 @@ POSSIBILITY OF SUCH DAMAGE.
+
{# include dialogs #}
diff --git a/security/acme-client/src/opnsense/scripts/OPNsense/AcmeClient/lecert.php b/security/acme-client/src/opnsense/scripts/OPNsense/AcmeClient/lecert.php
index 3558d44dc..76fb546cf 100755
--- a/security/acme-client/src/opnsense/scripts/OPNsense/AcmeClient/lecert.php
+++ b/security/acme-client/src/opnsense/scripts/OPNsense/AcmeClient/lecert.php
@@ -41,7 +41,7 @@ use OPNsense\AcmeClient\LeCertificate;
const ABOUT = << 'run automations for the specified certificate',
],
'register' => [
- 'description' => 'register the specified account with Lets Encrypt',
+ 'description' => 'register the specified account with ACME CA',
],
];
@@ -76,7 +76,7 @@ const STATIC_OPTIONS = << "/var/etc/acme-client/challenges/.well-known/acme-challenge/" )
# Maximum idle time with nothing being written