|
|
|
|
@@ -69,7 +69,8 @@ class AcmeSh extends FroxlorCron
|
|
|
|
|
* run the task
|
|
|
|
|
*
|
|
|
|
|
* @param bool $internal
|
|
|
|
|
* @return number
|
|
|
|
|
* @return int
|
|
|
|
|
* @throws \Exception
|
|
|
|
|
*/
|
|
|
|
|
public static function run(bool $internal = false)
|
|
|
|
|
{
|
|
|
|
|
@@ -85,6 +86,9 @@ class AcmeSh extends FroxlorCron
|
|
|
|
|
if ($issue_froxlor || !empty($issue_domains) || !empty($renew_froxlor) || $renew_domains) {
|
|
|
|
|
// insert task to generate certificates and vhost-configs
|
|
|
|
|
Cronjob::inserttask(TaskId::REBUILD_VHOST);
|
|
|
|
|
if ($renew_froxlor) {
|
|
|
|
|
Cronjob::inserttask(TaskId::UPDATE_LE_SERVICES);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
@@ -217,6 +221,7 @@ class AcmeSh extends FroxlorCron
|
|
|
|
|
* check whether we need to issue a new certificate for froxlor itself
|
|
|
|
|
*
|
|
|
|
|
* @return boolean
|
|
|
|
|
* @throws \Exception
|
|
|
|
|
*/
|
|
|
|
|
private static function issueFroxlorVhost()
|
|
|
|
|
{
|
|
|
|
|
@@ -340,6 +345,7 @@ EOC;
|
|
|
|
|
* check whether we need to renew-check the certificate for froxlor itself
|
|
|
|
|
*
|
|
|
|
|
* @return boolean
|
|
|
|
|
* @throws \Exception
|
|
|
|
|
*/
|
|
|
|
|
private static function renewFroxlorVhost()
|
|
|
|
|
{
|
|
|
|
|
@@ -539,6 +545,7 @@ EOC;
|
|
|
|
|
* @param array $domains
|
|
|
|
|
* @param int $domain_id
|
|
|
|
|
* @param FroxlorLogger $cronlog
|
|
|
|
|
* @throws \Exception
|
|
|
|
|
*/
|
|
|
|
|
private static function validateDns(array &$domains, $domain_id, &$cronlog)
|
|
|
|
|
{
|
|
|
|
|
@@ -619,27 +626,47 @@ EOC;
|
|
|
|
|
$cronlog->logAction(FroxlorLogger::CRON_ACTION, LOG_DEBUG, "Successful exit-code returned - storing certificate");
|
|
|
|
|
$cert_stored = self::certToDb($certrow, $cronlog, $acme_result);
|
|
|
|
|
|
|
|
|
|
if ($cert_stored
|
|
|
|
|
&& $renew_hook
|
|
|
|
|
&& !empty(trim(Settings::Get('system.le_renew_services') ?? ""))
|
|
|
|
|
&& !empty(trim(Settings::Get('system.le_renew_hook') ?? ""))
|
|
|
|
|
) {
|
|
|
|
|
$cronlog->logAction(FroxlorLogger::CRON_ACTION, LOG_DEBUG, "Renew-hook is enabled - adjusting configurations");
|
|
|
|
|
if ($cert_stored && $renew_hook) {
|
|
|
|
|
self::renewHookConfigs($cronlog);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$certificate_folder = self::getCertificateFolder(strtolower(Settings::Get('system.hostname')));
|
|
|
|
|
$fullchain = FileDir::makeCorrectFile($certificate_folder . '/fullchain.cer');
|
|
|
|
|
$keyfile = FileDir::makeCorrectFile($certificate_folder . '/' . strtolower(Settings::Get('system.hostname')) . '.key');
|
|
|
|
|
$ca_file = FileDir::makeCorrectFile($certificate_folder . '/ca.cer');
|
|
|
|
|
public static function renewHookConfigs($cronlog)
|
|
|
|
|
{
|
|
|
|
|
if (!empty(trim(Settings::Get('system.le_renew_services') ?? ""))
|
|
|
|
|
&& !empty(trim(Settings::Get('system.le_renew_hook') ?? ""))
|
|
|
|
|
) {
|
|
|
|
|
|
|
|
|
|
if (Settings::IsInList('system.le_renew_services', 'postfix')) {
|
|
|
|
|
// "postconf -e" for postfix
|
|
|
|
|
FileDir::safe_exec('postconf -e smtpd_tls_cert_file=' . escapeshellarg($fullchain));
|
|
|
|
|
FileDir::safe_exec('postconf -e smtpd_tls_key_file=' . escapeshellarg($keyfile));
|
|
|
|
|
}
|
|
|
|
|
if (Settings::IsInList('system.le_renew_services', 'dovecot')) {
|
|
|
|
|
// custom config for dovecot
|
|
|
|
|
$dovecot_conf = '/etc/dovecot/conf.d/99-froxlor.ssl.conf'; // @fixme setting?
|
|
|
|
|
$ssl_content = <<<EOSSL
|
|
|
|
|
$cronlog->logAction(FroxlorLogger::CRON_ACTION, LOG_DEBUG, "Renew-hook is enabled - adjusting configurations");
|
|
|
|
|
|
|
|
|
|
$certificate_folder = self::getCertificateFolder(strtolower(Settings::Get('system.hostname')));
|
|
|
|
|
|
|
|
|
|
if (empty($certificate_folder)) {
|
|
|
|
|
$cronlog->logAction(FroxlorLogger::CRON_ACTION, LOG_INFO, "No certificate folder for '" . Settings::Get('system.hostname') . "' found");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$fullchain = FileDir::makeCorrectFile($certificate_folder . '/fullchain.cer');
|
|
|
|
|
$keyfile = FileDir::makeCorrectFile($certificate_folder . '/' . strtolower(Settings::Get('system.hostname')) . '.key');
|
|
|
|
|
$ca_file = FileDir::makeCorrectFile($certificate_folder . '/ca.cer');
|
|
|
|
|
|
|
|
|
|
if (!file_exists($fullchain) || !file_exists($keyfile) || !file_exists($ca_file)) {
|
|
|
|
|
$cronlog->logAction(FroxlorLogger::CRON_ACTION, LOG_INFO, "At least one of the required certificate files for '" . Settings::Get('system.hostname') . "' could not be found");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$dovecot_conf = '/etc/dovecot/conf.d/99-froxlor.ssl.conf'; // @fixme setting?
|
|
|
|
|
|
|
|
|
|
if (Settings::IsInList('system.le_renew_services', 'postfix')) {
|
|
|
|
|
// "postconf -e" for postfix
|
|
|
|
|
FileDir::safe_exec('postconf -e smtpd_tls_cert_file=' . escapeshellarg($fullchain));
|
|
|
|
|
FileDir::safe_exec('postconf -e smtpd_tls_key_file=' . escapeshellarg($keyfile));
|
|
|
|
|
}
|
|
|
|
|
if (Settings::IsInList('system.le_renew_services', 'dovecot')) {
|
|
|
|
|
// custom config for dovecot
|
|
|
|
|
$ssl_content = <<<EOSSL
|
|
|
|
|
# Autogenerated configuration by froxlor.
|
|
|
|
|
# Do not manually edit this file as it will be overwritten.
|
|
|
|
|
|
|
|
|
|
@@ -647,33 +674,35 @@ ssl = yes
|
|
|
|
|
ssl_cert = <{$fullchain}
|
|
|
|
|
ssl_key = <{$keyfile}
|
|
|
|
|
EOSSL;
|
|
|
|
|
file_put_contents($dovecot_conf, $ssl_content);
|
|
|
|
|
}
|
|
|
|
|
if (Settings::IsInList('system.le_renew_services', 'proftpd')) {
|
|
|
|
|
$proftpd_conf = '/etc/proftpd/tls.conf'; // @fixme setting?
|
|
|
|
|
$rval = false;
|
|
|
|
|
// ECC certificate or not?
|
|
|
|
|
if (strpos($certificate_folder, '_ecc') === false) {
|
|
|
|
|
// comment out ECC related settings
|
|
|
|
|
FileDir::safe_exec("sed -i.bak 's|^TLSECCertificateFile|# TLSECCertificateFile|' " . escapeshellarg($proftpd_conf), $rval, ['|', '?']);
|
|
|
|
|
FileDir::safe_exec("sed -i.bak 's|^TLSECCertificateKeyFile|# TLSECCertificateKeyFile|' " . escapeshellarg($proftpd_conf), $rval, ['|', '?']);
|
|
|
|
|
// add RSA directives
|
|
|
|
|
FileDir::safe_exec("sed -i.bak 's|^#\?\s\?TLSRSACertificateFile.*|TLSRSACertificateFile " . $fullchain . "|' " . escapeshellarg($proftpd_conf), $rval, ['|', '?']);
|
|
|
|
|
FileDir::safe_exec("sed -i.bak 's|^#\?\s\?TLSRSACertificateKeyFile.*|TLSRSACertificateKeyFile " . $keyfile . "|' " . escapeshellarg($proftpd_conf), $rval, ['|', '?']);
|
|
|
|
|
} else {
|
|
|
|
|
// comment out RSA related settings
|
|
|
|
|
FileDir::safe_exec("sed -i.bak 's|^TLSRSACertificateFile|# TLSRSACertificateFile|' " . escapeshellarg($proftpd_conf), $rval, ['|', '?']);
|
|
|
|
|
FileDir::safe_exec("sed -i.bak 's|^TLSRSACertificateKeyFile|# TLSRSACertificateKeyFile|' " . escapeshellarg($proftpd_conf), $rval, ['|', '?']);
|
|
|
|
|
// add ECC directives
|
|
|
|
|
FileDir::safe_exec("sed -i.bak 's|^#\?\s\?TLSECCertificateFile.*|TLSECCertificateFile " . $fullchain . "|' " . escapeshellarg($proftpd_conf), $rval, ['|', '?']);
|
|
|
|
|
FileDir::safe_exec("sed -i.bak 's|^#\?\s\?TLSECCertificateKeyFile.*|TLSECCertificateKeyFile " . $keyfile . "|' " . escapeshellarg($proftpd_conf), $rval, ['|', '?']);
|
|
|
|
|
}
|
|
|
|
|
FileDir::safe_exec("sed -i.bak 's|^#\?\s\?TLSCACertificateFile.*|TLSCACertificateFile " . $ca_file . "|' " . escapeshellarg($proftpd_conf), $rval, ['|', '?']);
|
|
|
|
|
}
|
|
|
|
|
// reload the services
|
|
|
|
|
FileDir::safe_exec(Settings::Get('system.le_renew_hook'));
|
|
|
|
|
}
|
|
|
|
|
file_put_contents($dovecot_conf, $ssl_content);
|
|
|
|
|
} elseif (file_exists($dovecot_conf)) {
|
|
|
|
|
// safely remove the autogenerated config file
|
|
|
|
|
unlink($dovecot_conf);
|
|
|
|
|
}
|
|
|
|
|
if (Settings::IsInList('system.le_renew_services', 'proftpd')) {
|
|
|
|
|
$proftpd_conf = '/etc/proftpd/tls.conf'; // @fixme setting?
|
|
|
|
|
$rval = false;
|
|
|
|
|
// ECC certificate or not?
|
|
|
|
|
if (strpos($certificate_folder, '_ecc') === false) {
|
|
|
|
|
// comment out ECC related settings
|
|
|
|
|
FileDir::safe_exec("sed -i.bak 's|^TLSECCertificateFile|# TLSECCertificateFile|' " . escapeshellarg($proftpd_conf), $rval, ['|', '?']);
|
|
|
|
|
FileDir::safe_exec("sed -i.bak 's|^TLSECCertificateKeyFile|# TLSECCertificateKeyFile|' " . escapeshellarg($proftpd_conf), $rval, ['|', '?']);
|
|
|
|
|
// add RSA directives
|
|
|
|
|
FileDir::safe_exec("sed -i.bak 's|^#\?\s\?TLSRSACertificateFile.*|TLSRSACertificateFile " . $fullchain . "|' " . escapeshellarg($proftpd_conf), $rval, ['|', '?']);
|
|
|
|
|
FileDir::safe_exec("sed -i.bak 's|^#\?\s\?TLSRSACertificateKeyFile.*|TLSRSACertificateKeyFile " . $keyfile . "|' " . escapeshellarg($proftpd_conf), $rval, ['|', '?']);
|
|
|
|
|
} else {
|
|
|
|
|
// comment out RSA related settings
|
|
|
|
|
FileDir::safe_exec("sed -i.bak 's|^TLSRSACertificateFile|# TLSRSACertificateFile|' " . escapeshellarg($proftpd_conf), $rval, ['|', '?']);
|
|
|
|
|
FileDir::safe_exec("sed -i.bak 's|^TLSRSACertificateKeyFile|# TLSRSACertificateKeyFile|' " . escapeshellarg($proftpd_conf), $rval, ['|', '?']);
|
|
|
|
|
// add ECC directives
|
|
|
|
|
FileDir::safe_exec("sed -i.bak 's|^#\?\s\?TLSECCertificateFile.*|TLSECCertificateFile " . $fullchain . "|' " . escapeshellarg($proftpd_conf), $rval, ['|', '?']);
|
|
|
|
|
FileDir::safe_exec("sed -i.bak 's|^#\?\s\?TLSECCertificateKeyFile.*|TLSECCertificateKeyFile " . $keyfile . "|' " . escapeshellarg($proftpd_conf), $rval, ['|', '?']);
|
|
|
|
|
}
|
|
|
|
|
FileDir::safe_exec("sed -i.bak 's|^#\?\s\?TLSCACertificateFile.*|TLSCACertificateFile " . $ca_file . "|' " . escapeshellarg($proftpd_conf), $rval, ['|', '?']);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// reload the services
|
|
|
|
|
FileDir::safe_exec(Settings::Get('system.le_renew_hook'));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|