Mercurial > prosody-hg
comparison core/certmanager.lua @ 6078:30ac122acdd3
certmanager: Support ssl.protocol syntax like "tlsv1+" that disables older protocols
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Tue, 15 Apr 2014 00:45:07 +0200 |
| parents | 6999d4415a58 |
| children | 5cffee5b2826 |
comparison
equal
deleted
inserted
replaced
| 6077:6999d4415a58 | 6078:30ac122acdd3 |
|---|---|
| 34 -- Global SSL options if not overridden per-host | 34 -- Global SSL options if not overridden per-host |
| 35 local global_ssl_config = configmanager.get("*", "ssl"); | 35 local global_ssl_config = configmanager.get("*", "ssl"); |
| 36 | 36 |
| 37 local core_defaults = { | 37 local core_defaults = { |
| 38 capath = "/etc/ssl/certs"; | 38 capath = "/etc/ssl/certs"; |
| 39 protocol = "sslv23"; | 39 protocol = "tlsv1+"; |
| 40 verify = (ssl and ssl.x509 and { "peer", "client_once", }) or "none"; | 40 verify = (ssl and ssl.x509 and { "peer", "client_once", }) or "none"; |
| 41 options = { "no_sslv2", "no_sslv3", "cipher_server_preference", luasec_has_noticket and "no_ticket" or nil }; | 41 options = { "cipher_server_preference", luasec_has_noticket and "no_ticket" or nil }; |
| 42 verifyext = { "lsec_continue", "lsec_ignore_purpose" }; | 42 verifyext = { "lsec_continue", "lsec_ignore_purpose" }; |
| 43 curve = "secp384r1"; | 43 curve = "secp384r1"; |
| 44 ciphers = "HIGH+kEDH:HIGH+kEECDH:HIGH:!PSK:!SRP:!3DES:!aNULL"; | 44 ciphers = "HIGH+kEDH:HIGH+kEECDH:HIGH:!PSK:!SRP:!3DES:!aNULL"; |
| 45 } | 45 } |
| 46 local path_options = { -- These we pass through resolve_path() | 46 local path_options = { -- These we pass through resolve_path() |
| 75 end | 75 end |
| 76 end | 76 end |
| 77 return o; | 77 return o; |
| 78 end | 78 end |
| 79 | 79 |
| 80 local protocols = { "sslv2", "sslv3", "tlsv1", "tlsv1_1", "tlsv1_2" }; | |
| 81 for i = 1, #protocols do protocols[protocols[i] .. "+"] = i - 1; end | |
| 82 | |
| 80 function create_context(host, mode, user_ssl_config) | 83 function create_context(host, mode, user_ssl_config) |
| 81 user_ssl_config = user_ssl_config or {} | 84 user_ssl_config = user_ssl_config or {} |
| 82 user_ssl_config.mode = mode; | 85 user_ssl_config.mode = mode; |
| 83 | 86 |
| 84 if not ssl then return nil, "LuaSec (required for encryption) was not found"; end | 87 if not ssl then return nil, "LuaSec (required for encryption) was not found"; end |
| 92 end | 95 end |
| 93 | 96 |
| 94 for option,default_value in pairs(core_defaults) do | 97 for option,default_value in pairs(core_defaults) do |
| 95 if user_ssl_config[option] == nil then | 98 if user_ssl_config[option] == nil then |
| 96 user_ssl_config[option] = default_value; | 99 user_ssl_config[option] = default_value; |
| 100 end | |
| 101 end | |
| 102 | |
| 103 local min_protocol = protocols[user_ssl_config.protocol]; | |
| 104 if min_protocol then | |
| 105 user_ssl_config.protocol = "sslv23"; | |
| 106 for i = min_protocol, 1, -1 do | |
| 107 user_ssl_config.options["no_"..protocols[i]] = true; | |
| 97 end | 108 end |
| 98 end | 109 end |
| 99 | 110 |
| 100 for option in pairs(set_options) do | 111 for option in pairs(set_options) do |
| 101 local merged = {}; | 112 local merged = {}; |
