Software /
code /
prosody
Comparison
prosodyctl @ 4824:73e261ed00a9
prosodyctl: Use util.openssl in certificate helpers. Improve feedback
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Wed, 09 May 2012 00:33:55 +0200 |
parent | 4815:04e6115e060b |
child | 4826:1c4852da78c8 |
comparison
equal
deleted
inserted
replaced
4823:a61e78b4a2b3 | 4824:73e261ed00a9 |
---|---|
611 | 611 |
612 show_message(error_messages[msg]) | 612 show_message(error_messages[msg]) |
613 return 1; | 613 return 1; |
614 end | 614 end |
615 | 615 |
616 local x509 = require "util.x509"; | 616 local openssl = require "util.openssl"; |
617 local genx509san = x509.genx509san; | |
618 local opensslbaseconf = x509.baseconf; | |
619 local seralizeopensslbaseconf = x509.serialize_conf; | |
620 | 617 |
621 local cert_commands = {}; | 618 local cert_commands = {}; |
622 | 619 |
623 -- TODO Should this be moved to util.prosodyctl or x509? | |
624 function cert_commands.config(arg) | 620 function cert_commands.config(arg) |
625 if #arg >= 1 and arg[1] ~= "--help" then | 621 if #arg >= 1 and arg[1] ~= "--help" then |
626 local conf_filename = (CFG_DATADIR or ".") .. "/" .. arg[1] .. ".cnf"; | 622 local conf_filename = (CFG_DATADIR or ".") .. "/" .. arg[1] .. ".cnf"; |
627 if os.execute("test -f "..conf_filename) == 0 | 623 if os.execute("test -f "..conf_filename) == 0 |
628 and not show_yesno("Overwrite "..conf_filename .. "?") then | 624 and not show_yesno("Overwrite "..conf_filename .. "?") then |
629 return nil, conf_filename; | 625 return nil, conf_filename; |
630 end | 626 end |
631 local conf = opensslbaseconf(); | 627 local conf = openssl.config.new(); |
632 conf.subject_alternative_name = genx509san(hosts, config, arg, true) | 628 conf:from_prosody(hosts, config, arg); |
633 for k, v in pairs(conf.distinguished_name) do | 629 for k, v in pairs(conf.distinguished_name) do |
634 local nv; | 630 local nv; |
635 if k == "commonName" then | 631 if k == "commonName" then |
636 v = arg[1] | 632 v = arg[1] |
637 elseif k == "emailAddress" then | 633 elseif k == "emailAddress" then |
640 nv = show_prompt(("%s (%s):"):format(k, nv or v)); | 636 nv = show_prompt(("%s (%s):"):format(k, nv or v)); |
641 nv = (not nv or nv == "") and v or nv; | 637 nv = (not nv or nv == "") and v or nv; |
642 conf.distinguished_name[k] = nv ~= "." and nv or nil; | 638 conf.distinguished_name[k] = nv ~= "." and nv or nil; |
643 end | 639 end |
644 local conf_file = io.open(conf_filename, "w"); | 640 local conf_file = io.open(conf_filename, "w"); |
645 conf_file:write(seralizeopensslbaseconf(conf)); | 641 conf_file:write(conf:serialize()); |
646 conf_file:close(); | 642 conf_file:close(); |
647 print(""); | 643 print(""); |
648 show_message("Config written to " .. conf_filename); | 644 show_message("Config written to " .. conf_filename); |
649 return nil, conf_filename; | 645 return nil, conf_filename; |
650 else | 646 else |
653 end | 649 end |
654 | 650 |
655 function cert_commands.key(arg) | 651 function cert_commands.key(arg) |
656 if #arg >= 1 and arg[1] ~= "--help" then | 652 if #arg >= 1 and arg[1] ~= "--help" then |
657 local key_filename = (CFG_DATADIR or ".") .. "/" .. arg[1] .. ".key"; | 653 local key_filename = (CFG_DATADIR or ".") .. "/" .. arg[1] .. ".key"; |
658 if os.execute("test -f "..key_filename) == 0 | 654 if os.execute("test -f "..key_filename) == 0 then |
659 and not show_yesno("Overwrite "..key_filename .. "?") then | 655 if not show_yesno("Overwrite "..key_filename .. "?") then |
656 return nil, key_filename; | |
657 end | |
658 os.remove(key_filename); -- We chmod this file to not have write permissions | |
659 end | |
660 local key_size = tonumber(arg[2] or show_prompt("Choose key size (2048):") or 2048); | |
661 if openssl.genrsa{out=key_filename, key_size} then | |
662 os.execute(("chmod 400 '%s'"):format(key_filename)); | |
663 show_message("Key written to ".. key_filename); | |
660 return nil, key_filename; | 664 return nil, key_filename; |
661 end | 665 end |
662 local key_size = tonumber(arg[2] or show_prompt("Choose key size (2048):") or 2048); | 666 show_message("There was a problem, see OpenSSL output"); |
663 os.execute(("openssl genrsa -out %s %d"):format(key_filename, tonumber(key_size))); | |
664 os.execute(("chmod 400 %s"):format(key_filename)); | |
665 show_message("Key written to ".. key_filename); | |
666 return nil, key_filename; | |
667 else | 667 else |
668 show_usage("cert key HOSTNAME <bits>", "Generates a RSA key") | 668 show_usage("cert key HOSTNAME <bits>", "Generates a RSA key") |
669 end | 669 end |
670 end | 670 end |
671 | 671 |
676 and not show_yesno("Overwrite "..req_filename .. "?") then | 676 and not show_yesno("Overwrite "..req_filename .. "?") then |
677 return nil, req_filename; | 677 return nil, req_filename; |
678 end | 678 end |
679 local _, key_filename = cert_commands.key({arg[1]}); | 679 local _, key_filename = cert_commands.key({arg[1]}); |
680 local _, conf_filename = cert_commands.config({arg[1]}); | 680 local _, conf_filename = cert_commands.config({arg[1]}); |
681 os.execute(("openssl req -new -key %s -utf8 -config %s -out %s") | 681 if openssl.req{new=true, key=key_filename, utf8=true, config=conf_filename, out=req_filename} then |
682 :format(key_filename, conf_filename, req_filename)); | 682 show_message("Certificate request written to ".. req_filename); |
683 show_message("Certificate request written to ".. req_filename); | 683 else |
684 show_message("There was a problem, see OpenSSL output"); | |
685 end | |
684 else | 686 else |
685 show_usage("cert request HOSTNAME", "Generates a certificate request") | 687 show_usage("cert request HOSTNAME", "Generates a certificate request") |
686 end | 688 end |
687 end | 689 end |
688 | 690 |
693 and not show_yesno("Overwrite "..cert_filename .. "?") then | 695 and not show_yesno("Overwrite "..cert_filename .. "?") then |
694 return nil, cert_filename; | 696 return nil, cert_filename; |
695 end | 697 end |
696 local _, key_filename = cert_commands.key({arg[1]}); | 698 local _, key_filename = cert_commands.key({arg[1]}); |
697 local _, conf_filename = cert_commands.config({arg[1]}); | 699 local _, conf_filename = cert_commands.config({arg[1]}); |
698 os.execute(("openssl req -new -x509 -nodes -key %s -days 365 -sha1 -utf8 -config %s -out %s") | 700 local ret; |
699 :format(key_filename, conf_filename, cert_filename)); | 701 if key_filename and conf_filename and cert_filename |
700 show_message("Certificate written to ".. cert_filename); | 702 and openssl.req{new=true, x509=true, nodes=true, key=key_filename, |
703 days=365, sha1=true, utf8=true, config=conf_filename, out=cert_filename} then | |
704 show_message("Certificate written to ".. cert_filename); | |
705 else | |
706 show_message("There was a problem, see OpenSSL output"); | |
707 end | |
701 else | 708 else |
702 show_usage("cert generate HOSTNAME", "Generates a self-signed certificate") | 709 show_usage("cert generate HOSTNAME", "Generates a self-signed certificate") |
703 end | 710 end |
704 end | 711 end |
705 | 712 |