مع تزايد وعي الجميع بالأمن عبر الإنترنت، وترويج شركات الإنترنت الكبرى لنشر HTTPS، أصبح HTTPS SSL الآن هو المعيار الأساسي لبناء مواقع الويب. بفضل شهادات SSL المجانية المقدمة من Let’s Encrypt وDigicert وTrustAsia وSymantec وما إلى ذلك، أصبحت تكلفة استخدام HTTPS الآن ضئيلة سواء كان موقع ويب شخصيًا أو موقع ويب خاص بشركة.
للأمان، نحتاج إلى استخدام HTTPS، ولكن تشغيل SSL سيزيد من الحمل الزائد للذاكرة ووحدة المعالجة المركزية وعرض النطاق الترددي للشبكة. بالمقارنة مع http، فإن استخدام مصافحة TCP ثلاثية الاتجاهات لإنشاء اتصال، يحتاج العميل والخادم إلى تبادل 3 حزم. بالإضافة إلى حزم TCP الثلاث، يحتاج https أيضًا إلى 9 حزم مطلوبة لمصافحة SSL، بإجمالي 12. الحزم. لذلك، إذا تم تحسين HTTPS كثيرًا، فسيكون عرضة لبطء الأداء.
بالطبع، قد يعتقد بعض الأشخاص أن الحمل الزائد على الخادم لـ HTTPS وSSL غير محسوس بشكل أساسي، وذلك لأن حركة مرور موقع الويب صغيرة نسبيًا، وتكوين أداء الخادم كافٍ لدعم حركة المرور الحالية. ولكن بالنسبة لمواقع الويب الكبيرة، مثل Baidu وGoogle والتطبيقات الشائعة، لا يزال من المفيد جدًا تحسين أداء HTTPS وتقليل استهلاك الموارد.
ستشارك هذه المقالة بعض الخبرات في تحسين استخدام HTTPS وSSL. هناك المزيد من الدروس التعليمية حول شهادات SSL وHTTPS:
- مجموعة وملخص مجاني لشهادات SSL - أضف وصولاً مشفرًا آمنًا عبر HTTPS إلى موقع الويب مجانًا
- عشر نصائح مجانية لتسريع CDN من CloudFlare قد لا تعرفها -SSLDDOSCache
- قم بتمكين HSTS والانضمام إلى قائمة التحميل المسبق لـ HSTS لجعل وصول HTTPS إلى موقع الويب أكثر أمانًا - مع طرق حذف HSTS
ملاحظة: تم التحديث في 6 سبتمبر 2018، إذا كنت تريد استخدام خدمة تحليل DNS مدفوعة، فإليك خدمتي DNS أرخص وأكثر ملاءمة للأفراد: منتجان DNS مناسبان للاستخدام الشخصي: ClouDNS وDNS أصبح من السهل تحليل اسم المجال.
ملاحظة: تم التحديث في 15 يناير 2019، إذا كنت تريد الوصول إلى SSL للحصول على سرعة أكبر وأداء أعلى، يمكنك تجربة ضغط TLSV1.3 وBrotli: تسريع تحسين موقع الويب - تشغيل TLSV1.3 وضغط Brotli -Oneinstack، LNMP، لوحة الباغودا.
1. كيف تختار شهادة SSL مجانية؟
يوصى باختيار Let's Encrypt. على الرغم من أن شهادة Let's Encrypt المجانية SSL تبلغ 90 يومًا فقط، إلا أنه يمكن تجديدها إلى أجل غير مسمى وتدعم التجديد اليدوي والتلقائي. يتم التعرف على Let's Encrypt SSL من قبل جميع المتصفحات الرئيسية وهو الخيار الأول لشهادات SSL المجانية. البرنامج التعليمي: دعونا نقوم بتشفير شهادة SSL لاسم النطاق المجاني لـ Wildcard، وتطبيق بنقرة واحدة وبرنامج تعليمي لاستخدام SSL.
يعد Let’s Encrypt مناسبًا للمضيفين الذين لديهم عناوين IP مستقلة مثل VPS، وبخلاف ذلك، يمكنك فقط استخدام بعض تطبيقات شهادات SSL عبر الإنترنت التي تم تطويرها باستخدام Let’s Encrypt API. بالطبع، إذا كان لديك قوة مالية معينة، فمن الأفضل اختيار شهادة SSL مدفوعة الأجر. لمزيد من شهادات SSL، راجع: مجموعة وملخص شهادات SSL المجانية.
2. تمكين HSTS على الخادم
ستضمن مواقع الويب التي تستخدم بروتوكول HSTS أن المتصفح يتصل دائمًا بإصدار HTTPS من موقع الويب، دون مطالبة المستخدمين بإدخال عنوان مشفر يدويًا يحتوي على https://
في شريط عنوان URL. أستخدم خادم Nginx. أحتاج فقط إلى تعديل ملف تكوين Nginx (مثل: /usr/local/nginx/conf/nginx.conf) وإضافة الأسطر التالية إلى كتلة الخادم الخاصة بتكوين HTTPS:
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
للحصول على تفاصيل حول كيفية تمكين HSTS لـ Apache وLighttpd وما إلى ذلك، راجع: تمكين HSTS على الخادم.
3. أضف اسم النطاق إلى خطة قائمة التحميل المسبق لـ HSTS
على الرغم من تمكين بروتوكول HSTS أعلاه لضمان وصول المستخدمين دائمًا إلى اتصالات Https، إلا أن المستخدمين الذين يزورون موقع الويب لأول مرة عادةً ما يقومون بإدخال أسماء نطاقات غير https، مما يؤدي إلى مشكلة اختطاف http عند زيارة موقع الويب لأول مرة وقت. تهدف خطة قائمة التحميل المسبق لـ HSTS إلى حل هذه المشكلة، وهي قائمة مضمنة في المتصفحات مثل chromeFirefoxEdge.
كيفية الانضمام إلى قائمة التحميل المسبق لـ HSTS: قم بتمكين HSTS والانضمام إلى قائمة التحميل المسبق لـ HSTS لجعل وصول HTTPS إلى موقع الويب أكثر أمانًا - مرفق طريقة حذف HSTS. في الوقت الحالي، تمت إضافة wzfou.com بنجاح إلى قائمة التحميل المسبق لـ HSTS. إذا كنت تستخدم Chrome أو Firefox، ففي المرة الأولى التي تزور فيها هذا الموقع، ستستخدم HTTPS للاتصال بشكل افتراضي.
تمكين تدبيس OCSP في Nginx. (يمكن حذف ssl_trusted_certificate إذا كان توجيه ssl_certificate يحدد سلسلة الشهادات الكاملة)
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /path/to/certs/chained.pem;
تمكين تدبيس OCSP في Apache:
في <VirtualHost></VirtualHost>
أضف:
SSLUseStapling on
خارج <VirtualHost></VirtualHost>
أضف:
SSLStaplingCache shmcb:/tmp/stapling_cache(128000)
5. استخدم شهادات ECC وRSA المزدوجة
افتراضيًا، سنستخدم جميعًا شهادات RSA لأن شهادات RSA تتمتع بأكبر قدر من التوافق. ومع ذلك، تتميز شهادة ECC بخصائص الحجم الصغير وسرعة الحوسبة السريعة والأمان العالي (يمكن أن يوفر مفتاح ECC
بحجم 256 بت نفس الأمان الذي يوفره مفتاح RSA
بحجم 3072 بت). يمكنه توفير أداء HTTPS إلى حد ما.
يدعم Let's Encrypt بالفعل إنشاء شهادات ECC. استخدم acme.sh لإصدار شهادات SSL. حدد --keylength ec-256
لتغيير نوع الشهادة إلى ECC:
acme.sh --issue -w /data/wwwroot/wzfou.com -d wzfou.com -d www.wzfou.com --keylength ec-256
تجدر الإشارة إلى أن ECC غير متوافق مع نظام التشغيل Windows XP. في الوقت الحالي، سنفكر في استخدام الشهادات المزدوجة. أي أنه عندما تكون شهادة ECC غير مدعومة، سيعرض Nginx شهادة RSA للمستخدم تلقائيًا. إذا كان إصدار nginx أكبر من 1.11
، فيمكنك كتابة مسارات شهادات ECC وRSA المزدوجة مباشرةً في ملف التكوين الذي يوضحه wzfou.com كما يلي:
#ECC
ssl_certificate /root/.acme.sh/wzfou.com_ecc/fullchain.cer;
ssl_certificate_key /root/.acme.sh/wzfou.com_ecc/wzfou.com.key;
#RSA
ssl_certificate /usr/local/nginx/conf/ssl/wzfou.com.crt;
ssl_certificate_key /usr/local/nginx/conf/ssl/wzfou.com.key;
أعد تشغيل Nginx عندما يصل مستخدمون مثل XP الذين لا يدعمون شهادات ECC إلى موقع الويب، يتم عرض شهادة RSA.
يفضل المستخدمون الآخرون استخدام شهادات ECC.
إذا وجدت أن ECC لا يتم عرضه بشكل تفضيلي، فتحقق مما إذا كان ssl_prefer_server_ciphers
ممكّنًا، وما إذا كان ssl_ciphers
قد تم تكوينه بشكل صحيح. وفيما يلي التكوين الذي يستخدمه wzfou.com:
ssl_prefer_server_ciphers on;
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5;
بالإضافة إلى ذلك، يمكنك اختيار أي واحد من الخيارات الثلاثة التالية (للاختبار فقط):
ssl_ciphers 'EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5';
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK';
6. تمكين DNS CAA
تتمثل وظيفة DNS CAA في السماح فقط لـ CAA المدرج في السجل بإصدار شهادات لاسم المجال (أو اسم النطاق الفرعي) لمنع أي شخص من تزوير شهادات SSL، وفي الوقت نفسه، يمكن لسجل CAA التحكم في إصدار مجال واحد اسم شهادات SSL ويمكنه أيضًا التحكم في شهادة Wildcard. للحصول على طرق تفصيلية، راجع: إعدادات JD Cloud DNS CAA.
المشكلة:يؤدي تمكين DNS CAA إلى حدوث خطأ: التحقق من الخطأ: سجل CAA لإصدار *.wzfou.comprevents. الحل هو إضافة سجل issuewild
: 0 Issuewild "letsencrypt.org"
. بالإضافة إلى ذلك، يتم توفير موقعين على شبكة الإنترنت للتحقق مما إذا كان تكوين CAA صحيحًا:
- HTTPS://CAA test.co.UK/
- HTTPS://أصدقاء ليلة رأس السنة الجديدة.IO/labs/CAA-validator
7. تحديث شهادات SSL تلقائيًا بانتظام
إذا كنت تريد التحديث يدويًا:
# RSA
$ acme.sh --renew -d wzfou.com –d www.wzfou.com --force
# ECC
acme.sh --renew -d wzfou.com –d www.wzfou.com --force --ecc
بشكل عام، أضاف acme.sh تلقائيًا مهام مجدولة لتحديث شهادة Let's Encrypt بانتظام. إذا وجدت أن الشهادة لا يتم تحديثها بانتظام، فتحقق مما إذا كانت مهمة Cron الخاصة بك صحيحة، ويمكنك أيضًا محاولة فرض التحديث:
"/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" --force
8. تحقق من تكوين شهادة SSL
تشمل مواقع الاختبار الشائعة الاستخدام ما يلي:
- HTTPS://wuwuwu.SSL labs.com/SSL test/analyze.HTML
- https://nokill.com/
يوصى بشدة باستخدام ssllabs.com، ولا تزال نتائج الاختبار دقيقة للغاية، كما يلي:
9. شامل
استنادًا إلى استراتيجيات التحسين المذكورة أعلاه، يكون التحسين المحدد لملف تكوين Nginx كما يلي:
server {
listen 443 ssl http2;
#使用HTTP/2,需要Nginx1.9.7以上版本
add_header Strict-Transport-Security "max-age=6307200; includeSubdomains; preload";
#开启HSTS,并设置有效期为“6307200秒”(6个月),包括子域名(根据情况可删掉),预加载到浏览器缓存(根据情况可删掉)
add_header X-Frame-Options DENY;
#禁止被嵌入框架
add_header X-Content-Type-Options nosniff;
#防止在IE9、Chrome和Safari中的MIME类型混淆攻击
ssl_certificate /usr/local/nginx/conf/vhost/sslkey/www.linpx.com.crt;
ssl_certificate_key /usr/local/nginx/conf/vhost/sslkey/www.linpx.com.key;
#SSL证书文件位置
ssl_trusted_certificate /usr/local/nginx/conf/vhost/sslkey/chaine.pem;
#OCSP Stapling的证书位置
ssl_dhparam /usr/local/nginx/conf/vhost/sslkey/dhparam.pem;
#DH-Key交换密钥文件位置
#SSL优化配置
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#只允许TLS协议
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
#加密套件,这里用了CloudFlare's Internet facing SSL cipher configuration
ssl_prefer_server_ciphers on;
#由服务器协商最佳的加密算法
ssl_session_cache builtin:1000 shared:SSL:10m;
#Session Cache,将Session缓存到服务器,这可能会占用更多的服务器资源
ssl_session_tickets on;
#开启浏览器的Session Ticket缓存
ssl_session_timeout 10m;
#SSL session过期时间
ssl_stapling on;
#OCSP Stapling开启,OCSP是用于在线查询证书吊销情况的服务,使用OCSP Stapling能将证书有效状态的信息缓存到服务器,提高TLS握手速度
ssl_stapling_verify on;
#OCSP Stapling验证开启
resolver 8.8.8.8 8.8.4.4 valid=300s;
#用于查询OCSP服务器的DNS
resolver_timeout 5s;
#查询域名超时时间
···
}
أثناء الاستخدام الفعلي، وجد أن "التحسينات" الفردية يجب تحديدها وفقًا لاحتياجات الفرد الخاصة. وفيما يلي تكوين Nginx المستخدم حاليًا بواسطة wzfou.com، كمرجع فقط:
listen 80;
listen 443 ssl http2;
#ECC
ssl_certificate /root/.acme.sh/wzfou.com_ecc/fullchain.cer;
ssl_certificate_key /root/.acme.sh/wzfou.com_ecc/wzfou.com.key;
#RSA
ssl_certificate /usr/local/nginx/conf/ssl/wzfou.com.crt;
ssl_certificate_key /usr/local/nginx/conf/ssl/wzfou.com.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_timeout 10m;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_buffer_size 1400;
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
ssl_stapling on;
ssl_stapling_verify on;
ملاحظة: تم التحديث في 5 أغسطس 2018. شكرًا لـ xiaoz على التذكير، إليك موقع ويب لإنشاء تكوين SSL عبر الإنترنت، من Mozilla، والذي يمكن الرجوع إليه كثيرًا:
- https://Mozilla.GitHub.IO/server-dead-torres/ ratings-config-generator/