Skip to content

Commit 7b0a2e9

Browse files
author
Serghey Rodin
committed
Vesta SSL Certificate Management
1 parent e343bf6 commit 7b0a2e9

File tree

4 files changed

+368
-4
lines changed

4 files changed

+368
-4
lines changed

bin/v-change-sys-vesta-ssl

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
#!/bin/bash
2+
# info: change vesta ssl certificate
3+
# options: SSL_DIR [RESTART]
4+
#
5+
# The function changes vesta SSL certificate and the key.
6+
7+
8+
#----------------------------------------------------------#
9+
# Variable&Function #
10+
#----------------------------------------------------------#
11+
12+
# Argument definition
13+
domain='certificate'
14+
ssl_dir=$1
15+
restart=$2
16+
17+
# Includes
18+
source $VESTA/func/main.sh
19+
source $VESTA/func/domain.sh
20+
source $VESTA/conf/vesta.conf
21+
22+
23+
#----------------------------------------------------------#
24+
# Verifications #
25+
#----------------------------------------------------------#
26+
27+
check_args '1' "$#" 'SSL_DIR [RESTART]'
28+
is_format_valid 'ssl_dir'
29+
30+
31+
#----------------------------------------------------------#
32+
# Action #
33+
#----------------------------------------------------------#
34+
35+
# Checking new certificate
36+
certificate=$(cat $ssl_dir/$domain.crt |grep -n END)
37+
certificate_count=$(echo "$certificate" |wc -l)
38+
if [ "$certificate_count" -gt 1 ]; then
39+
crt_end=$(echo "$certificate" |head -n1 |cut -f 1 -d :)
40+
crt_lines=$(wc -l $ssl_dir/$domain.crt |cut -f1 -d ' ')
41+
pem_begin=$((crt_lines - crt_end))
42+
mv $ssl_dir/$domain.crt $ssl_dir/$domain.crt_full
43+
head -n $crt_end $ssl_dir/$domain.crt_full > $ssl_dir/$domain.crt
44+
tail -n $pem_begin $ssl_dir/$domain.crt_full > $ssl_dir/$domain.ca
45+
is_web_domain_cert_valid
46+
mv -f $ssl_dir/$domain.crt_full $ssl_dir/$domain.crt
47+
rm -f $ssl_dir/$domain.ca
48+
else
49+
is_web_domain_cert_valid
50+
fi
51+
52+
# Moving old certificate
53+
mv $VESTA/ssl/certificate.crt $VESTA/ssl/certificate.crt.back
54+
mv $VESTA/ssl/certificate.key $VESTA/ssl/certificate.key.back
55+
56+
# Adding new certificate
57+
cp -f $ssl_dir/certificate.crt $VESTA/ssl/certificate.crt
58+
cp -f $ssl_dir/certificate.key $VESTA/ssl/certificate.key
59+
60+
61+
#----------------------------------------------------------#
62+
# Vesta #
63+
#----------------------------------------------------------#
64+
65+
# Restarting web server
66+
if [ "$restart" != 'no' ]; then
67+
kill -HUP $(cat /var/run/vesta-nginx.pid)
68+
$BIN/v-restart-mail
69+
if [ ! -z "$IMAP_SYSTEM" ]; then
70+
v-restart-service "$IMAP_SYSTEM"
71+
fi
72+
fi
73+
74+
# Logging
75+
log_event "$OK" "$ARGUMENTS"
76+
77+
exit

bin/v-list-sys-vesta-ssl

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
#!/bin/bash
2+
# info: list vesta ssl certificate
3+
# options: [FORMAT]
4+
#
5+
# The function of obtaining vesta ssl files.
6+
7+
8+
#----------------------------------------------------------#
9+
# Variable&Function #
10+
#----------------------------------------------------------#
11+
12+
# Argument definition
13+
format=${1-shell}
14+
15+
# Includes
16+
source $VESTA/func/main.sh
17+
18+
# JSON list function
19+
json_list() {
20+
echo '{'
21+
echo -e "\t\"VESTA\": {"
22+
echo " \"CRT\": \"$crt\","
23+
echo " \"KEY\": \"$key\","
24+
echo " \"CA\": \"$ca\","
25+
echo " \"SUBJECT\": \"$subj\","
26+
echo " \"ALIASES\": \"$alt_dns\","
27+
echo " \"NOT_BEFORE\": \"$before\","
28+
echo " \"NOT_AFTER\": \"$after\","
29+
echo " \"SIGNATURE\": \"$signature\","
30+
echo " \"PUB_KEY\": \"$pub_key\","
31+
echo " \"ISSUER\": \"$issuer\""
32+
echo -e "\t}\n}"
33+
}
34+
35+
# SHELL list function
36+
shell_list() {
37+
if [ ! -z "$crt" ]; then
38+
echo -e "$crt"
39+
fi
40+
if [ ! -z "$key" ]; then
41+
echo -e "\n$key"
42+
fi
43+
if [ ! -z "$crt" ]; then
44+
echo
45+
echo
46+
echo "SUBJECT: $subj"
47+
if [ ! -z "$alt_dns" ]; then
48+
echo "ALIASES: ${alt_dns//,/ }"
49+
fi
50+
echo "VALID FROM: $before"
51+
echo "VALID TIL: $after"
52+
echo "SIGNATURE: $signature"
53+
echo "PUB_KEY: $pub_key"
54+
echo "ISSUER: $issuer"
55+
fi
56+
}
57+
58+
# PLAIN list function
59+
plain_list() {
60+
if [ ! -z "$crt" ]; then
61+
echo -e "$crt"
62+
fi
63+
if [ ! -z "$key" ]; then
64+
echo -e "\n$key"
65+
fi
66+
if [ ! -z "$ca" ]; then
67+
echo -e "\n$ca"
68+
fi
69+
if [ ! -z "$crt" ]; then
70+
echo "$subj"
71+
echo "${alt_dns//,/ }"
72+
echo "$before"
73+
echo "$after"
74+
echo "$signature"
75+
echo "$pub_key"
76+
echo "$issuer"
77+
fi
78+
79+
}
80+
81+
# CSV list function
82+
csv_list() {
83+
echo -n "CRT,KEY,CA,SUBJECT,ALIASES,NOT_BEFORE,NOT_AFTER,SIGNATURE,"
84+
echo "PUB_KEY,ISSUER"
85+
echo -n "\"$crt\",\"$key\",\"$ca\",\"$subj\",\"${alt_dns//,/ }\","
86+
echo "\"$before\",\"$after\",\"$signature\",\"$pub_key\",\"$issuer\""
87+
}
88+
89+
90+
#----------------------------------------------------------#
91+
# Verifications #
92+
#----------------------------------------------------------#
93+
94+
95+
96+
#----------------------------------------------------------#
97+
# Action #
98+
#----------------------------------------------------------#
99+
100+
# Parsing SSL certificate
101+
crt=$(cat $VESTA/ssl/certificate.crt |sed ':a;N;$!ba;s/\n/\\n/g')
102+
key=$(cat $VESTA/ssl/certificate.crt |sed ':a;N;$!ba;s/\n/\\n/g')
103+
104+
# Parsing SSL certificate details without CA
105+
info=$(openssl x509 -text -in $VESTA/ssl/certificate.crt)
106+
subj=$(echo "$info" |grep Subject: |cut -f 2 -d =)
107+
before=$(echo "$info" |grep Before: |sed -e "s/.*Before: //")
108+
after=$(echo "$info" |grep "After :" |sed -e "s/.*After : //")
109+
signature=$(echo "$info" |grep "Algorithm:" |head -n1 )
110+
signature=$(echo "$signature"| sed -e "s/.*Algorithm: //")
111+
pub_key=$(echo "$info" |grep Public-Key: |cut -f2 -d \( | tr -d \))
112+
issuer=$(echo "$info" |grep Issuer: |sed -e "s/.*Issuer: //")
113+
alt_dns=$(echo "$info" |grep DNS |sed -e 's/DNS:/\n/g' |tr -d ',')
114+
alt_dns=$(echo "$alt_dns" |tr -d ' ' |sed -e "/^$/d")
115+
alt_dns=$(echo "$alt_dns" |sed -e ':a;N;$!ba;s/\n/,/g')
116+
117+
# Listing data
118+
case $format in
119+
json) json_list ;;
120+
plain) plain_list ;;
121+
csv) csv_list ;;
122+
shell) shell_list ;;
123+
esac
124+
125+
126+
#----------------------------------------------------------#
127+
# Vesta #
128+
#----------------------------------------------------------#
129+
130+
exit

web/edit/server/index.php

Lines changed: 61 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,21 @@
7878
}
7979
}
8080

81+
// List ssl certificate info
82+
exec (VESTA_CMD."v-list-sys-vesta-ssl json", $output, $return_var);
83+
$ssl_str = json_decode(implode('', $output), true);
84+
unset($output);
85+
$v_ssl_crt = $ssl_str['VESTA']['CRT'];
86+
$v_ssl_key = $ssl_str['VESTA']['KEY'];
87+
$v_ssl_ca = $ssl_str['VESTA']['CA'];
88+
$v_ssl_subject = $ssl_str['VESTA']['SUBJECT'];
89+
$v_ssl_aliases = $ssl_str['VESTA']['ALIASES'];
90+
$v_ssl_not_before = $ssl_str['VESTA']['NOT_BEFORE'];
91+
$v_ssl_not_after = $ssl_str['VESTA']['NOT_AFTER'];
92+
$v_ssl_signature = $ssl_str['VESTA']['SIGNATURE'];
93+
$v_ssl_pub_key = $ssl_str['VESTA']['PUB_KEY'];
94+
$v_ssl_issuer = $ssl_str['VESTA']['ISSUER'];
95+
8196
// Check POST request
8297
if (!empty($_POST['save'])) {
8398

@@ -178,7 +193,6 @@
178193
}
179194
}
180195

181-
182196
// Update webmail url
183197
if (empty($_SESSION['error_msg'])) {
184198
if ($_POST['v_mail_url'] != $_SESSION['MAIL_URL']) {
@@ -231,7 +245,6 @@
231245
}
232246
}
233247

234-
235248
// Change backup gzip level
236249
if (empty($_SESSION['error_msg'])) {
237250
if ($_POST['v_backup_gzip'] != $v_backup_gzip ) {
@@ -323,7 +336,6 @@
323336
}
324337
}
325338

326-
327339
// Delete remote backup host
328340
if (empty($_SESSION['error_msg'])) {
329341
if ((empty($_POST['v_backup_host'])) && (!empty($v_backup_host))) {
@@ -340,6 +352,49 @@
340352
}
341353
}
342354

355+
// Update SSL certificate
356+
if ((!empty($_POST['v_ssl_crt'])) && (empty($_SESSION['error_msg']))) {
357+
if (($v_ssl_crt != str_replace("\r\n", "\n", $_POST['v_ssl_crt'])) || ($v_ssl_key != str_replace("\r\n", "\n", $_POST['v_ssl_key']))) {
358+
exec ('mktemp -d', $mktemp_output, $return_var);
359+
$tmpdir = $mktemp_output[0];
360+
361+
// Certificate
362+
if (!empty($_POST['v_ssl_crt'])) {
363+
$fp = fopen($tmpdir."/certificate.crt", 'w');
364+
fwrite($fp, str_replace("\r\n", "\n", $_POST['v_ssl_crt']));
365+
fwrite($fp, "\n");
366+
fclose($fp);
367+
}
368+
369+
// Key
370+
if (!empty($_POST['v_ssl_key'])) {
371+
$fp = fopen($tmpdir."/certificate.key", 'w');
372+
fwrite($fp, str_replace("\r\n", "\n", $_POST['v_ssl_key']));
373+
fwrite($fp, "\n");
374+
fclose($fp);
375+
}
376+
377+
exec (VESTA_CMD."v-change-sys-vesta-ssl ".$tmpdir, $output, $return_var);
378+
check_return_code($return_var,$output);
379+
unset($output);
380+
381+
// List ssl certificate info
382+
exec (VESTA_CMD."v-list-sys-vesta-ssl json", $output, $return_var);
383+
$ssl_str = json_decode(implode('', $output), true);
384+
unset($output);
385+
$v_ssl_crt = $ssl_str['VESTA']['CRT'];
386+
$v_ssl_key = $ssl_str['VESTA']['KEY'];
387+
$v_ssl_ca = $ssl_str['VESTA']['CA'];
388+
$v_ssl_subject = $ssl_str['VESTA']['SUBJECT'];
389+
$v_ssl_aliases = $ssl_str['VESTA']['ALIASES'];
390+
$v_ssl_not_before = $ssl_str['VESTA']['NOT_BEFORE'];
391+
$v_ssl_not_after = $ssl_str['VESTA']['NOT_AFTER'];
392+
$v_ssl_signature = $ssl_str['VESTA']['SIGNATURE'];
393+
$v_ssl_pub_key = $ssl_str['VESTA']['PUB_KEY'];
394+
$v_ssl_issuer = $ssl_str['VESTA']['ISSUER'];
395+
}
396+
}
397+
343398
// Flush field values on success
344399
if (empty($_SESSION['error_msg'])) {
345400
$_SESSION['ok_msg'] = __('Changes has been saved.');
@@ -375,7 +430,6 @@
375430
}
376431
}
377432

378-
379433
// activating filemanager licence
380434
if (empty($_SESSION['error_msg'])) {
381435
if($_SESSION['FILEMANAGER_KEY'] != $_POST['v_filemanager_licence'] && $_POST['v_filemanager'] == 'yes'){
@@ -410,11 +464,14 @@
410464
// Check system configuration
411465
exec (VESTA_CMD . "v-list-sys-config json", $output, $return_var);
412466
$data = json_decode(implode('', $output), true);
467+
unset($output);
468+
413469
$sys_arr = $data['config'];
414470
foreach ($sys_arr as $key => $value) {
415471
$_SESSION[$key] = $value;
416472
}
417473

474+
418475
// Render page
419476
render_page($user, $TAB, 'edit_server');
420477

0 commit comments

Comments
 (0)