sudo apt install certbot python3-certbot-nginx ואז sudo certbot --nginx -d example.co.il -d www.example.co.il (ב-Apache: python3-certbot-apache ו---apache). certbot מנפיק את התעודה, מגדיר את השרת ומתקין חידוש אוטומטי. בסוף בודקים את החידוש עם sudo certbot renew --dry-run.תעודת SSL חינמית של Let's Encrypt נותנת לאתר שלכם HTTPS מלא, עם אותה הצפנה ואותו מנעול בדפדפן כמו תעודה בתשלום. על שרת לינוקס ההתקנה לוקחת כמה דקות עם הכלי certbot, שמאמת שהדומיין שלכם, מנפיק תעודה ומגדיר את Nginx או Apache בשבילכם. החלק שבאמת דורש תשומת לב הוא לא ההתקנה אלא החידוש: התעודות קצרות מועד, ואתר שהתעודה שלו פקעה בשבת בבוקר נראה לגולשים כמו אתר פרוץ.
מה זה SSL, TLS ו-HTTPS?
HTTPS הוא HTTP רגיל שעובר בתוך חיבור מוצפן בפרוטוקול TLS. "SSL" הוא השם של הפרוטוקול הקודם, שכבר לא בשימוש, אבל השם נשאר בשפה היומיומית - כשמישהו אומר "תעודת SSL" הוא מתכוון לתעודת TLS. התעודה עושה שני דברים: היא מוכיחה לדפדפן שהשרת שעונה הוא באמת של הדומיין, ומאפשרת להקים מפתח הצפנה משותף כך שאף אחד בדרך - ספק האינטרנט, רשת ה-WiFi בבית הקפה - לא יכול לקרוא או לשנות את התעבורה.
למה זה חשוב גם לאתר תדמית בלי טפסים?
- דפדפנים - Chrome ושאר הדפדפנים מסמנים אתרי HTTP כ"לא מאובטח", ותכונות מודרניות רבות (מיקום, מצלמה, Service Workers, HTTP/2 בפועל) עובדות רק ב-HTTPS.
- SEO - גוגל מתייחסת ל-HTTPS כאות דירוג. המשקל הישיר קטן, אבל אזהרת "לא מאובטח" מורידה אמון והמרות.
- פרטיות - סיסמאות ניהול, עוגיות כניסה ופרטי טפסים עוברים מוצפנים. בחנות או באתר שאוסף פרטים זו כבר לא המלצה אלא דרישה בסיסית.
מה ההבדל בין תעודת SSL חינמית לתעודה בתשלום?
ההבדל אינו בהצפנה אלא ברמת האימות ובשירות שמסביב. Let's Encrypt מנפיקה רק תעודות DV, שמאמתות שליטה בדומיין. לרוב האתרים, כולל חנויות, זה בדיוק מה שצריך - הדפדפן מציג אותו מנעול בדיוק.
| סוג תעודה | מה מאומת | מתי זה רלוונטי |
|---|---|---|
| DV (כולל Let's Encrypt) | שליטה בדומיין בלבד | אתרי תדמית, בלוגים, חנויות, אפליקציות ו-API. רוב האתרים ברשת |
| OV | שליטה בדומיין וגם קיום הארגון | כשלקוח או מכרז דורשים זאת במפורש, או כשהתעודה צריכה להופיע עם שם החברה |
| EV | בדיקת ארגון מורחבת | דרישות רגולציה או מדיניות פנימית. דפדפנים כבר לא מציגים לה סימון מיוחד בשורת הכתובת |
הסיבות האמיתיות לשלם על תעודה היום הן תוקף ארוך יותר במערכות שלא ניתן לבצע בהן חידוש אוטומטי (ציוד ישן, מערכות סגורות), או דרישה חוזית. אם אין לכם אחת מהן, אין סיבה להוציא כסף.
מה צריך לפני שמתקינים תעודת Let's Encrypt?
צריך שלושה דברים: דומיין שמצביע לשרת, פורט 80 פתוח מהאינטרנט, ושרת אינטרנט שעובד ב-HTTP. Let's Encrypt מאמתת בעלות על הדומיין באתגר HTTP-01: היא פונה לכתובת http://example.co.il/.well-known/acme-challenge/... ומצפה למצוא שם קובץ ש-certbot יצר. אם הדומיין עדיין מצביע לשרת הישן, או שחומת האש חוסמת את 80, האימות ייכשל.
# ודאו שהדומיין מצביע לכתובת השרת
dig +short example.co.il
dig +short www.example.co.il
# פתחו פורטים בחומת האש (ufw)
sudo ufw allow 'Nginx Full' # או: sudo ufw allow 'Apache Full'
sudo ufw status
ודאו שגם בחומת האש של ספק הענן, אם יש כזו, פורטים 80 ו-443 פתוחים. ואם העברתם לאחרונה את רשומות ה-DNS, תנו להן זמן להתעדכן לפני שמנסים. אם השרת עוד לא מוכן בכלל, המדריך צ'קליסט אבטחת שרת לינוקס עובר על ההגדרות הבסיסיות, כולל ufw.
איך מתקינים SSL עם certbot על Nginx ב-Ubuntu 24.04?
מתקינים את certbot ואת התוסף של Nginx מהמאגרים של אובונטו, ומריצים certbot עם כל השמות שהאתר עונה להם:
sudo apt update
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d example.co.il -d www.example.co.il
בהרצה הראשונה certbot ישאל כתובת מייל ויבקש אישור לתנאי השימוש. לאחר מכן הוא מוצא את בלוק ה-server שבו server_name תואם לדומיין, מבצע את האימות, ומוסיף לקובץ את הגדרות ה-443 והפניה מ-HTTP ל-HTTPS. לכן חשוב ש-server_name יהיה מוגדר נכון לפני ההרצה - בלי זה certbot לא ידע איזה אתר לערוך.
הקבצים נשמרים תחת /etc/letsencrypt/live/example.co.il/: fullchain.pem (התעודה עם השרשרת) ו-privkey.pem (המפתח הפרטי). אל תעתיקו אותם למקום אחר - תפנו אליהם, כי בכל חידוש הקישורים בתיקייה מתעדכנים לקבצים החדשים.
איך מתקינים SSL עם certbot על Apache?
ב-Apache התהליך כמעט זהה, רק עם תוסף אחר:
sudo apt install certbot python3-certbot-apache
sudo certbot --apache -d example.co.il -d www.example.co.il
certbot מחפש VirtualHost עם ServerName או ServerAlias תואמים, יוצר קובץ -le-ssl.conf מקביל עם הגדרות 443, ומפעיל את מודול ssl אם צריך. אחרי ההתקנה כדאי להריץ sudo apache2ctl configtest כדי לוודא שהקונפיגורציה תקינה, במיוחד אם הקבצים שלכם מותאמים ידנית.
אם אתם מעדיפים ש-certbot לא ייגע בקבצי ההגדרות, אפשר רק להנפיק את התעודה ולהגדיר בעצמכם:
sudo certbot certonly --webroot -w /var/www/example -d example.co.il -d www.example.co.il
זו הגישה שאני מעדיף בשרתים עם הגדרות מורכבות, כי ברור מה שונה ומתי.
איך מפנים את כל התעבורה מ-HTTP ל-HTTPS?
certbot בגרסאות החדשות מוסיף הפניה אוטומטית. אם בחרתם שלא, או שאתם מגדירים ידנית, ב-Nginx זה בלוק אחד:
server {
listen 80;
listen [::]:80;
server_name example.co.il www.example.co.il;
return 301 https://$host$request_uri;
}
וב-Apache, בתוך ה-VirtualHost של פורט 80:
Redirect permanent / https://example.co.il/
השתמשו ב-301 ולא ב-302, כדי שמנועי החיפוש יעבירו את הדירוג לכתובות ה-HTTPS. ובחרו גרסה קנונית אחת - עם www או בלי - והפנו אליה את השנייה.
איך מוודאים שהחידוש האוטומטי של התעודה עובד?
certbot מתקין טיימר של systemd שרץ פעמיים ביום ומחדש כל תעודה שמתקרבת לפקיעה. תעודות Let's Encrypt תקפות כיום ל-90 יום, והארגון כבר הודיע שהן יתקצרו עוד, כך שחידוש ידני פשוט לא בא בחשבון. בודקים שני דברים:
# 1. הטיימר פעיל
systemctl list-timers | grep certbot
# בהתקנת apt: certbot.timer | בהתקנת snap: snap.certbot.renew.timer
# 2. תהליך החידוש עובד מקצה לקצה (בלי להנפיק תעודה אמיתית)
sudo certbot renew --dry-run
# רשימת התעודות ותאריכי הפקיעה
sudo certbot certificates
אם ה-dry-run עובר, אתם במצב טוב. שני דברים שגורמים לחידוש להיכשל אחרי חודשים של שקט: מישהו סגר את פורט 80 "כי האתר ממילא ב-HTTPS", או שהדומיין עבר ל-CDN או לשרת אחר. אל תסמכו על מיילים של תזכורת - Let's Encrypt הפסיקה לשלוח אותם ביוני 2025. עדיף ניטור חיצוני שבודק את תאריך הפקיעה ומתריע שבועיים מראש.
אם יש לכם שירות נוסף שמשתמש באותה תעודה, למשל שרת דואר, הוסיפו hook שמטעין אותו מחדש אחרי חידוש:
sudo sh -c 'printf "#!/bin/sh\nsystemctl reload postfix\n" > /etc/letsencrypt/renewal-hooks/deploy/reload-postfix.sh'
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-postfix.sh
איך מקבלים תעודת Wildcard עם אימות DNS-01?
תעודת Wildcard, כמו *.example.co.il, אפשר לקבל רק באימות DNS-01: במקום קובץ בשרת, יוצרים רשומת TXT בשם _acme-challenge באזור ה-DNS של הדומיין. זה גם הפתרון לשרת שאין לו פורט 80 פתוח בכלל, למשל שרת פנימי.
# הנפקה ידנית - certbot יציג את ערך ה-TXT שצריך להוסיף
sudo certbot certonly --manual --preferred-challenges dns \
-d example.co.il -d '*.example.co.il'
הבעיה בשיטה הידנית: היא לא מתחדשת לבד, ובעוד כמה חודשים תצטרכו לזכור לעשות את זה שוב. בשביל חידוש אוטומטי משתמשים בתוסף DNS שמדבר עם ה-API של ספק ה-DNS. לדוגמה, ל-Cloudflare:
sudo apt install python3-certbot-dns-cloudflare
# קובץ עם API Token בהרשאת עריכת DNS בלבד
sudo chmod 600 /root/.secrets/cloudflare.ini
sudo certbot certonly --dns-cloudflare \
--dns-cloudflare-credentials /root/.secrets/cloudflare.ini \
-d example.co.il -d '*.example.co.il'
יש תוספים לספקי DNS נפוצים נוספים. אם לספק שלכם אין תוסף, שקלו להעביר את ניהול ה-DNS לספק שיש לו API - זה חוסך כאב ראש קבוע.
מה זה HSTS והאם כדאי להפעיל אותו?
HSTS הוא כותרת שאומרת לדפדפן "מהיום, לדומיין הזה פנה רק ב-HTTPS", כך שגם אם מישהו מקליד http:// או לוחץ על קישור ישן, הדפדפן לא שולח אפילו בקשה אחת לא מוצפנת. כדאי להפעיל אותו, אבל בהדרגה:
# Nginx - בתוך בלוק server של 443
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# Apache - אחרי sudo a2enmod headers
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
התחילו עם max-age=300 לכמה ימים, ודאו שכל תת-הדומיינים עובדים ב-HTTPS (כולל ממשקים פנימיים שאולי שכחתם), ורק אז העלו לשנה. אל תוסיפו preload ואל תגישו לרשימת ה-preload של הדפדפנים אם אינכם בטוחים - ההסרה משם לוקחת זמן רב, ובינתיים כל תת-דומיין בלי HTTPS פשוט לא ייפתח.
איך בודקים שתעודת ה-SSL מותקנת נכון?
הבדיקה המהירה ביותר מהטרמינל היא openssl s_client, שמתחברת לשרת כמו דפדפן ומציגה את התעודה שהוא מגיש:
echo | openssl s_client -connect example.co.il:443 -servername example.co.il 2>/dev/null \
| openssl x509 -noout -subject -issuer -dates
# בדיקת ההפניה וה-HSTS
curl -sI http://example.co.il | head -3
curl -sI https://example.co.il | grep -i strict
בפלט מחפשים שלושה דברים: subject עם הדומיין הנכון, issuer של Let's Encrypt, ו-notAfter עם תאריך עתידי. הפרמטר -servername חשוב - בלעדיו, בשרת עם כמה אתרים, תקבלו את תעודת ברירת המחדל ותחשבו שיש בעיה. לבדיקה מקיפה יותר של פרוטוקולים והצפנים יש כלים מקוונים כמו SSL Labs.
למה התקנת תעודת SSL נכשלת? שגיאות נפוצות
רוב הכשלים נובעים מכך ש-Let's Encrypt לא מצליחה להגיע לשרת שלכם בדומיין שביקשתם. ההודעה של certbot בדרך כלל מפרטת את סוג השגיאה ואת הכתובת שנבדקה:
| תסמין או הודעה | סיבה | פתרון |
|---|---|---|
| Timeout during connect (likely firewall problem) | פורט 80 חסום - בחומת האש של השרת, של הספק, או אצל ספק האינטרנט בשרת ביתי | פתחו את 80 ב-ufw ובפאנל. אם אי אפשר לפתוח - עברו לאימות DNS-01 |
| DNS problem: NXDOMAIN או no valid A records | הדומיין או ה-www לא מוגדרים ב-DNS, או שעדיין לא התעדכנו | בדקו עם dig +short ותקנו את רשומת A (ו-AAAA) |
| Invalid response from ... 404 | הדומיין מצביע לשרת אחר, או ש-Nginx/Apache מגישים אתר אחר מהצפוי | ודאו שה-IP נכון. אם יש רשומת AAAA ישנה, Let's Encrypt עשויה לבדוק דרך IPv6 - מחקו או תקנו אותה |
| too many certificates already issued | הגעתם למגבלת קצב (Rate Limit) - מגבלות שבועיות על מספר התעודות לדומיין ולאותה קבוצת שמות | חכו שהחלון יתאפס. לניסויים השתמשו ב---dry-run או ב---test-cert (שרת הבדיקות) |
| מנעול עם אזהרה / "לא מאובטח" חלקי | תוכן מעורב: קבצים שנטענים ב-http:// בתוך דף HTTPS | F12 ← Console מציג את הקבצים. החליפו את הכתובות ל-https או לנתיב יחסי |
| הדפדפן מציג תעודה של דומיין אחר | Nginx/Apache לא מזהים את ה-server_name ומגישים את ברירת המחדל | בדקו את server_name/ServerName והריצו nginx -t או apache2ctl -S |
| התעודה פקעה למרות certbot | החידוש נכשל בשקט - פורט 80 נסגר, DNS השתנה, או שהשירות לא נטען מחדש | sudo certbot renew --dry-run והלוג ב-/var/log/letsencrypt/letsencrypt.log |
טיפ שחוסך הרבה תסכול: לפני כל ניסוי חוזר הריצו --dry-run. הוא עובד מול שרת הבדיקות של Let's Encrypt, שמגבלות הקצב שלו נדיבות בהרבה, וכך תקלה בהגדרות לא תשרוף לכם את המכסה של השרת האמיתי.
מה עוד צריך לעשות באתר וורדפרס אחרי התקנת SSL?
בוורדפרס צריך לעדכן את כתובת האתר ל-https בהגדרות (או ב-wp-config.php), ואז להחליף קישורים ישנים בתוכן. הדרך הבטוחה היא WP-CLI:
wp search-replace 'http://example.co.il' 'https://example.co.il' --all-tables --dry-run
# אחרי שבדקתם את התוצאה - בלי --dry-run
קחו גיבוי של מסד הנתונים לפני כן. שאר ההגדרות - מטמון, PHP ומסד נתונים - מפורטות במדריך וורדפרס על שרת ענן.
איך מתקינים Let's Encrypt על שרת Windows עם IIS?
על Windows Server עם IIS הכלי המקובל הוא win-acme. מורידים את הגרסה העדכנית מהאתר הרשמי של הפרויקט, פורסים לתיקייה, ומריצים את wacs.exe כמנהל. בתפריט בוחרים יצירת תעודה, בוחרים את האתר מתוך רשימת אתרי IIS, ו-win-acme מנפיק את התעודה, מוסיף binding של HTTPS ויוצר משימה מתוזמנת ב-Task Scheduler לחידוש. גם כאן העיקרון זהה: פורט 80 פתוח לאימות, או אימות DNS.
איזו שיטה לבחור?
לאתר רגיל על שרת ענן לינוקס: certbot --nginx או --apache, ובדיקת dry-run מיד אחרי. לכמה תת-דומיינים דינמיים או לשרת בלי פורט 80 פתוח: Wildcard עם תוסף DNS. ל-IIS: win-acme. בכל המקרים, ההתקנה היא החלק הקל. מה שמבדיל שרת מסודר הוא שמישהו בדק שהחידוש עובד, ויש ניטור שיתריע לפני שהתעודה פוקעת.