diff --git a/security/acme-client/Makefile b/security/acme-client/Makefile index 465cc2578..def551fa6 100644 --- a/security/acme-client/Makefile +++ b/security/acme-client/Makefile @@ -1,5 +1,5 @@ PLUGIN_NAME= acme-client -PLUGIN_VERSION= 3.1 +PLUGIN_VERSION= 3.2 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 724aae3e7..a7dc6c18e 100644 --- a/security/acme-client/pkg-descr +++ b/security/acme-client/pkg-descr @@ -8,6 +8,14 @@ WWW: https://github.com/acmesh-official/acme.sh Plugin Changelog ================ +3.2 + +Added: +* add button to (re-) import a certificate into the trust storage + +Fixed: +* associate certificates with the correct CA when multiple CAs use the same name (#2550) + 3.1 Changed: diff --git a/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/Api/CertificatesController.php b/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/Api/CertificatesController.php index 5a56a56a0..e72baa630 100644 --- a/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/Api/CertificatesController.php +++ b/security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/Api/CertificatesController.php @@ -172,4 +172,23 @@ class CertificatesController extends ApiMutableModelControllerBase } return $result; } + + /** + * (re-) import the certificate by uuid + * @param $uuid item unique id + * @return array status + */ + public function importAction($uuid) + { + $result = array("result" => "failed"); + $mdlAcme = new AcmeClient(); + if ($uuid != null) { + $node = $mdlAcme->getNodeByReference('certificates.certificate.' . $uuid); + if ($node != null) { + $backend = new Backend(); + $response = $backend->configdRun("acmeclient import ${uuid}"); + } + } + return $result; + } } diff --git a/security/acme-client/src/opnsense/mvc/app/library/OPNsense/AcmeClient/LeCertificate.php b/security/acme-client/src/opnsense/mvc/app/library/OPNsense/AcmeClient/LeCertificate.php index cfe13498d..9aaf313be 100644 --- a/security/acme-client/src/opnsense/mvc/app/library/OPNsense/AcmeClient/LeCertificate.php +++ b/security/acme-client/src/opnsense/mvc/app/library/OPNsense/AcmeClient/LeCertificate.php @@ -159,7 +159,7 @@ class LeCertificate extends LeCommon foreach (Config::getInstance()->object()->ca as $cacrt) { $cacrt_subject = cert_get_subject($cacrt->crt, true); $cacrt_issuer = cert_get_issuer($cacrt->crt, true); - if (($ca_subject == $cacrt_subject) and ($ca_issuer == $cacrt_issuer)) { + if (($ca_subject === $cacrt_subject) and ($ca_issuer === $cacrt_issuer)) { // Use old refid instead of generating a new one $ca['refid'] = (string)$cacrt->refid; $ca_found = true; @@ -257,6 +257,12 @@ class LeCertificate extends LeCommon // Prepare certificate for import cert_import($cert, $cert_content, $key_content); + // Overwrite caref in order to use the correct CA (GH #2550). + // This is required because cert_import() uses lookup_ca_by_subject() + // to find a matching CA. If multiple CAs are using the same name, the + // first CA wins, but it may still be the wrong CA. + $cert['caref'] = (string)$ca['refid']; + // Check if cert was found in config if ($cert_found == true) { // Update existing cert diff --git a/security/acme-client/src/opnsense/mvc/app/views/OPNsense/AcmeClient/certificates.volt b/security/acme-client/src/opnsense/mvc/app/views/OPNsense/AcmeClient/certificates.volt index 334e7914b..c0483969b 100644 --- a/security/acme-client/src/opnsense/mvc/app/views/OPNsense/AcmeClient/certificates.volt +++ b/security/acme-client/src/opnsense/mvc/app/views/OPNsense/AcmeClient/certificates.volt @@ -49,6 +49,7 @@ POSSIBILITY OF SUCH DAMAGE. revoke:'/api/acmeclient/certificates/revoke/', removekey:'/api/acmeclient/certificates/removekey/', automation:'/api/acmeclient/certificates/automation/', + import:'/api/acmeclient/certificates/import/', }; var gridopt = { @@ -62,6 +63,7 @@ POSSIBILITY OF SUCH DAMAGE. return " " + "" + "" + + "" + "" + "" + "" + @@ -397,6 +399,25 @@ POSSIBILITY OF SUCH DAMAGE. } }); + // import certificate into trust storage + grid_certificates.find(".command-import").on("click", function(e) + { + if (gridParams['import'] != undefined) { + var uuid=$(this).data("row-id"); + stdDialogConfirm('{{ lang._('Confirmation Required') }}', + '{{ lang._('(Re-) import the selected certificate and associated CA certificates into the trust storage?') }}', + '{{ lang._('Yes') }}', '{{ lang._('Cancel') }}', function() { + ajaxCall(url=gridParams['import'] + uuid, + sendData={},callback=function(data,status){ + // reload grid after sign + $("#"+gridId).bootgrid("reload"); + }); + }); + } else { + console.log("[grid] action import missing") + } + }); + }); // Hide options that are irrelevant in this context. @@ -463,7 +484,7 @@ POSSIBILITY OF SUCH DAMAGE. {{ lang._('Issue/Renewal Date') }} {{ lang._('Last ACME Status') }} {{ lang._('Last ACME Run') }} - {{ lang._('Commands') }} + {{ lang._('Commands') }} {{ lang._('ID') }} 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 76fb546cf..73bb87ee2 100755 --- a/security/acme-client/src/opnsense/scripts/OPNsense/AcmeClient/lecert.php +++ b/security/acme-client/src/opnsense/scripts/OPNsense/AcmeClient/lecert.php @@ -171,7 +171,9 @@ function main() } } elseif ($options['mode'] === 'import' && isset($options['cert'])) { $cert = new LeCertificate($options['cert']); - $cert->import(); + // Set $skip_validation to allow import even when validation + // is currently failing. + $cert->import(true); } elseif ($options['mode'] === 'revoke' && isset($options['cert'])) { $cert = new LeCertificate($options['cert']); $cert->revoke(); diff --git a/security/acme-client/src/opnsense/service/conf/actions.d/actions_acmeclient.conf b/security/acme-client/src/opnsense/service/conf/actions.d/actions_acmeclient.conf index 8f379a6da..7af68eaa4 100644 --- a/security/acme-client/src/opnsense/service/conf/actions.d/actions_acmeclient.conf +++ b/security/acme-client/src/opnsense/service/conf/actions.d/actions_acmeclient.conf @@ -77,6 +77,12 @@ parameters:%s type:script message:running automations for a certificate +[import] +command:/usr/local/opnsense/scripts/OPNsense/AcmeClient/setup.sh; /usr/sbin/daemon -f /usr/local/opnsense/scripts/OPNsense/AcmeClient/lecert.php --mode import --cert +parameters:%s +type:script +message:running import for a certificate + [cron-auto-renew] command:/usr/local/opnsense/scripts/OPNsense/AcmeClient/setup.sh; /usr/sbin/daemon -f /usr/local/opnsense/scripts/OPNsense/AcmeClient/lecert.php --mode issue --all --cron parameters: