Mercurial > prosody-hg
comparison util/x509.lua @ 4797:e239668aa6d2
Merge 0.9->trunk
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Sun, 29 Apr 2012 02:10:55 +0100 |
| parents | f04db5e7e90d |
| children | 5fdc36bd866c |
comparison
equal
deleted
inserted
replaced
| 4796:04a34287dc12 | 4797:e239668aa6d2 |
|---|---|
| 19 -- [PKIX] - http://tools.ietf.org/html/rfc5280 | 19 -- [PKIX] - http://tools.ietf.org/html/rfc5280 |
| 20 | 20 |
| 21 local nameprep = require "util.encodings".stringprep.nameprep; | 21 local nameprep = require "util.encodings".stringprep.nameprep; |
| 22 local idna_to_ascii = require "util.encodings".idna.to_ascii; | 22 local idna_to_ascii = require "util.encodings".idna.to_ascii; |
| 23 local log = require "util.logger".init("x509"); | 23 local log = require "util.logger".init("x509"); |
| 24 local pairs, ipairs = pairs, ipairs; | |
| 25 local s_format = string.format; | |
| 26 local t_insert = table.insert; | |
| 27 local t_concat = table.concat; | |
| 24 | 28 |
| 25 module "x509" | 29 module "x509" |
| 26 | 30 |
| 27 local oid_commonname = "2.5.4.3"; -- [LDAP] 2.3 | 31 local oid_commonname = "2.5.4.3"; -- [LDAP] 2.3 |
| 28 local oid_subjectaltname = "2.5.29.17"; -- [PKIX] 4.2.1.6 | 32 local oid_subjectaltname = "2.5.29.17"; -- [PKIX] 4.2.1.6 |
| 206 | 210 |
| 207 -- If all else fails, well, why should we be any different? | 211 -- If all else fails, well, why should we be any different? |
| 208 return false | 212 return false |
| 209 end | 213 end |
| 210 | 214 |
| 215 -- TODO Rename? Split out subroutines? | |
| 216 -- Also, this is probably openssl specific, what TODO about that? | |
| 217 function genx509san(hosts, config, certhosts, raw) -- recive config through that or some better way? | |
| 218 local function utf8string(s) | |
| 219 -- This is how we tell openssl not to encode UTF-8 strings as Latin1 | |
| 220 return s_format("FORMAT:UTF8,UTF8:%s", s); | |
| 221 end | |
| 222 | |
| 223 local function ia5string(s) | |
| 224 return s_format("IA5STRING:%s", s); | |
| 225 end | |
| 226 | |
| 227 local function dnsname(t, host) | |
| 228 t_insert(t.DNS, idna_to_ascii(host)); | |
| 229 end | |
| 230 | |
| 231 local function srvname(t, host, service) | |
| 232 t_insert(t.otherName, s_format("%s;%s", oid_dnssrv, ia5string("_" .. service .."." .. idna_to_ascii(host)))); | |
| 233 end | |
| 234 | |
| 235 local function xmppAddr(t, host) | |
| 236 t_insert(t.otherName, s_format("%s;%s", oid_xmppaddr, utf8string(host))); | |
| 237 end | |
| 238 | |
| 239 ----------------------------- | |
| 240 | |
| 241 local san = { | |
| 242 DNS = {}; | |
| 243 otherName = {}; | |
| 244 }; | |
| 245 | |
| 246 local sslsanconf = { }; | |
| 247 | |
| 248 for i = 1,#certhosts do | |
| 249 local certhost = certhosts[i]; | |
| 250 for name, host in pairs(hosts) do | |
| 251 if name == certhost or name:sub(-1-#certhost) == "."..certhost then | |
| 252 dnsname(san, name); | |
| 253 --print(name .. "#component_module: " .. (config.get(name, "core", "component_module") or "nil")); | |
| 254 if config.get(name, "core", "component_module") == nil then | |
| 255 srvname(san, name, "xmpp-client"); | |
| 256 end | |
| 257 --print(name .. "#anonymous_login: " .. tostring(config.get(name, "core", "anonymous_login"))); | |
| 258 if not (config.get(name, "core", "anonymous_login") or | |
| 259 config.get(name, "core", "authentication") == "anonymous") then | |
| 260 srvname(san, name, "xmpp-server"); | |
| 261 end | |
| 262 xmppAddr(san, name); | |
| 263 end | |
| 264 end | |
| 265 end | |
| 266 | |
| 267 for t, n in pairs(san) do | |
| 268 for i = 1,#n do | |
| 269 t_insert(sslsanconf, s_format("%s.%d = %s", t, i -1, n[i])); | |
| 270 end | |
| 271 end | |
| 272 | |
| 273 return raw and sslsanconf or t_concat(sslsanconf, "\n"); | |
| 274 end | |
| 275 | |
| 276 function baseconf() | |
| 277 return { | |
| 278 req = { | |
| 279 distinguished_name = "distinguished_name", | |
| 280 req_extensions = "v3_extensions", | |
| 281 x509_extensions = "v3_extensions", | |
| 282 prompt = "no", | |
| 283 }, | |
| 284 distinguished_name = { | |
| 285 commonName = "example.com", | |
| 286 countryName = "GB", | |
| 287 localityName = "The Internet", | |
| 288 organizationName = "Your Organisation", | |
| 289 organizationalUnitName = "XMPP Department", | |
| 290 emailAddress = "xmpp@example.com", | |
| 291 }, | |
| 292 v3_extensions = { | |
| 293 basicConstraints = "CA:FALSE", | |
| 294 keyUsage = "digitalSignature,keyEncipherment", | |
| 295 extendedKeyUsage = "serverAuth,clientAuth", | |
| 296 subjectAltName = "@subject_alternative_name", | |
| 297 }, | |
| 298 subject_alternative_name = { }, | |
| 299 } | |
| 300 end | |
| 301 | |
| 302 function serialize_conf(conf) | |
| 303 local s = ""; | |
| 304 for k, t in pairs(conf) do | |
| 305 s = s .. ("[%s]\n"):format(k); | |
| 306 if t[1] then | |
| 307 for i, v in ipairs(t) do | |
| 308 s = s .. ("%s\n"):format(v); | |
| 309 end | |
| 310 else | |
| 311 for k, v in pairs(t) do | |
| 312 s = s .. ("%s = %s\n"):format(k, v); | |
| 313 end | |
| 314 end | |
| 315 s = s .. "\n"; | |
| 316 end | |
| 317 return s; | |
| 318 end | |
| 319 | |
| 211 return _M; | 320 return _M; |
