summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--openssl-controller.lua9
-rw-r--r--openssl-html.lsp82
-rw-r--r--openssl-model.lua44
3 files changed, 105 insertions, 30 deletions
diff --git a/openssl-controller.lua b/openssl-controller.lua
index 64dd307..59918c1 100644
--- a/openssl-controller.lua
+++ b/openssl-controller.lua
@@ -26,7 +26,7 @@ readall = function(self)
self.sessiondata.cmdresult = nil
local pending = self.model.listrequests()
local approved = self.model.listcerts()
- local revoked = nil
+ local revoked = self.model.listrevoked()
local result = cfe({ type="list", value={cmdresult=cmdresult, pending=pending, approved=approved, revoked=revoked} })
return result
end
@@ -38,7 +38,7 @@ read = function(self)
local user = cfe({ value=self.sessiondata.userinfo.userid, label="User Name" })
local pending = self.model.listrequests(self.sessiondata.userinfo.userid)
local approved = self.model.listcerts(self.sessiondata.userinfo.userid)
- local revoked = nil
+ local revoked = self.model.listrevoked()
local result = cfe({ type="list", value={cmdresult=cmdresult, user=user, pending=pending, approved=approved, revoked=revoked} })
return result
end
@@ -117,6 +117,9 @@ end
-- Revoke the specified cert
revoke = function(self)
+ local cmdresult = self.model.revokecert(self.clientdata.cert)
+ self.sessiondata.cmdresult = cmdresult
+ redirect_to_referrer(self)
end
-- Delete the specified certificate
@@ -128,6 +131,8 @@ end
-- Get the revoked list
getrevoked = function(self)
+ self.conf.viewtype="stream"
+ return self.model.getcrl(self.clientdata.crltype)
end
-- Put the CA cert
diff --git a/openssl-html.lsp b/openssl-html.lsp
index 192f7ce..9c61259 100644
--- a/openssl-html.lsp
+++ b/openssl-html.lsp
@@ -7,7 +7,7 @@ io.write(html.cfe_unpack(view))
<? if view.value.cmdresult then ?>
<H1>Command Result</H1>
<DL>
-<?= view.value.cmdresult.value ?>
+<?= string.gsub(view.value.cmdresult.value, "\n", "<BR>") ?>
</DL>
<? end ?>
@@ -42,6 +42,13 @@ io.write(html.cfe_unpack(view))
</TABLE>
<? end ?>
+<? local reverserevoked = {}
+if view.value.revoked then
+ for i,serial in ipairs(view.value.revoked.value) do
+ reverserevoked[serial] = i
+ end
+end ?>
+
<H1>Approved certificate requests<? if view.value.user then?> for <?= view.value.user.value ?><? end ?></H1>
<? if not view.value.approved or #view.value.approved.value == 0 then ?>
No certificates approved
@@ -54,36 +61,59 @@ io.write(html.cfe_unpack(view))
<TD style="padding-right:20px;white-space:nowrap;" class="header">Common Name</TD>
<TD style="white-space:nowrap;" class="header">Serial Num</TD>
<? for i,cert in ipairs(view.value.approved.value) do ?>
- <TR>
- <TD>
- <? if session.permissions.openssl.viewcert then ?>
- <?= html.link{value="viewcert?cert="..cert.name, label="View "} ?>
- <? end ?>
- <? if session.permissions.openssl.getcert then ?>
- <?= html.link{value="getcert?cert="..cert.name, label="Download "} ?>
- <? end ?>
- <? if session.permissions.openssl.revoke then ?>
- <?= html.link{value="revoke?cert="..cert.name, label="Revoke "} ?>
+ <? if not reverserevoked[cert.serial] then ?>
+ <TR>
+ <TD>
+ <? if session.permissions.openssl.viewcert then ?>
+ <?= html.link{value="viewcert?cert="..cert.name, label="View "} ?>
+ <? end ?>
+ <? if session.permissions.openssl.getcert then ?>
+ <?= html.link{value="getcert?cert="..cert.name, label="Download "} ?>
+ <? end ?>
+ <? if session.permissions.openssl.revoke then ?>
+ <?= html.link{value="revoke?cert="..cert.name, label="Revoke "} ?>
+ <? end ?>
+ <? if session.permissions.openssl.deletecert then ?>
+ <?= html.link{value="deletecert?cert="..cert.name, label="Delete "} ?>
+ <? end ?>
+ </TD>
+ <TD><?= cert.user ?></TD>
+ <TD><?= cert.certtype ?></TD>
+ <TD><?= cert.commonName ?></TD>
+ <TD><?= cert.serial ?></TD>
+ </TR>
<? end ?>
- <? if session.permissions.openssl.deletecert then ?>
- <?= html.link{value="deletecert?cert="..cert.name, label="Delete "} ?>
- <? end ?>
- </TD>
- <TD><?= cert.user ?></TD>
- <TD><?= cert.certtype ?></TD>
- <TD><?= cert.commonName ?></TD>
- <TD><?= cert.serial ?></TD>
- </TR>
<? end ?>
</TABLE>
<? end ?>
-
+
<H1>Revoked certificates<? if view.value.user then?> for <?= view.value.user.value ?><? end ?></H1>
<? if not view.value.revoked or #view.value.revoked.value == 0 then ?>
No certificates revoked
-<? else
- for i,name in ipairs(view.value.revoked.value) do
- io.write(name..'<br>')
- end
-end ?>
+<? else ?>
+<TABLE>
+ <TR style="background:#eee;font-weight:bold;">
+ <TD style="padding-right:20px;white-space:nowrap;" class="header">User</TD>
+ <TD style="padding-right:20px;white-space:nowrap;" class="header">Cert Type</TD>
+ <TD style="padding-right:20px;white-space:nowrap;" class="header">Common Name</TD>
+ <TD style="white-space:nowrap;" class="header">Serial Num</TD>
+ <? for i,cert in ipairs(view.value.approved.value) do ?>
+ <? if reverserevoked[cert.serial] then ?>
+ <TR>
+ <TD><?= cert.user ?></TD>
+ <TD><?= cert.certtype ?></TD>
+ <TD><?= cert.commonName ?></TD>
+ <TD><?= cert.serial ?></TD>
+ </TR>
+ <? end ?>
+ <? end ?>
+</TABLE>
+<? end ?>
+
+<? if session.permissions.openssl.getrevoked then ?>
+<H1>Get revoked list (crl)</H1>
+<?= html.link{value="getrevoked?crltype=PEM", label="Download PEM "} ?><BR>
+<?= html.link{value="getrevoked?crltype=DER", label="Download DER "} ?><BR>
+<?= html.link{value="getrevoked", label="Import to Firefox"} ?><BR>
+<? end ?>
diff --git a/openssl-model.lua b/openssl-model.lua
index fa844fe..ef2218e 100644
--- a/openssl-model.lua
+++ b/openssl-model.lua
@@ -317,7 +317,6 @@ approverequest = function(request)
-- Now, sign the certificate
local cmd = "PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin openssl ca -config "..configfile.." -in "..path..".csr -out "..certname..".crt -name "..certtype.." -batch 2>&1"
-APP.logevent(cmd)
local f = io.popen(cmd)
cmdresult.value = f:read("*a")
f:close()
@@ -357,6 +356,7 @@ listcerts = function(user)
local a,b,c,d = string.match(name, "([^%.]*)%.([^%.]*)%.([^%.]*).([^%.]*)")
list[#list + 1] = {name=name, user=a, certtype=b, commonName=c, serial=d}
end
+ fh:close()
return cfe({ type="list", value=list, label="List of approved certificates" })
end
@@ -368,10 +368,17 @@ end
getcert = function(cert)
local f = fs.read_file(certdir..cert..".pfx")
- return cfe({ type="raw", value=f, label=cert..".pfx" })
+ return cfe({ type="raw", value=f, label=cert..".pfx", option="application/x-pkcs12" })
+ --return cfe({ type="raw", value=f, label=cert..".pfx" })
end
revokecert = function(cert)
+ local cmdresult = cfe({ label="Revoke result" })
+ local cmd = "PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin openssl ca -config "..configfile.." -revoke "..certdir .. cert..".crt -batch 2>&1"
+ local f = io.popen(cmd)
+ cmdresult.value = f:read("*a")
+ f:close()
+ return cmdresult
end
deletecert = function(cert)
@@ -382,6 +389,39 @@ deletecert = function(cert)
return cfe({ value="Certificate deleted", label="Delete result" })
end
+listrevoked = function()
+ config = config or getopts.getoptsfromfile(configfile)
+ local databasepath = getconfigpath(config.ca.default_ca, "database")
+ local revoked = {}
+ local database = fs.read_file_as_array(databasepath)
+ for x,line in ipairs(database) do
+ if string.sub(line,1,1) == "R" then
+ revoked[#revoked + 1] = string.match(line, "^%S+%s+%S+%s+%S+%s+(%S+)")
+ end
+ end
+ return cfe({ type="list", value=revoked, label="Revoked serial numbers" })
+end
+
+getcrl = function(crltype)
+ local crlfile = cfe({ type="raw", label="Revoke list", option="application/pkix-crl" })
+ local cmd = "PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin openssl ca -config "..configfile.." -gencrl -out "..openssldir.."ca-crl.crl"
+ local f = io.popen(cmd)
+ f:close()
+ local cmd = "PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin openssl crl -in "..openssldir.."ca-crl.crl -out "..openssldir.."ca-der-crl.crl -outform DER"
+ local f = io.popen(cmd)
+ f:close()
+ if crltype == "DER" then
+ crlfile.label = "ca-der-crl.crl"
+ crlfile.value = fs.read_file(crlfile.label)
+ elseif crltype == "PEM" then
+ crlfile.label = "ca-crl.crl"
+ crlfile.value = fs.read_file(crlfile.label)
+ else
+ crlfile.value = fs.read_file("ca-crl.crl")
+ end
+ return crlfile
+end
+
-- FIXME this won't work because haserl doesn't support file upload. Untested and unfinished
putca = function(file, pword, set)
local ca = cfe({ type="raw", value=0, label="CA Certificate", descr='File must be a password protected ".pfx" file' })