תעבורת HTTPS גדלה, והשרתים האחוריים נחנקים מלחיצות ידיים של TLS. כל בקשה חדשה דורשת הצפנה א-סימטרית — ב-10,000 RPS, המעבד מגיע ל-90% עומס. במקום שכל שרת upstream יבזבז משאבים, אנו מורידים את סיום ה-SSL למאזן העומס. זהו נוהג סטנדרטי המתואר בויקיפדיה. אנו מגדירים זאת כך שהאישורים מתחדשים ללא השבתה והלקוחות לא רואים שגיאות.
מדוע סיום SSL מפחית את עומס השרתים האחוריים
לחיצות ידיים של SSL דורשות פעולות א-סימטריות יקרות. אם כל שרת אחורי מטפל בהן באופן עצמאי, המעבד כבר עמוס ב-10k RPS. הורדת העומס למאזן העומס מפחיתה את העומס ב-60–80% ומפשטת את ניהול האישורים: דומיין אחד — אישור אחד, לא עותקים על כל מכונה. מאזן העומס מטפל בכל פעולות ההצפנה, בעוד השרתים האחוריים עובדים על HTTP, מה שמאיץ עוד יותר את התגובות. חיסכון במעבד מסיום SSL בולט במיוחד בעומס גבוה — ניתן לחסוך עד $2,000 לשרת בשנה בעלויות מעבד.
אילו בעיות פותר סיום SSL?
הבעיה הנפוצה ביותר היא שרשרת אישורים לא מלאה. מאזן העומס שולח רק את אישור העלה ללא ה-CA הביניים. הדפדפן סומך עליו, curl שותק, אך openssl s_client -connect example.com:443 -showcerts מציג Verify return code 21 — לא ניתן לאמת את האישור הראשון. לקוחות ניידים וגרסאות JDK ישנות נכשלים עם 'PKIX path building failed'.
נקודת הכאב השנייה היא חידוש אוטומטי של Let's Encrypt. Certbot חידש את האישור, אך HAProxy לא טען אותו מחדש ללא אתחול — ב-3 לפנות בוקר האתר מגיש אישור שפג תוקפו. אנו פותרים זאת באמצעות Runtime API או אותות טעינה מחדש ללא אובדן חיבור.
בדיקת שרשרת האישורים
לאבחון, השתמשו בפקודהopenssl s_client -connect example.com:443 -showcerts. אם קוד ההחזרה הוא 21, שלבו את fullchain.pem, אישור הביניים ואישור השורש לקובץ אחד. בדיקה דרך SSL Labs תעניק דירוג A+.
כיצד הגדרנו סיום SSL עבור אשכול פינטק
לאחרונה הגדרנו אשכול HAProxy עבור חברת פינטק: 20 דומיינים, עדכונים ללא השבתה דרך Runtime API. בעבר, כל שרת אחורי טיפל ב-SSL באופן עצמאי — ב-15k RPS, המעבד היה עמוס ב-90%. לאחר העברת הסיום למאזן העומס, העומס ירד ל-25%, ודירוג SSL Labs הגיע ל-A+. האישורים מתחדשים אוטומטית דרך deploy-hook עם אפס השבתה במשך שישה חודשי פעילות. כפי שנכתב בתיעוד HAProxy: Runtime API מאפשר עדכון אישורים ללא אתחול התהליך.
הגדרת סיום SSL שלב אחר שלב
- בחרו מאזן עומס: nginx לפרויקטים פשוטים (1–10 דומיינים), HAProxy לאשכולות הדורשים אפס השבתה.
- צרו אישור: קבלו fullchain.pem ו-privkey.pem מ-Let's Encrypt או מ-CA מסחרי.
- הגדירו: ציינו ssl_certificate, ssl_certificate_key, הגבילו פרוטוקולים (TLSv1.2+TLSv1.3) וצופנים (ECDHE+AES-GCM).
- בדקו: בדקו את השרשרת, HSTS, X-Forwarded-Proto באמצעות testssl.sh ו-Security Headers Score.
- חידוש אוטומטי: הגדירו deploy-hook לעדכון האישור ללא השבתה.
תצורת nginx עם סיום SSL
upstream backend {
server 10.0.1.10:8080;
server 10.0.1.11:8080;
keepalive 32;
}
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/ssl/certs/example.com.fullchain.pem;
ssl_certificate_key /etc/ssl/private/example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
add_header Strict-Transport-Security "max-age=63072000" always;
location / {
proxy_pass http://backend;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}הכותרת upstream backend { server 10.0.1.10:8080; server 10.0.1.11:8080; keepalive 32; } server { listen 443 ssl http2; server_name example.com; ssl_certificate /etc/ssl/certs/example.com.fullchain.pem; ssl_certificate_key /etc/ssl/private/example.com.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers off; ssl_session_cache shared:SSL:10m; ssl_session_timeout 1d; ssl_session_tickets off; add_header Strict-Transport-Security "max-age=63072000" always; location / { proxy_pass http://backend; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_http_version 1.1; proxy_set_header Connection ""; } } server { listen 80; server_name example.com; return 301 https://$host$request_uri; } היא קריטית — בלעדיה, האפליקציה חושבת שקיבלה בקשת HTTP ומייצרת קישורי http://, מה ששובר הפניות ו-Mixed Content.
HAProxy עם חידוש אישורים אוטומטי
HAProxy מגרסה 2.2 יכול לטעון אישורים מחדש ללא אתחול דרך Runtime API:
echo "set ssl cert /etc/haproxy/certs/example.com.pem < /etc/haproxy/certs/example.com.new.pem" \
| socat stdio /run/haproxy/admin.sock
echo "commit ssl cert /etc/haproxy/certs/example.com.pem" \
| socat stdio /run/haproxy/admin.sockזה מאפשר שילוב deploy-hook של Certbot ללא השבתה:
# /etc/letsencrypt/renewal-hooks/deploy/haproxy-reload.sh
cat /etc/letsencrypt/live/example.com/fullchain.pem \
/etc/letsencrypt/live/example.com/privkey.pem \
> /etc/haproxy/certs/example.com.pem
echo "set ssl cert /etc/haproxy/certs/example.com.pem < /etc/haproxy/certs/example.com.pem" \
| socat stdio /run/haproxy/admin.sock
echo "commit ssl cert /etc/haproxy/certs/example.com.pem" \
| socat stdio /run/haproxy/admin.sock בחירה בין nginx ל-HAProxy
בבחירת מאזן עומס, שקלו את המורכבות: HAProxy מתמודד עם עד מיליון לחיצות ידיים/שנייה — פי 1.2 מהר יותר מ-nginx על מעבד חלש.
| פרמטר | nginx | HAProxy |
|---|---|---|
| פשטות התצורה | גבוהה | בינונית |
| עדכון אישורים דינמי | דורש טעינה מחדש (graceful) | Runtime API (ללא אובדן) |
| ביצועי TLS | ~90% מ-HAProxy | ייחוס (עד 1M לחיצות ידיים/שנייה) |
| טיפול בריבוי דומיינים | דרך server_name | דרך SNI (דורש הגדרה) |
אם יש לכם 1–10 דומיינים ואתם רוצים מהירות, השתמשו ב-nginx. אם יש לכם אשכול של 100+ דומיינים ואפס השבתה הוא קריטי, השתמשו ב-HAProxy.
טעויות נפוצות וכיצד להימנע מהן
- שרשרת לא מלאה: בדקו עם
X-Forwarded-Proto: https. אם קוד 21 — שלבו fullchain + int + root. - הפניה HTTP→HTTPS ללא HSTS: תוקף יכול לבצע מתקפת הורדת דרגה. הוסיפו
echo "set ssl cert /etc/haproxy/certs/example.com.pem < /etc/haproxy/certs/example.com.new.pem" \ | socat stdio /run/haproxy/admin.sock echo "commit ssl cert /etc/haproxy/certs/example.com.pem" \ | socat stdio /run/haproxy/admin.sock. - חוסר ב-X-Forwarded-Proto: האפליקציה מייצרת קישורי http. תמיד העבירו את הפרוטוקול.
- חידוש אישורים ידני: הגדירו deploy-hook מיד כדי לא לשכוח.
- ללא בדיקת SSL Labs לאחר הפריסה: המטרה היא דירוג A+.
תהליך העבודה שלנו ולוחות זמנים
| שלב | משך |
|---|---|
| ביקורת ואיסוף דרישות | 2–4 שעות |
| עיצוב ארכיטקטורה | 1–2 שעות |
| יישום בסביבת staging | 4–8 שעות |
| בדיקות (SSL Labs, curl, חידוש אוטומטי) | 2–4 שעות |
| פריסה לייצור | 1–2 שעות |
| היקף | לוח זמנים |
|---|---|
| מאזן עומס יחיד, דומיין אחד | 4–8 שעות |
| ריבוי דומיינים, wildcard | יום אחד |
| אשכול HAProxy/nginx + חידוש אוטומטי | 1–2 ימים |
מה כלול בהתקנה
- ביקורת של תכנית איזון העומס והאישורים הנוכחית
- עיצוב תצורה אופטימלית (nginx/HAProxy, בחירת פרוטוקולים)
- הגדרת סיום SSL עם בדיקת שרשרת
- שילוב חידוש אוטומטי של Let's Encrypt דרך deploy-hook
- בדיקת אבטחה: HSTS, X-Forwarded-Proto, Security Headers
- תיעוד מלא של התצורה והנהלים
- הדרכה למהנדסי כוננות (עד שעתיים)
- תמיכת אחריות לשבועיים עם סיוע מרחוק
עם ניסיון של למעלה מ-5 שנים ו-50+ פרויקטים מוצלחים, הצוות שלנו מספק פתרונות אמינים להורדת SSL. קבלו ייעוץ על הגדרת סיום SSL לפרויקט שלכם — נעריך את התכנית הנוכחית שלכם ונציע תצורה אופטימלית. צרו קשר כדי לדון בפרטים.







