Lua-resty-auto-ssl: рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдЬрд╛рд░реА рдХрд░рддреЗ рд╕рдордп рдЖрдИрдкреА рдкрддреЗ рдкрд░ рдзреНрдпрд╛рди рди рджреЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 27 рд╕рд┐рддре░ 2016  ┬╖  8рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: auto-ssl/lua-resty-auto-ssl

LetsEncrypt рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП IP рдкрд░ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдЬрд╛рд░реА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЙрд╕ рддрд░реНрдХ рдХреЛ allow_domain рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди/рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрдЬрд╛рдп, LetsEncrypt рдХреЛ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ IP рдкрддреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рд╢реНрд╡реЗрддрд╕реВрдЪреАрдХрд░рдг рдЕрддрд┐-рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдЗрд╕реЗ рд╕рд╣реА рдХрд░ рд░рд╣рд╛ рд╣реИред рджреБрдирд┐рдпрд╛ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рд╕реБрд░рдХреНрд╖рд╛ рдШрдЯрдирд╛рдПрдВ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╢реНрд╡реЗрддрд╕реВрдЪреА рдХреЗ рдмрдЬрд╛рдп рдмреНрд▓реИрдХрд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдпрд╣ рджреВрд░ рд╕реЗ рднреА рдЕрдЬреАрдм рдирд╣реАрдВ рд╣реИред

рдЖрдкрдХрд╛ рдЪреЗрдХ IPv6-рдкрддреЛрдВ рдХреЛ рднреА рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрддрд┐-рдЗрдВрдЬреАрдирд┐рдпрд░реНрдб рд╣реИ:

if string.match(domain, "(%d+).(%d+).(%d+).(%d+)") or string.find(domain, ":", 1, true) then
    return false
end

рд╕рднреА 8 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореИрдВрдиреЗ рдЕрднреА рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЪреЗрдХ рд▓рд┐рдЦрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рдЬрд▓реНрджреА рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ:

ssl_certificate (): рдСрдЯреЛ-рдПрд╕рдПрд╕рдПрд▓: рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдбреЛрдореЗрди рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ (рдПрд╕рдПрдирдЖрдИ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ?) - рдлрд╝реЙрд▓рдмреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ -

рдЬрдм рдХреЛрдИ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрд┐рд╕реА рдЖрдИрдкреА-рдкрддреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдПрд╕рдПрдирдЖрдИ-рд╣реЗрдбрд░ рдирд╣реАрдВ рднреЗрдЬрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП "рдбреЛрдореЗрди" рднреА рд╕реЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореЗрд░рд╛ рдЕрдиреБрд░реЛрдз рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХреНрдпреЛрдВ рднреЗрдЬ рд░рд╣рд╛ рдерд╛ рдЬреЛ рддрдм рдПрдХ рдЖрдИрдкреА рдХреЗ рд╕рд╛рде рдПрдХ рдПрд╕рдПрд╕рдПрд▓ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рднреЗрдЬ рд░рд╣рд╛ рдерд╛: рдПрд╕

@discobean : рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рд╣реИ рдЬреЛ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдкрдиреЗ рдЗрд╕реЗ рджреЗрдЦрд╛ рд╣реИ?

@GUI рдореБрдЭреЗ рдХрднреА-рдХрднреА рд╡рд╣реА рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИред рдореЗрд░рд╛ рдЕрдиреБрдорд╛рди рд╣реИ рдХрд┐ рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ (рдЬреЛ рд╢рд╛рдпрдж рд╕реНрдХреИрдирд░ рдмреЙрдЯ рд╣реИрдВ) рд╣реЛрд╕реНрдЯ рд╣реЗрдбрд░ рднреЗрдЬ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдЖрдИрдкреА рдкрддреЗ рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

2018/02/20 02:10:44 [warn] 490#490: *2723 [lua] init_by_lua:11: allow_domain(): auto-ssl: debug allow_domain domain XXX.XXX.XX.XX, context: ssl_certificate_by_lua*, client: 107.170.236.113, server: 0.0.0.0:8443
2018/02/20 02:10:49 [error] 490#490: *2723 [lua] lets_encrypt.lua:41: issue_cert(): auto-ssl: dehydrated failed: env HOOK_SECRET=XXXXX HOOK_SERVER_PORT=8999 /usr/local/bin/resty-auto-ssl/dehydrated --cron --accept-terms --no-lock --domain XXX.XXX.XX.XX --challenge http-01 --config /etc/resty-auto-ssl/letsencrypt/config --hook /usr/local/bin/resty-auto-ssl/letsencrypt_hooks status: 256 out: # INFO: Using main config file /etc/resty-auto-ssl/letsencrypt/config
Processing XXX.XXX.XX.XX
 + Signing domains...
 + Creating new directory /etc/resty-auto-ssl/letsencrypt/certs/XXX.XXX.XX.XX ...
 + Generating private key...
 + Generating signing request...
 + Requesting authorization for XXX.XXX.XX.XX...
 err:   + ERROR: An error occurred while sending post-request to https://acme-v01.api.letsencrypt.org/acme/new-authz (Status 400)

Details:
{
  "type": "urn:acme:error:malformed",
  "detail": "Error creating new authz :: Issuance for IP addresses not supported",
  "status": 400
}

, context: ssl_certificate_by_lua*, client: 107.170.236.113, server: 0.0.0.0:8443
2018/02/20 02:10:49 [error] 490#490: *2723 [lua] ssl_certificate.lua:97: issue_cert(): auto-ssl: issuing new certificate failed: dehydrated failure, context: ssl_certificate_by_lua*, client: 107.170.236.113, server: 0.0.0.0:8443
2018/02/20 02:10:49 [error] 490#490: *2723 [lua] ssl_certificate.lua:286: auto-ssl: could not get certificate for XXX.XXX.XX.XX - using fallback - failed to get or issue certificate, context: ssl_certificate_by_lua*, client: 107.170.236.113, server: 0.0.0.0:8443

рдЬрд╣рд╛рдВ XXX.XXX.XX.XX рд╣рдорд╛рд░рд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рд░реНрд╡рд░ рдЖрдИрдкреА рдкрддрд╛ рд╣реИ

рдореИрдВ рдХреЛрдб рдореЗрдВ рдЗрд╕реЗ рдЕрд╡рд░реБрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реВрдВ, рд▓реЗрдХрд┐рди, рдПрд╣: рдЖрдкрдХрд╛ allow_domain() рдЪрд╛рд╣рд┐рдП _only_ FQDN рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ рдХрд┐ рдЖрдк "рдЗрдирдХреЗ рд▓рд┐рдП рдирд╣реАрдВ" (рдмреНрд▓реИрдХрд▓рд┐рд╕реНрдЯ рджреГрд╖реНрдЯрд┐рдХреЛрдг) рдХреЗ рд╡рд┐рдкрд░реАрдд (рд╢реНрд╡реЗрддрд╕реВрдЪреА рджреГрд╖реНрдЯрд┐рдХреЛрдг) рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдЖрдкрдХреЛ рдХреЗрд╡рд▓ allow_domain() рдореЗрдВ рдХреЗрд╡рд▓ "рд╡рд╛рдкрд╕реА рд╕рд╣реА" рдирд╣реАрдВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдЖрдкрдХреЗ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рджрдмрд╛рд╡ рдбрд╛рд▓рддрд╛ рд╣реИ рдФрд░ LE рдХреА рдУрд░ рд╡рд┐рдлрд▓рддрд╛рдУрдВ рдХреЛ рдЬрдорд╛ рдХрд░рддрд╛ рд╣реИред

рд╣рдо рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрдХ рдХрджрдо рдЖрдЧреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рд╣рдо рдЕрдкрдиреЗ рд╕рднреА рд╡реЗрдмрд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдХреЛ рдбрд┐рд╕реНрдХ рдкрд░ рд▓реБрдЖ рдЯреЗрдмрд▓ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рд░реНрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВ, рдЙрд╕реЗ рдкрдврд╝рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ nginx рдХреЗ рдЕрдВрджрд░ рдПрдХ SHM рдХреБрдВрдЬреА/рдореВрд▓реНрдп рд╕реНрдЯреЛрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рдЬрд╛рдВрдЪ рд╕рдХреЗрдВ рдХрд┐ рд╣рдореЗрдВ рдХреМрди рд╕реЗ рд╣реЛрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдирд╣реАрдВред

рд╣рдорд╛рд░реЗ рдкреНрд░рдмрдВрдзрди рд╣реЛрд╕реНрдЯрдирд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдИ рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕рдВрдмрдВрдзрд┐рдд рдПрд╕рдПрд╕рдПрд▓ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдПрд╕рдПрд╕рдПрд▓ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд╕рд╛рде рдЬрд▓реНрджреА рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рдЬрд╛рддреЗ рд╣реИрдВред рд╣рдо рдЖрдИрдкреА-рдПрдбреНрд░реЗрд╕ рдФрд░ рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ рдкрд░ рдЬрд▓реНрджреА рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреЗ рд╣реИрдВред рдФрд░ рдлрд┐рд░ рдЕрдВрдд рдореЗрдВ рд╣рдо рдбреАрдПрдирдПрд╕ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреНрдпрд╛ рдирд╛рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдорд╛рд░реЗ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЧрдП рдбреЛрдореЗрди рдХреА рд╕реВрдЪреА рдореЗрдВ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдЗрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрддрд░ рдЪреЗрдХ рдХреЗрд╡рд▓ рд╕рдордп рдкрд░ рдЬреАрдд рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИрдВред рдмрд┐рдВрджреБ рдЬрд╛ рд░рд╣рд╛ рд╣реИ: рдмреНрд▓реИрдХрд▓рд┐рд╕реНрдЯ рдХреЗ рдмрдЬрд╛рдп рд╢реНрд╡реЗрддрд╕реВрдЪреА рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВред рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб рдЕрднреНрдпрд╛рд╕ рднреА рд╣реИред рдорд╛рдлреА рд╕реЗ рдЕрдзрд┐рдХ рд╕реБрд░рдХреНрд╖рд┐рддред

рдФрд░ рдХрднреА-рдХрднреА рдпрд╣ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдУрд╡рд░-рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рди рдХрд░реЗрдВ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдЬрд╛рдВрдЪреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВ рдЬреЛ рдХрд┐ рд╡рд┐рдлрд▓рддрд╛ рдХрд╛ рдПрдХ рдФрд░ рдмрд┐рдВрджреБ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ :) рдЦрд╛рд╕рдХрд░ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрддреНрдпрдзрд┐рдХ рдЧрддрд┐рд╢реАрд▓ рд╡рд╛рддрд╛рд╡рд░рдг рд╣реИред

рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕реЗ рд▓реБрдЖ-рд░реЗрд╕реНрдЯреА-рдСрдЯреЛ-рдПрд╕рдПрд╕рдПрд▓ рдореЗрдВ рдЕрд╡рд░реБрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдЧрд░ рдХреЛрдИ рдФрд░ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдареЛрдХрд░ рдЦрд╛рддрд╛ рд╣реИ рддреЛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╕рдордп рдореБрдЭреЗ рдЬреЛ рдорд┐рд▓рд╛ рд╣реИ рдЙрд╕реЗ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ред

allow_domain рдореЗрдВ рддреНрд╡рд░рд┐рдд рд╣реИрдХ:

          local ip_chunks = {domain:match("(%d+)%.(%d+)%.(%d+)%.(%d+)")}
          if (#ip_chunks == 4) then
            return false
          end

рд╢реНрд╡реЗрддрд╕реВрдЪреАрдХрд░рдг рдЕрддрд┐-рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдЗрд╕реЗ рд╕рд╣реА рдХрд░ рд░рд╣рд╛ рд╣реИред рджреБрдирд┐рдпрд╛ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рд╕реБрд░рдХреНрд╖рд╛ рдШрдЯрдирд╛рдПрдВ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╢реНрд╡реЗрддрд╕реВрдЪреА рдХреЗ рдмрдЬрд╛рдп рдмреНрд▓реИрдХрд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдпрд╣ рджреВрд░ рд╕реЗ рднреА рдЕрдЬреАрдм рдирд╣реАрдВ рд╣реИред

рдЖрдкрдХрд╛ рдЪреЗрдХ IPv6-рдкрддреЛрдВ рдХреЛ рднреА рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрддрд┐-рдЗрдВрдЬреАрдирд┐рдпрд░реНрдб рд╣реИ:

if string.match(domain, "(%d+).(%d+).(%d+).(%d+)") or string.find(domain, ":", 1, true) then
    return false
end

рдЖрдк рд╣рдорд╛рд░реА рд╕реНрдерд┐рддрд┐ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдЬрд▓реНрджреА рд╕реЗ рдиреНрдпрд╛рдп рдХрд░рддреЗ рд╣реИрдВред рд╕рдордЭ рдЧрдпрд╛ред

рдЖрдк рд╢рд╛рдпрдж рдПрдХ рдкреАрдЖрд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ allow_domain рдХреЛ README.md рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╕рднреА рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП true рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рд╕рдордЭрджрд╛рд░ рд╣реЛ

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

kshnurov picture kshnurov  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

byrnedo picture byrnedo  ┬╖  16рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

danDanV1 picture danDanV1  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

serathius picture serathius  ┬╖  21рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

brendon picture brendon  ┬╖  9рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ