עבור לתוכן
Alex Kovalev

SSL לפשוטי העם, או: אתם לא צריכים את PunchSalad

מדריך פרקטי להנפקת תעודת SSL בחינם עם Certbot, מעבר אתגר ה-ACME HTTP דרך ‎.well-known, והגדרת חידוש בלי שירות SSL בתשלום.

Guide5דקות קריאה
פיטר ברויגל, "הקוצרים": איכרים קוצרים חיטה ואוכלים ארוחת צהריים מתחת לעץ אגס.
פיטר ברויגל, "הקוצרים": איכרים קוצרים חיטה ואוכלים ארוחת צהריים מתחת לעץ אגס.

לרוב פאנלי האחסון היום יש כפתור שנקרא SSL, Let’s Encrypt או AutoSSL. תלחצו עליו. אם Cloudflare, cPanel, Plesk, חברת האחסון שלכם או מישהו אחר כבר מחדש את התעודה אוטומטית, תסגרו את המאמר ותצאו החוצה. ניצחתם.

המדריך הזה הוא בשביל הסוג השני של אחסון. זה שמוכר SSL כתוספת בתשלום, נותן לכם מנהל קבצים מ-2009, ואיכשהו משכנע אתכם שבלי PunchSalad המנעול בדפדפן ימות.

הוא לא ימות. PunchSalad עושה בדיוק את אותו אתגר ACME ש-Certbot עושה בחינם.

בקצרה מאוד, מה זה SSL?

SSL זה השם הישן שכולם עדיין משתמשים בו עבור TLS, ההצפנה שמאחורי HTTPS.

כשדפדפן מתחבר, השרת שלכם שולף את התעודה שלו כמו תעודת זהות בכניסה. הדפדפן בודק שלושה דברים: שרשות אישורים (Certificate Authority) שהוא סומך עליה חתמה עליה, שהשם שעליה תואם לדומיין שלכם, ושהתוקף שלה לא פג. אם שלושתם עוברים, השניים מסכימים על מפתחות זמניים וממשיכים עם HTTP הישן והטוב בתוך מנהרה מוצפנת.

התעודה עושה שני דברים שימושיים:

  • מוכיחה שהשרת שעונה בשם example.com באמת שולט ב-example.com;
  • מצפינה את התעבורה בין הגולש לבין השרת הזה.

היא לא מוכיחה שהבעלים הוא אדם נחמד, שהאתר מאובטח, או שבהתקנת ה-WordPress אין תוסף שעודכן לאחרונה בתקופת ממשל אובמה.

איך עובד אתגר ה-ACME

Let’s Encrypt מחלקים תעודות בחינם, אבל קודם הם צריכים הוכחה שהדומיין שלכם. ACME הוא הפרוטוקול שבו מתנהלת השיחה הזאת.

בשפת אדם קדמון:

  1. Certbot מבקש מ-Let’s Encrypt תעודה עבור example.com.
  2. Let’s Encrypt עונה: שים את הטקסט המוזר הזה בקובץ עם השם המוזר הזה.
  3. אתם שמים אותו בכתובת http://example.com/.well-known/acme-challenge/WEIRD-NAME.
  4. Let’s Encrypt מוריד את הקובץ ורואה את הטקסט שציפה לו.
  5. רק מי ששולט באתר יכול היה לעשות את זה, אז הוא מנפיק את התעודה.
לא מאובטחhttp://example.com

Certbot מוסר לכם קובץ:

אני תמיד מסתכל רק ב-/.well-known/acme-challenge/. כל פעם.

עדיין אין תעודהexample.com · Let's Encrypt · בתוקף 90 יום
גררו את הקובץ לתיקייה, או לחצו עליו ואז על תיקייה. הרובוט יעשה את השאר.

זה נקרא HTTP-01 challenge. פורט 80 חייב להיות נגיש מהאינטרנט. התיקייה .well-known היא לא קסם; היא פשוט ארון מוסכם שבו רובוטים של תעודות מחפשים הוכחות.

קודם תנסו את האופציה האוטומטית והמשעממת

אם יש לכם גישת root ואתם משתמשים ב-Nginx או ב-Apache, Certbot יכול לבצע את האתגר, לערוך את הקונפיג של שרת האינטרנט ולסדר לכם חידוש:

Terminal window
sudo certbot --nginx
# or
sudo certbot --apache

זו התשובה הנכונה לרוב השרתים. תבדקו את החידוש פעם אחת ותעזבו את זה בשקט:

Terminal window
sudo certbot renew --dry-run

רוב ההתקנות של Certbot כוללות טיימר של systemd או משימת cron שמריצה certbot renew. אתם לא מחדשים את התעודה על ידי זה שאתם זוכרים אותה כל כמה חודשים. מחשבים די טובים עם לוחות שנה.

webroot, כשאתם רוצים לשלוט בקונפיג בעצמכם

לפעמים אתם לא רוצים ש-Certbot יערוך את Nginx, או שהתוסף של שרת האינטרנט לא מבין את ההגדרות שלכם. התוסף webroot מוכיח שליטה בדומיין על ידי כתיבת קובץ האתגר לתוך תיקיית האתר הקיימת, בלי לעצור את השרת.

נניח שהאתר מוגש מ:

/var/www/example.com/public

תוודאו ש-Nginx מגיש את תיקיית האתגר ב-HTTP רגיל:

server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com/public;
location ^~ /.well-known/acme-challenge/ {
default_type text/plain;
try_files $uri =404;
}
location / {
return 301 https://$host$request_uri;
}
}

לפני שמערבים תעודות, תבדקו את הארון:

Terminal window
sudo mkdir -p /var/www/example.com/public/.well-known/acme-challenge
echo works | sudo tee /var/www/example.com/public/.well-known/acme-challenge/test
curl http://example.com/.well-known/acme-challenge/test
sudo rm /var/www/example.com/public/.well-known/acme-challenge/test

אם curl מדפיס works, תבקשו את התעודה:

Terminal window
sudo certbot certonly --webroot \
-w /var/www/example.com/public \
-d example.com \
-d www.example.com

Certbot ישמור אותה כאן:

/etc/letsencrypt/live/example.com/fullchain.pem
/etc/letsencrypt/live/example.com/privkey.pem

תכוונו את שרת ה-HTTPS לקבצים האלה:

server {
listen 443 ssl;
server_name example.com www.example.com;
root /var/www/example.com/public;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
# The rest of your site config goes here.
}

אחר כך תבדקו ותטענו מחדש את Nginx:

Terminal window
sudo nginx -t
sudo systemctl reload nginx
sudo certbot renew --dry-run

בחידוש, Certbot זוכר שהשתמשתם ב-webroot, שם אתגר חדש באותה תיקייה, מקבל תעודה חדשה ומחליף את הקבצים שמאחורי הנתיבים האלה. Nginx עדיין צריך reload כדי לשים לב להחלפה. תוסיפו deploy hook קבוע שרץ רק אחרי חידוש מוצלח:

sudo mkdir -p /etc/letsencrypt/renewal-hooks/deploy
sudo tee /etc/letsencrypt/renewal-hooks/deploy/reload-nginx >/dev/null <<'EOF'
#!/bin/sh
systemctl reload nginx
EOF
sudo chmod 755 /etc/letsencrypt/renewal-hooks/deploy/reload-nginx
sudo certbot renew --dry-run --run-deploy-hooks
https://example.comפג 2 בדצמ׳ 2026NET::ERR_CERT_DATE_INVALID

דיסק

  • live/example.com/
  • fullchain.pem
  • privkey.pem
  • archive/example.com/
  • privkey1.pem
  • fullchain1.pem
  • privkey2.pem
  • fullchain2.pem

פג 2 בדצמ׳ 2026

זיכרון של nginx

תעודה #1
פג 2 בדצמ׳ 2026

נשארו יותר מ-30 יום. Certbot בודק, מושך בכתפיים, ישן.

הדרך הידנית באמת, לאחסון גרוע

עכשיו הגענו לתרחיש של PunchSalad: האתר באוויר, אבל אין לכם גישת SSH ואין כפתור Let’s Encrypt. אתם עדיין יכולים להריץ את Certbot על מכונת לינוקס אחרת ולהעלות את ההוכחה דרך FTP או דרך מנהל הקבצים של האחסון.

גם מכונת לינוקס אחרת אין? בניתי כלי לתעודת SSL שמנהל את אותה שיחה בדפדפן: נותן לכם את הקבצים (או את רשומות ה-DNS), מבקש מ-Let’s Encrypt לבדוק אותם ומחזיר את התעודה, המפתח וה-CA bundle. הצעדים למטה הם בדיוק מה שהוא עושה בשבילכם.

תריצו:

Terminal window
sudo certbot certonly --manual \
--preferred-challenges=http \
--agree-tos \
-m you@example.com \
-d example.com \
-d www.example.com

Certbot יציג שם קובץ, תוכן לקובץ, וכתובת שנראית בערך כך:

http://example.com/.well-known/acme-challenge/a1b2c3-weird-token

אל תלחצו Enter עדיין. במנהל הקבצים של האחסון:

  1. תפתחו את תיקיית השורש של הדומיין, בדרך כלל public_html.
  2. תיצרו בתוכה את .well-known. תיקיות שמתחילות בנקודה עלולות להיות מוסתרות כברירת מחדל.
  3. תיצרו את acme-challenge בתוך .well-known.
  4. תיצרו בדיוק את הקובץ ש-Certbot ביקש, עם בדיוק התוכן שהוא הדפיס.
  5. תפתחו את הכתובת בדפדפן או עם curl ותוודאו שהיא מחזירה רק את הערך הזה.
  6. תחזרו ל-Certbot ותלחצו Enter.

אם ביקשתם גם את הדומיין החשוף וגם את www, ייתכן ש-Certbot יבקש אתגר נוסף. תחזרו על התהליך. כל hostname חייב להצביע על חשבון האחסון הזה ולהגיש את הקובץ הנכון.

אחרי האימות, Certbot נותן לכם את הקבצים האלה:

קובץמה זה
cert.pemהתעודה של הדומיין שלכם
chain.pemתעודות הביניים של רשות האישורים
fullchain.pemcert.pem ו-chain.pem ביחד
privkey.pemהמפתח הפרטי שלכם; אל תשתפו אותו

פאנל האחסון עשוי לבקש בנפרד Certificate, Private Key ו-CA Bundle. תנו לו את cert.pem, privkey.pem ו-chain.pem. אם הוא מבקש קובץ אחד של שרשרת תעודות, תשתמשו ב-fullchain.pem.

live/example.com/

ציבורי
-----BEGIN CERTIFICATE-----
⋮ example.com
-----END CERTIFICATE-----
ציבורי
-----BEGIN CERTIFICATE-----
⋮ Let's Encrypt
-----END CERTIFICATE-----
ציבורי
-----BEGIN CERTIFICATE-----
⋮ example.com
-----END CERTIFICATE----------BEGIN CERTIFICATE-----
⋮ Let's Encrypt
-----END CERTIFICATE-----
סודי
-----BEGIN PRIVATE KEY-----
⋮ רק על המחשב שלכם
-----END PRIVATE KEY-----

HostPanel SSL/TLS
הפאנל מבקש

  • Chrome
  • Firefox
  • curl, אפליקציות

curl: (60) SSL certificate problem: unable to get local issuer certificate

הקלאסיקה: CA Bundle ריק. curl ישים לב.

המלכודת של המצב הידני

תעודות שהתקבלו עם --manual לא מתחדשות אוטומטית, אלא אם תכתבו authentication hooks שיודעים להעלות את האתגר בשבילכם. תריצו שוב את אותה פקודה ותתקינו את התעודה החדשה הרבה לפני שהנוכחית פגה.

זה לא כישלון של Certbot. חידוש אוטומטי דורש דרך אוטומטית כלשהי להוכיח שליטה ולהתקין את התוצאה. בן אדם שגורר קובץ סודי לתוך public_html הוא, לצערנו, לא API.

https://example.comפג 2 בדצמ׳ 2026

החיבור שלך אינו פרטי

NET::ERR_CERT_DATE_INVALID

  1. certbot certonly --manual
  2. להעלות את הטוקן ל-public_html
  3. להדביק את הקבצים בפאנל

עזבו 0 · בקצב של ~140 מבקרים ביום

מיום 60 הטיימר נכשל. התוכנית הגיבוי זה אתם.

אם חברת האחסון תיתן לכם גישת SSH בהמשך, תעברו ל---webroot. אם היא תוסיף תמיכה מובנית ב-Let’s Encrypt, תשתמשו בה. אם היא ממשיכה לגבות כל שנה על הזכות להדביק תעודות חינמיות לתוך טופס, שווה לשקול להחליף אחסון.

כשזה נכשל

כמעט כל כישלון של HTTP-01 הוא אחד מאלה:

  • הדומיין מצביע על שרת אחר;
  • פורט 80 חסום;
  • .well-known נוצרה מחוץ לתיקיית השורש האמיתית של האתר;
  • WordPress, ‏Nginx או כלל אבטחה כלשהו מיירטים את כתובת האתגר;
  • ביקשתם את ה-hostname של www אבל אין לו רשומת DNS;
  • רשומת IPv6 מסוג AAAA מצביעה למקום אחר מרשומת IPv4 מסוג A;
  • מנהל הקבצים הוסיף בטובו .txt לשם הטוקן.

אל תמשיכו להריץ את Certbot שוב ושוב בתקווה שהאינטרנט ישנה את דעתו. תפתחו את כתובת האתגר המדויקת. עד שהיא לא מחזירה את הערך המדויק, גם Let’s Encrypt לא יכול לאמת אותו.

קישורים שימושיים


תמונת שער: פיטר ברויגל האב, “הקוצרים”, 1565, מוזיאון המטרופוליטן לאמנות, נחלת הכלל.

תגובות

התגובות נשמרות ב-GitHub Discussions (דרך giscus), אז כדי להצטרף לשיחה צריך חשבון GitHub.

אצייץ לך כשיעלה פוסט חדש

מייל אחד על כל פוסט חדש, בדרך כלל ביום שישי. שום דבר מעבר לזה, ואפשר לבטל את המינוי בכל רגע.

מעדיפים קורא RSS? יש פיד RSS.

© Alex Kovalev. כל הזכויות שמורות. · מדיניות פרטיות