بالنظر إلى أن LetsEncrypt لا تصدر شهادات على عناوين IP ، سيكون من الرائع اكتشاف عناوين IP وتجاهلها قبل إرسال طلب إلى LetsEncrypt ، بدلاً من الاضطرار إلى إضافة هذا المنطق في تكوين / وظيفة allow_domain.
لقد كتبت للتو شيكًا لذلك ، فقط لأجد أنه فشل بالفعل في وقت مبكر ، في:
ssl_certificate (): auto-ssl: تعذر تحديد المجال للطلب (SNI غير مدعوم؟) - استخدام احتياطي -
عندما يطلب المستعرض عنوان IP ، فإنه لا يرسل رأس SNI ، لذلك لن يتم تعيين "المجال".
لست متأكدًا من سبب إرسال طلبي للسماح بالتشفير الذي كان يرسل في ذلك الوقت خطأً حول تسجيل شهادة SSL مع IP: S
discobean : هل لديك رسالة الخطأ المحددة التي تحدث عندما رأيت هذا؟
GUI أحيانًا أحصل على نفس الخطأ. أعتقد أن هذا يرجع إلى أن العملاء (الذين من المحتمل أن يكونوا روبوتات الماسح الضوئي) يرسلون رأس مضيف يساوي عنوان IP المستهدف ، على سبيل المثال:
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
هو عنوان IP الفعلي لخادمنا
أنا أقوم بحظر هذا في الكود ، لكن ، eh: يجب أن تسمح () allow_domain () فقط_ لـ FQDN بأنك سترغب في إنشاء شهادة لـ (نهج القائمة البيضاء) بدلاً من "ليس من أجل هؤلاء" (نهج القائمة السوداء).
لا يجب عليك ببساطة "إرجاع صحيح" في allow_domain (). إنه يضع ضغطًا على نظامك ويؤدي إلى تراكم الإخفاقات تجاه LE.
ومع ذلك ، فإننا نتقدم خطوة إلى الأمام. نقوم بتصدير قائمة بجميع عملاء الاستضافة على الويب لدينا إلى ملف جدول Lua على القرص ، اقرأ ذلك وقم بتخزينه في مخزن قيم / مفتاح SHM داخل nginx حتى نتمكن بسهولة من التحقق من المضيفين الذين يجب أن ننشئ شهادات لهم أم لا.
لدينا العديد من شهادات أحرف البدل لأسماء مضيفي الإدارة ، لذا فإننا نغادر مبكرًا بسلسلة SSL مستبدلة بشهادة SSL المقابلة فيها. نقوم بالخروج المبكر على عناوين IP والمضيف المحلي. ثم أخيرًا نتحقق من DNS وما إذا كان الاسم موجودًا بالفعل في قائمة المجالات التي تم تكوينها على أنظمتنا أم لا.
معظم هذه الفحوصات يتم تحقيقها في الوقت المناسب فقط ، لكنها ليست ضرورية حقًا. النقطة المهمة: استخدم القائمة البيضاء بدلاً من القائمة السوداء. إنها ممارسة شائعة في الكود أيضًا. أفضل أمانًا من الأسف.
وأحيانًا يكون من الأفضل عدم المبالغة في الهندسة وتخطي عمليات التحقق المختلفة التي قد تكون نقطة فشل أخرى :) خاصة إذا كانت لديك بيئة ديناميكية للغاية.
أنا لا أقول أنه يجب حظر هذا في lua-resty-auto-ssl ، فقط مشاركة ما اكتشفته أثناء الاختبار إذا تعثر أي شخص آخر في هذه المشكلة.
اختراق سريع في 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
أنت لا تعرف وضعنا ، لكنك تسرع في الحكم. أخذت النقطة.
ربما يمكنك إنشاء PR وتغيير allow_domain
في README.md إلى شيء أكثر منطقية من إرجاع true
لجعل الجميع أكثر أمانًا
التعليق الأكثر فائدة
الإدراج في القائمة البيضاء ليس مبالغة في الهندسة ، إنه يفعل ذلك بشكل صحيح. هناك الكثير من الحوادث الأمنية في العالم لأن المطورين يستخدمون القائمة السوداء بدلاً من إدراجها في القائمة البيضاء ، فهي ليست مضحكة حتى عن بعد.
يتخطى الشيك أيضًا عناوين IPv6 ، وهو في الواقع مبالغة في الهندسة: