@@ -157,6 +157,34 @@ public function get_php_version() {
157157 else return true ;
158158 }
159159
160+ public function crypt_password ($ cleartext_password , $ charset = 'UTF-8 ' ) {
161+ if ($ charset != 'UTF-8 ' ) {
162+ $ cleartext_password = mb_convert_encoding ($ cleartext_password , $ charset , 'UTF-8 ' );
163+ }
164+
165+ if (defined ('CRYPT_SHA512 ' ) && CRYPT_SHA512 == 1 ) {
166+ $ salt = '$6$rounds=5000$ ' ;
167+ $ salt_length = 16 ;
168+ } elseif (defined ('CRYPT_SHA256 ' ) && CRYPT_SHA256 == 1 ) {
169+ $ salt = '$5$rounds=5000$ ' ;
170+ $ salt_length = 16 ;
171+ } else {
172+ $ salt = '$1$ ' ;
173+ $ salt_length = 12 ;
174+ }
175+
176+ if (function_exists ('openssl_random_pseudo_bytes ' )) {
177+ $ salt .= substr (bin2hex (openssl_random_pseudo_bytes ($ salt_length )), 0 , $ salt_length );
178+ } else {
179+ $ base64_alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789./ ' ;
180+ for ($ n = 0 ; $ n < $ salt_length ; $ n ++) {
181+ $ salt .= $ base64_alphabet [mt_rand (0 , 63 )];
182+ }
183+ }
184+ $ salt .= "$ " ;
185+ return crypt ($ cleartext_password , $ salt );
186+ }
187+
160188 //** Detect installed applications
161189 public function find_installed_apps () {
162190 global $ conf ;
@@ -2871,8 +2899,13 @@ public function make_ispconfig_ssl_cert() {
28712899 $ ip_address_match = true ;
28722900 }
28732901
2902+ // Get subject and issuer of ispserver.crt to check if it is self-signed cert
2903+ if (file_exists ($ ssl_crt_file )) {
2904+ $ crt_subject = exec ("openssl x509 -in " .escapeshellarg ($ ssl_crt_file )." -inform PEM -noout -subject " );
2905+ $ crt_issuer = exec ("openssl x509 -in " .escapeshellarg ($ ssl_crt_file )." -inform PEM -noout -issuer " );
2906+ }
28742907
2875- if ((!@is_dir ($ acme_cert_dir ) || !@file_exists ($ check_acme_file ) || !@file_exists ($ ssl_crt_file ) || md5_file ($ check_acme_file ) != md5_file ($ ssl_crt_file )) && $ ip_address_match == true ) {
2908+ if ((@ file_exists ( $ ssl_crt_file ) && ( $ crt_subject == $ crt_issuer )) || ( !@is_dir ($ acme_cert_dir ) || !@file_exists ($ check_acme_file ) || !@file_exists ($ ssl_crt_file ) || md5_file ($ check_acme_file ) != md5_file ($ ssl_crt_file )) && $ ip_address_match == true ) {
28762909
28772910 // This script is needed earlier to check and open http port 80 or standalone might fail
28782911 // Make executable and temporary symlink latest letsencrypt pre, post and renew hook script before install
@@ -2942,6 +2975,14 @@ public function make_ispconfig_ssl_cert() {
29422975
29432976 $ issued_successfully = false ;
29442977
2978+ // Backup existing ispserver ssl files
2979+ if (file_exists ($ ssl_crt_file ) || is_link ($ ssl_crt_file ))
2980+ rename ($ ssl_crt_file , $ ssl_crt_file .'-temporary.bak ' );
2981+ if (file_exists ($ ssl_key_file ) || is_link ($ ssl_key_file ))
2982+ rename ($ ssl_key_file , $ ssl_key_file .'-temporary.bak ' );
2983+ if (file_exists ($ ssl_pem_file ) || is_link ($ ssl_pem_file ))
2984+ rename ($ ssl_pem_file , $ ssl_pem_file .'-temporary.bak ' );
2985+
29452986 // Attempt to use Neilpang acme.sh first, as it is now the preferred LE client
29462987 if (is_executable ($ acme )) {
29472988
@@ -2958,18 +2999,6 @@ public function make_ispconfig_ssl_cert() {
29582999 if ($ ret == 0 || ($ ret == 2 && file_exists ($ check_acme_file ))) {
29593000 // acme.sh returns with 2 on issue for already existing certificate
29603001
2961-
2962- // Backup existing ispserver ssl files
2963- if (file_exists ($ ssl_crt_file ) || is_link ($ ssl_crt_file )) {
2964- rename ($ ssl_crt_file , $ ssl_crt_file . '- ' . $ date ->format ('YmdHis ' ) . '.bak ' );
2965- }
2966- if (file_exists ($ ssl_key_file ) || is_link ($ ssl_key_file )) {
2967- rename ($ ssl_key_file , $ ssl_key_file . '- ' . $ date ->format ('YmdHis ' ) . '.bak ' );
2968- }
2969- if (file_exists ($ ssl_pem_file ) || is_link ($ ssl_pem_file )) {
2970- rename ($ ssl_pem_file , $ ssl_pem_file . '- ' . $ date ->format ('YmdHis ' ) . '.bak ' );
2971- }
2972-
29733002 $ check_acme_file = $ ssl_crt_file ;
29743003
29753004 // Define LE certs name and path, then install them
@@ -2978,8 +3007,26 @@ public function make_ispconfig_ssl_cert() {
29783007 $ acme_chain = "--fullchain-file " . escapeshellarg ($ ssl_crt_file );
29793008 exec ("$ acme --install-cert -d " . escapeshellarg ($ hostname ) . " $ acme_key $ acme_chain " );
29803009 $ issued_successfully = true ;
3010+
3011+ // Make temporary backup of self-signed certs permanent
3012+ if (file_exists ($ ssl_crt_file .'-temporary.bak ' ) || is_link ($ ssl_crt_file .'-temporary.bak ' ))
3013+ rename ($ ssl_crt_file .'-temporary.bak ' , $ ssl_crt_file .'- ' .$ date ->format ('YmdHis ' ).'.bak ' );
3014+ if (file_exists ($ ssl_key_file .'-temporary.bak ' ) || is_link ($ ssl_key_file .'-temporary.bak ' ))
3015+ rename ($ ssl_key_file .'-temporary.bak ' , $ ssl_key_file .'- ' .$ date ->format ('YmdHis ' ).'.bak ' );
3016+ if (file_exists ($ ssl_pem_file .'-temporary.bak ' ) || is_link ($ ssl_pem_file .'-temporary.bak ' ))
3017+ rename ($ ssl_pem_file .'-temporary.bak ' , $ ssl_pem_file .'- ' .$ date ->format ('YmdHis ' ).'.bak ' );
3018+
29813019 } else {
29823020 swriteln ('Issuing certificate via acme.sh failed. Please check that your hostname can be verified by letsencrypt ' );
3021+
3022+ // Restore temporary backup of self-signed certs
3023+ if (file_exists ($ ssl_crt_file .'-temporary.bak ' ) || is_link ($ ssl_crt_file .'-temporary.bak ' ))
3024+ rename ($ ssl_crt_file .'-temporary.bak ' , $ ssl_crt_file );
3025+ if (file_exists ($ ssl_key_file .'-temporary.bak ' ) || is_link ($ ssl_key_file .'-temporary.bak ' ))
3026+ rename ($ ssl_key_file .'-temporary.bak ' , $ ssl_key_file );
3027+ if (file_exists ($ ssl_pem_file .'-temporary.bak ' ) || is_link ($ ssl_pem_file .'-temporary.bak ' ))
3028+ rename ($ ssl_pem_file .'-temporary.bak ' , $ ssl_pem_file );
3029+
29833030 }
29843031 // Else, we attempt to use the official LE certbot client certbot
29853032 } else {
@@ -3011,24 +3058,31 @@ public function make_ispconfig_ssl_cert() {
30113058 if ($ ret == 0 ) {
30123059 // certbot returns with 0 on issue for already existing certificate
30133060
3014- // Backup existing ispserver ssl files
3015- if (file_exists ($ ssl_crt_file ) || is_link ($ ssl_crt_file )) {
3016- rename ($ ssl_crt_file , $ ssl_crt_file . '- ' . $ date ->format ('YmdHis ' ) . '.bak ' );
3017- }
3018- if (file_exists ($ ssl_key_file ) || is_link ($ ssl_key_file )) {
3019- rename ($ ssl_key_file , $ ssl_key_file . '- ' . $ date ->format ('YmdHis ' ) . '.bak ' );
3020- }
3021- if (file_exists ($ ssl_pem_file ) || is_link ($ ssl_pem_file )) {
3022- rename ($ ssl_pem_file , $ ssl_pem_file . '- ' . $ date ->format ('YmdHis ' ) . '.bak ' );
3023- }
3024-
30253061 $ acme_cert_dir = '/etc/letsencrypt/live/ ' . $ hostname ;
30263062 symlink ($ acme_cert_dir . '/fullchain.pem ' , $ ssl_crt_file );
30273063 symlink ($ acme_cert_dir . '/privkey.pem ' , $ ssl_key_file );
30283064
30293065 $ issued_successfully = true ;
3066+
3067+ // Make temporary backup of self-signed certs permanent
3068+ if (file_exists ($ ssl_crt_file .'-temporary.bak ' ) || is_link ($ ssl_crt_file .'-temporary.bak ' ))
3069+ rename ($ ssl_crt_file .'-temporary.bak ' , $ ssl_crt_file .'- ' .$ date ->format ('YmdHis ' ).'.bak ' );
3070+ if (file_exists ($ ssl_key_file .'-temporary.bak ' ) || is_link ($ ssl_key_file .'-temporary.bak ' ))
3071+ rename ($ ssl_key_file .'-temporary.bak ' , $ ssl_key_file .'- ' .$ date ->format ('YmdHis ' ).'.bak ' );
3072+ if (file_exists ($ ssl_pem_file .'-temporary.bak ' ) || is_link ($ ssl_pem_file .'-temporary.bak ' ))
3073+ rename ($ ssl_pem_file .'-temporary.bak ' , $ ssl_pem_file .'- ' .$ date ->format ('YmdHis ' ).'.bak ' );
3074+
30303075 } else {
30313076 swriteln ('Issuing certificate via certbot failed. Please check log files and make sure that your hostname can be verified by letsencrypt ' );
3077+
3078+ // Restore temporary backup of self-signed certs
3079+ if (file_exists ($ ssl_crt_file .'-temporary.bak ' ) || is_link ($ ssl_crt_file .'-temporary.bak ' ))
3080+ rename ($ ssl_crt_file .'-temporary.bak ' , $ ssl_crt_file );
3081+ if (file_exists ($ ssl_key_file .'-temporary.bak ' ) || is_link ($ ssl_key_file .'-temporary.bak ' ))
3082+ rename ($ ssl_key_file .'-temporary.bak ' , $ ssl_key_file );
3083+ if (file_exists ($ ssl_pem_file .'-temporary.bak ' ) || is_link ($ ssl_pem_file .'-temporary.bak ' ))
3084+ rename ($ ssl_pem_file .'-temporary.bak ' , $ ssl_pem_file );
3085+
30323086 }
30333087 } else {
30343088 swriteln ('Did not find any valid acme client (acme.sh or certbot) ' );
@@ -3415,8 +3469,8 @@ public function install_ispconfig() {
34153469 caselog ($ command .' &> /dev/null ' , __FILE__ , __LINE__ , "EXECUTED: $ command " , "Failed to execute the command $ command " );
34163470
34173471 if ($ this ->install_ispconfig_interface == true && isset ($ conf ['interface_password ' ]) && $ conf ['interface_password ' ]!='admin ' ) {
3418- $ sql = "UPDATE sys_user SET passwort = md5(?) WHERE username = 'admin'; " ;
3419- $ this ->db ->query ($ sql , $ conf ['interface_password ' ]);
3472+ $ sql = "UPDATE sys_user SET passwort = ? WHERE username = 'admin'; " ;
3473+ $ this ->db ->query ($ sql , $ this -> crypt_password ( $ conf ['interface_password ' ]) );
34203474 }
34213475
34223476 if ($ conf ['apache ' ]['installed ' ] == true && $ this ->install_ispconfig_interface == true ){
@@ -3560,6 +3614,7 @@ public function install_ispconfig() {
35603614 if (!is_dir ($ conf ['ispconfig_log_dir ' ])) mkdir ($ conf ['ispconfig_log_dir ' ], 0755 );
35613615 touch ($ conf ['ispconfig_log_dir ' ].'/ispconfig.log ' );
35623616 }
3617+ chmod ($ conf ['ispconfig_log_dir ' ].'/ispconfig.log ' , 0600 );
35633618
35643619 //* Create the ispconfig auth log file and set uid/gid
35653620 if (!is_file ($ conf ['ispconfig_log_dir ' ].'/auth.log ' )) {
0 commit comments