\n"; print $text{'cert_breakdesc'},"
\n"; print &ui_form_start("break_cert.cgi"); print &ui_hidden("dom", $d->{'id'}); print &ui_form_end([ [ undef, $text{'cert_break'} ] ]); &ui_print_footer(&domain_footer_link($d), "", $text{'index_return'}); return; } # Get ACME providers, if there are any my @provs; if (defined(&list_acme_providers)) { @provs = grep { &can_acme_provider($_) || $d->{'letsencrypt_id'} eq $_->{'id'} } &list_acme_providers(); %known = map { $_->{'id'}, $_ } &list_known_acme_providers(); foreach my $p (@provs) { if (!$p->{'desc'} && $p->{'type'}) { $p->{'desc'} = $known{$p->{'type'}}->{'desc'}; } } } # Show tabs $prog = "cert_form.cgi?dom=$in{'dom'}&mode="; @tabs = ( [ "current", $text{'cert_tabcurrent'}, $prog."current" ], [ "csr", $text{'cert_tabcsr'}, $prog."csr" ], [ "self", $text{'cert_tabself'}, $prog."self" ], -r $d->{'ssl_newkey'} ? ( [ "savecsr", $text{'cert_tabsavecsr'}, $prog."savecsr" ] ) : ( ), [ "new", $text{'cert_tabnew'}, $prog."new" ], &can_edit_letsencrypt() && (@provs || !defined(&list_acme_providers)) && (&domain_has_website($d) || $d->{'dns'}) ? ( [ "lets", $text{'cert_tabacme'}, $prog."lets" ] ) : ( ), ); print &ui_tabs_start(\@tabs, "mode", $in{'mode'} || "current", 1); # Details of current cert print &ui_tabs_start_tab("mode", "current"); if (&domain_has_ssl_cert($d)) { print "
$text{'cert_desc2'}
",$text{'cert_noneyet'},"
\n"; # Show warning if there is a CSR outstanding if ($d->{'ssl_csr'} && -r $d->{'ssl_csr'}) { print &ui_alert_box(&text('cert_csrwarn', "".&home_relative_path($d, $d->{'ssl_csr'})."", "".&home_relative_path($d, $d->{'ssl_newkey'}).""), 'warn'); } print &ui_form_start("csr.cgi"); print &ui_hidden("dom", $in{'dom'}); print &ui_table_start($text{'cert_header1'}, undef, 2); &print_cert_fields(0); print &ui_table_end(); print &ui_form_end([ [ undef, $text{'cert_csrok'} ] ]); print &ui_tabs_end_tab(); ########################## # Self-signed key generation form print &ui_tabs_start_tab("mode", "self"); print "$text{'cert_desc6'}
\n"; # Show warning if there is an existing key if ($d->{'ssl_key'} && -r $d->{'ssl_key'} && !&self_signed_cert($d)) { print &ui_alert_box(&text('cert_keywarn', "".&home_relative_path($d, $d->{'ssl_cert'})."", "".&home_relative_path($d, $d->{'ssl_key'}).""), 'warn'); } print &ui_form_start("csr.cgi"); print &ui_hidden("dom", $in{'dom'}); print &ui_hidden("self", 1); print &ui_table_start($text{'cert_header6'}, undef, 2); &print_cert_fields(1); print &ui_table_end(); print &ui_form_end([ [ undef, $text{'cert_self'} ] ]); print &ui_tabs_end_tab(); ########################## # Apply signed cert form print &ui_tabs_start_tab("mode", "savecsr"); print "$text{'cert_desc7'}
\n"; print &ui_form_start("newkey.cgi", "form-data"); print &ui_hidden("dom", $in{'dom'}); print &ui_table_start($text{'cert_header7'}, undef, 2); # Cert print &ui_table_row($text{'cert_cert'}, &ui_radio_table("cert_mode", 0, [ [ 0, $text{'cert_cert0'}, &ui_textarea("cert", undef, 8, 70) ], [ 1, $text{'cert_cert1'}, &ui_upload("certupload") ], [ 2, $text{'cert_cert2'}, &ui_textbox("certfile", undef, 70)." ". &file_chooser_button("certfile") ] ])); # Use saved key from when CSR was generated print &ui_hidden("newkey_mode", 4); print &ui_hidden("newca_mode", 3); print &ui_table_end(); print &ui_form_end([ [ "ok", $text{'cert_newok'} ] ]); print &ui_tabs_end_tab(); ########################## # New key, cert and CA form print &ui_tabs_start_tab("mode", "new"); print "$text{'cert_desc3'}
\n"; print "$text{'cert_desc3a'}
\n"; print &ui_form_start("newkey.cgi", "form-data"); print &ui_hidden("dom", $in{'dom'}); print &ui_table_start($text{'cert_header3'}, undef, 2); # Cert my $gotcert = $d->{'ssl_cert'} && -r $d->{'ssl_cert'}; print &ui_table_row($text{'cert_cert'}, &ui_radio_table("cert_mode", $gotcert ? 3 : 0, [ $gotcert ? ( [ 3, $text{'cert_newcertkeep'} ] ) : ( ), [ 0, $text{'cert_cert0'}, &ui_textarea("cert", undef, 8, 70) ], [ 1, $text{'cert_cert1'}, &ui_upload("certupload") ], [ 2, $text{'cert_cert2'}, &ui_filebox("certfile", $d->{'ssl_cert'}, 70) ] ])); # Key my $gotkey = $d->{'ssl_key'} && -r $d->{'ssl_key'}; print &ui_table_row($text{'cert_newkey'}, &ui_radio_table("newkey_mode", $gotkey ? 3 : 0, [ $gotkey ? ( [ 3, $text{'cert_newkeykeep'} ] ) : ( ), [ 0, $text{'cert_cert0'}, &ui_textarea("newkey", undef, 8, 70) ], [ 1, $text{'cert_cert1'}, &ui_upload("newkeyupload") ], [ 2, $text{'cert_cert2'}, &ui_filebox("newkeyfile", $d->{'ssl_key'}, 70) ] ])); # Passphrase on key print &ui_table_row($text{'cert_pass'}, &ui_opt_textbox("pass", undef, 20, $text{'cert_nopass'})); # CA cert my $gotca = $d->{'ssl_chain'} && -r $d->{'ssl_chain'}; print &ui_table_row($text{'cert_newca'}, &ui_radio_table("newca_mode", $gotca ? 3 : 4, [ $gotca ? ( [ 3, $text{'cert_newcakeep'} ] ) : ( ), [ 4, $text{'cert_chain0'} ], [ 0, $text{'cert_cert0'}, &ui_textarea("newca", undef, 8, 70) ], [ 1, $text{'cert_cert1'}, &ui_upload("newcaupload") ], [ 2, $text{'cert_cert2'}, &ui_filebox("newcafile", $d->{'ssl_chain'}, 70) ] ])); print &ui_table_end(); print &ui_form_end([ [ "ok", $text{'cert_newok'} ] ]); print &ui_tabs_end_tab(); # Let's encrypt tab if (&can_edit_letsencrypt() && (&domain_has_website($d) || $d->{'dns'})) { &foreign_require("webmin"); $err = &webmin::check_letsencrypt(); print &ui_tabs_start_tab("mode", "lets"); print "$text{'cert_desc9'}\n"; if (defined(&can_acme_providers) && &can_acme_providers()) { print &text('cert_acmelink', 'pro/edit_newacmes.cgi'),"\n"; } print "
\n"; if ($err) { print &text('cert_elets', $err),"
\n"; if (&master_admin() && defined(&webmin::get_letsencrypt_install_message)) { my $msg = &webmin::get_letsencrypt_install_message( "/$module_name/cert_form.cgi?dom=$d->{'id'}&mode=$in{'mode'}", $text{'cert_title'}); print $msg,"
\n"; } } else { $phd = &public_html_dir($d); print &text('cert_acmedesc', "$phd"),"
\n"; print &ui_form_start("letsencrypt.cgi"); print &ui_hidden("dom", $in{'dom'}); print &ui_table_start(undef, undef, 2); # Domain names to request cert for @defnames = &get_hostnames_for_ssl($d); $dis1 = &js_disable_inputs([ "dname" ], [ ], "onClick"); $dis0 = &js_disable_inputs([ ], [ "dname" ], "onClick"); $wildcb = ""; &foreign_require("webmin"); if ($webmin::letsencrypt_cmd && $d->{'dns'}) { $wildcb = "".&ui_checkbox( "dwild", 1, $text{'cert_dwild'}, $d->{'letsencrypt_dwild'}); } print &ui_table_row($text{'cert_dnamefor'}, &ui_radio_table("dname_def", $d->{'letsencrypt_dname'} ? 0 : 1, [ [ 1, $text{'cert_dnamedef'}, join("\n", map { "$_" } @defnames), $dis1 ], [ 0, $text{'cert_dnamesel'}, &ui_textarea("dname", join("\n", split(/\s+/, $d->{'letsencrypt_dname'})), 5, 60, undef, $d->{'letsencrypt_dname'} ? 0 : 1). $wildcb, $dis0 ] ])); # SSL certificate provider if (defined(&list_acme_providers)) { print &ui_table_row($text{'cert_acmes'}, &ui_select("acme", $d->{'letsencrypt_id'}, [ map { [ $_->{'id'}, $_->{'desc'} ] } @provs ])); } else { print &ui_table_row($text{'cert_acmes'}, $text{'acme_letsencrypt'}); } # Setup automatic renewal? print &ui_table_row($text{'cert_letsrenew2'}, &ui_yesno_radio("renew", $d->{'letsencrypt_renew'} ? 1 : 0)); # Renewal email option print &ui_table_row($text{'cert_letsemail'}, &ui_radio("email", $d->{'letsencrypt_email'} || 0, [ [ 0, $text{'yes'} ], [ 1, $text{'cert_letsemailerr'} ], [ 2, $text{'no'} ] ])); # Test connectivity first? if (defined(&check_domain_connectivity)) { my $conn = $d->{'letsencrypt_connectivity'} // $tmpl->{'ssl_connectivity'} // 1; print &ui_table_row($text{'cert_connectivity'}, &ui_radio("connectivity", $conn, [ [ 2, $text{'cert_connectivity2'} ], [ 1, $text{'cert_connectivity1'} ], [ 0, $text{'cert_connectivity0'} ] ])); } # Hostname filter mode my $filter = $d->{'letsencrypt_subset'} ? 2 : !$d->{'letsencrypt_nodnscheck'} ? 1 : 0; print &ui_table_row($text{'cert_hostfilter'}, &ui_radio("hostfilter", $filter, [ [ 0, $text{'cert_hostfilter0'}."" ], [ 1, $text{'cert_hostfilter1'}."" ], [ 2, $text{'cert_hostfilter2'} ] ])); # Certificate type, if supported if (&letsencrypt_supports_ec()) { print &ui_table_row($text{'cert_hash'}, &ui_select("ctype", $d->{'letsencrypt_ctype'}, [ [ "rsa", $text{'cert_type_rsa'} ], [ "ecdsa", $text{'cert_type_ec'} ] ])); } # Recent renewal details if ($d->{'letsencrypt_last'}) { $ago = (time() - $d->{'letsencrypt_last'}) / (30*24*60*60); print &ui_table_row($text{'cert_letsage'}, &text('cert_letsmonths', sprintf("%.2f",$ago))); } if ($d->{'letsencrypt_last_success'}) { print &ui_table_row($text{'cert_lets_success'}, &make_date($d->{'letsencrypt_last_success'})); } if ($d->{'letsencrypt_last_failure'} && $d->{'letsencrypt_last_failure'} > $d->{'letsencrypt_last_success'}) { print &ui_table_row($text{'cert_lets_failure'}, "". &make_date($d->{'letsencrypt_last_failure'}). ""); if ($d->{'letsencrypt_last_err'}) { my $err = $d->{'letsencrypt_last_err'}; $err =~ s/\t/\n/g; print &ui_table_row($text{'cert_lets_freason'}, "".$err.""); } } print &ui_table_end(); print &ui_form_end([ [ undef, $text{'cert_letsok'} ], [ 'only', $text{'cert_letsonly'} ] ]); } print &ui_tabs_end_tab(); } print &ui_tabs_end(1); # Make sure the left menu is showing this domain if (defined(&theme_select_domain)) { &theme_select_domain($d); } &ui_print_footer(&domain_footer_link($d), "", $text{'index_return'}); # print_cert_fields(show-days) sub print_cert_fields { local ($showdays) = @_; print &ui_table_row($webmin::text{'ssl_cn'}, &ui_textbox("commonName", "www.$d->{'dom'}", 30)); $alts = join("\n", map { "www.".$_->{'dom'} } @others); print &ui_table_row($text{'cert_alt'}, &ui_textarea("subjectAltName", $alts, 5, 30)); print &ui_table_row($webmin::text{'ca_email'}, &ui_textbox("emailAddress", $d->{'emailto_addr'}, 30)); print &ui_table_row($webmin::text{'ca_ou'}, &ui_textbox("organizationalUnitName", undef, 30)); print &ui_table_row($webmin::text{'ca_o'}, &ui_textbox("organizationName", $d->{'owner'}, 30)); print &ui_table_row($webmin::text{'ca_city'} || $text{'cert_city'}, &ui_textbox("cityName", undef, 30)); print &ui_table_row($webmin::text{'ca_sp'}, &ui_textbox("stateOrProvinceName", undef, 15)); print &ui_table_row($webmin::text{'ca_c'}, &ui_textbox("countryName", undef, 2)); $key_size = $tmpl->{'ssl_key_size'}; $key_size = undef if ($key_size == $webmin::default_key_size); print &ui_table_row($webmin::text{'ssl_size'}, &ui_opt_textbox("size", $key_size, 6, "$text{'default'} ($webmin::default_key_size)"). " ".$text{'ssl_bits'}); if ($showdays) { print &ui_table_row($webmin::text{'ssl_days'}, &ui_textbox("days", 1825, 8)); } print &ui_table_row($text{'cert_hash'}, &ui_select("hash", $tmpl->{'ssl_cert_type'}, [ [ "sha1", "SHA1" ], [ "sha2", "SHA2" ], [ "ecdsa", $text{'cert_type_ec'} ] ])); }