שאלה מספר תחומים של SSL באותה כתובת IP ובאותו יציאה?


זה קנוניקל שאלה על אירוח אתרים מרובים SSL על אותו IP.

הייתי תחת הרושם כי כל אישור SSL נדרש זה ייחודי כתובת IP / שילוב פורט. אבל ה ענה על שאלה קודמת שפרסמתי אינו עולה בקנה אחד עם טענה זו.

באמצעות מידע מאותה שאלה, הצלחתי לקבל מספר תעודות SSL לעבוד על אותה כתובת IP ועל יציאה 443. אני מבולבל מאוד מדוע זה עובד בהתחשב בהנחה לעיל חיזקו על ידי אחרים, כי כל אתר תחום SSL על אותו שרת דורש IP משלה / פורט.

אני חושד שעשיתי משהו לא בסדר. האם ניתן להשתמש במספר תעודות SSL בצורה זו?


107
2018-02-04 22:36




זה גוף Q אומר מספר פעמים ואת התשובות נכונות עבור זה. אבל הכותרת אומרת מספר תחומים ואתה יכול להיות מספר תחומים עם cert אחד (ולא SNI), ראה serverfault.com/questions/126072/... ו serverfault.com/questions/279722/... גם לעבור על אבטחה. - dave_thompson_085


תשובות:


למידע העדכני ביותר על Apache ו- SNI, כולל עוד RFCs ספציפיים ל- HTTP, עיין ב ויקי


FYsI: "אישורי SSL מרובים (שונים) ב- IP אחד" מובא אליך על ידי הקסם של שדרוג TLS. זה עובד עם שרתי Apache חדשים יותר (2.2.x) ו דפדפנים לאחרונה סביר (לא יודע גרסאות את החלק העליון של הראש שלי).

RFC 2817 (שדרוג ל TLS בתוך HTTP / 1.1) יש את הפרטים gory, אבל בעצם זה עובד עבור הרבה אנשים (אם לא הרוב).
אתה יכול לשחזר את התנהגות funky הישן עם opensl s_client (או כל דפדפן "ישן מספיק").

ערוך כדי להוסיף: ככל הנראה curl יכול להראות לך מה קורה כאן טוב יותר מאשר openssl:


SSLv3

mikeg@flexo% curl -v -v -v -3 https://www.yummyskin.com
* About to connect() to www.yummyskin.com port 443 (#0)
*   Trying 69.164.214.79... connected
* Connected to www.yummyskin.com (69.164.214.79) port 443 (#0)
* successfully set certificate verify locations:
*   CAfile: /usr/local/share/certs/ca-root-nss.crt
  CApath: none
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Server key exchange (12):
* SSLv3, TLS handshake, Server finished (14):
* SSLv3, TLS handshake, Client key exchange (16):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSL connection using DHE-RSA-AES256-SHA
* Server certificate:
*    subject: serialNumber=wq8O9mhOSp9fY9JcmaJUrFNWWrANURzJ; C=CA; 
              O=staging.bossystem.org; OU=GT07932874;
              OU=See www.rapidssl.com/resources/cps (c)10;
              OU=Domain Control Validated - RapidSSL(R);
              CN=staging.bossystem.org
*    start date: 2010-02-03 18:53:53 GMT
*    expire date: 2011-02-06 13:21:08 GMT
* SSL: certificate subject name 'staging.bossystem.org'
       does not match target host name 'www.yummyskin.com'
* Closing connection #0
* SSLv3, TLS alert, Client hello (1):
curl: (51) SSL: certificate subject name 'staging.bossystem.org'
does not match target host name 'www.yummyskin.com'

TLSv1

mikeg@flexo% curl -v -v -v -1 https://www.yummyskin.com
* About to connect() to www.yummyskin.com port 443 (#0)
*   Trying 69.164.214.79... connected
* Connected to www.yummyskin.com (69.164.214.79) port 443 (#0)
* successfully set certificate verify locations:
*   CAfile: /usr/local/share/certs/ca-root-nss.crt
  CApath: none
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Server key exchange (12):
* SSLv3, TLS handshake, Server finished (14):
* SSLv3, TLS handshake, Client key exchange (16):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSL connection using DHE-RSA-AES256-SHA
* Server certificate:
*    subject: C=CA; O=www.yummyskin.com; OU=GT13670640;
              OU=See www.rapidssl.com/resources/cps (c)09;
              OU=Domain Control Validated - RapidSSL(R);
              CN=www.yummyskin.com
*    start date: 2009-04-24 15:48:15 GMT
*    expire date: 2010-04-25 15:48:15 GMT
*    common name: www.yummyskin.com (matched)
*    issuer: C=US; O=Equifax Secure Inc.; CN=Equifax Secure Global eBusiness CA-1
*    SSL certificate verify ok.

68
2018-02-04 23:46



זה מאוד שימושי - תודה! כל מידע על אופן ההגדרה של Apache עבור TLS במקום SSL? - Josh
אני חושב כי Apache 2.2 רק צריך להיות את TLS סיביות מופעלת ברשימה cypher שלה. אני מודה שאני אף פעם לא רואה את כל "שדרוג מ SSL ל TLS" קצת בפעולה עד שני אתרים אלה אף. ההבנה שלי של TLS המסמכים היא שזה מותר (אבל יוצא דופן) המצב לנהל משא ומתן על סוג זה של שדרוג ... - voretaq7
זו הפעם הראשונה שראיתי את זה ואני עדיין מנסה למשוך את הלסת שלי מהקומה ... - Josh
אישור התשובה שלי פשוט שילש באורך - כנראה תלתל יכול לעשות את שניהם SSLv3 ו TLSv1 משא ומתן אז אני יכול להראות את הכישלון ואת ההצלחה. הלוואי שהיה לי הבאגים פרוטוקול שימושי כדי להראות את החלק קסם למרות. (נבדק גם שמח לדווח כי השרת של johnlai2004 כראוי מכחיש חיבורי SSLv2 :-) - voretaq7
זה מאוד מועיל ואני מקווה johnlai2004 מקבל את התשובה שלך. תודה רבה! - Josh


כן, אבל יש כמה אזהרות.

זה נעשה באמצעות מחוון שם שרת, הרחבה כדי Transport Layer Security.

מהי מחוון שם שרת?

מחוון שם שרת (RFC 6066; מיושן RFC 4366, RFC 3546) הוא הרחבה אבטחה שכבת תעבורה אשר מאפשר ללקוח לספר לשרת את שם המארח הוא מנסה להגיע.

SNI תואם ל- TLS 1.0 ומעלה לפי מפרט, אך היישומים עשויים להשתנות (ראה להלן). זה לא יכול לשמש עם SSL, כך חיבור חייב לנהל משא ומתן TLS (ראה RFC 4346 נספח ה) עבור SNI לשימוש. זה בדרך כלל קורה אוטומטית עם תוכנה נתמכת.

למה צריך SNI?

באופן נורמלי HTTP , הדפדפן יידע את השרת של שם המארח של השרת אותו הוא מנסה להגיע באמצעות Host: כותרת. זה מאפשר עבור שרת אינטרנט על כתובת IP אחת לשרת תוכן עבור מספר המארחים, אשר הידוע בכינויו מבוסס אירוח וירטואלי מבוסס שם.

החלופה היא להקצות כתובות IP ייחודיות עבור כל שם מארח אינטרנט להיות מוגש. זה היה נפוץ בימים הראשונים של האינטרנט, לפני שהיה ידוע כי כתובות IP ייגמר אמצעי שימור התחיל, והוא עדיין נעשה כך עבור מארחים וירטואליים SSL (לא באמצעות SNI).

מכיוון ששיטה זו של העברת שם המארח מחייבת את החיבור כדי להיות כבר הוקם, זה לא עובד עם חיבורי SSL / TLS. כאשר החיבור המאובטח מוגדר, שרת האינטרנט חייב כבר לדעת איזה שם מארח הוא ישרת ללקוח, מכיוון ששרת האינטרנט עצמו מגדיר את החיבור המאובטח.

SNI פותר בעיה זו בכך שהלקוח משדר את שם המארח כחלק ממשא ומתן TLS, כך שהשרת כבר מודע לאיזה מארח וירטואלי יש להשתמש בשירות החיבור. השרת יכול להשתמש באישור ובתצורה עבור המארח הווירטואלי הנכון.

למה לא להשתמש בכתובות IP שונות?

HTTP Host: כותרת הוגדרה כדי לאפשר יותר מאתר אינטרנט אחד להיות מוגש מכתובת IP אחת בשל המחסור בכתובות IPv4, המוכרות כבעייתיות כבר באמצע שנות התשעים. בסביבות אירוח אתרים משותפות, מאות אתרי אינטרנט ייחודיים, שאינם קשורים, יכולים להיות מוגשים באמצעות כתובת IP אחת בדרך זו, תוך שמירה על שטח הכתובות.

סביבות אירוח משותפות מצאו כי הצרכן הגדול ביותר של מרחב כתובות ה- IP היה הצורך באתרי אינטרנט מאובטחים לקבל כתובות IP ייחודיות, ויצרו את הצורך ב- SNI כמדד עצירה בדרך ל- IPv6. היום זה לפעמים קשה להשיג כמו 5 כתובות IP (/ 29) ללא הצדקה משמעותית, לעתים קרובות וכתוצאה מכך עיכובים הפריסה.

עם הופעתו של IPv6, טכניקות שימור כתובות כאלה אינן נחוצות עוד, שכן מארח יחיד יכול לקבל יותר כתובות IPv6 שהוקצו לו מאשר האינטרנט כולו מכיל היום, אבל הטכניקות יהיה עדיין עדיין בשימוש רחוק אל העתיד לשרת IPv4 מדור קודם קשרים.

אזהרות

כמה שילובים של מערכת ההפעלה / דפדפן אינם תומכים ב- SNI (ראה להלן), ולכן השימוש ב- SNI אינו מתאים לכל המצבים. אתרים הממקדים שילובים כאלה של מערכת / דפדפן יצטרכו לוותר על SNI ולהמשיך להשתמש בכתובות IP ייחודיות עבור כל מארח וירטואלי.

שים לב, אף גירסה של Internet Explorer ב- Windows XP אינה תומכת ב- SNI. כמו שילוב זה עדיין מייצג משמעותי (אך בהתמדה ירידה, כ 16% של תעבורת האינטרנט בדצמבר 2012 על פי NetMarketShare) חלק של תעבורת האינטרנט, SNI יהיה לא הולם עבור אתר המיקוד אוכלוסיות אלה משתמשים.

תמיכה

רבים, אבל לא כל, חבילות תוכנה נפוץ תמיכה SNI.

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

תמיכה בספריה

רוב החבילות תלויות בספריה חיצונית כדי לספק תמיכה SSL / TLS.

  • גנו TLS
  • JSSE (Oracle Java) 7 ומעלה, רק כלקוח
  • libcurl 7.18.1 ומעלה
  • NSS 3.1.1 ומעלה
  • OpenSSL 0.9.8 ומעלה
    • OpenSSL 0.9.8f ומעלה, עם תצורת דגלים
  • Qt 4.8 ומעלה

תמיכת שרתים

הגרסאות העדכניות ביותר של תוכנת השרת הפופולרי תמיכה SNI. הוראות התקנה זמינות עבור רוב אלה:

תמיכת לקוחות

רוב דפדפני האינטרנט הנוכחי וסוכני משתמש שורת הפקודה תמיכה SNI.

שולחן העבודה

  • Chrome 5 ואילך
    • Chrome 6 ואילך ב- Windows XP
  • אתר 2 ומעלה
  • Internet Explorer 7 ומעלה, הפועל ב- Windows Vista / Server 2008 ואילך
    • Internet Explorer ב- Windows XP אינו תומך ב- SNI ללא קשר לגירסת IE
  • Konqueror 4.7 ומעלה
  • Opera 8 ומעלה (עשוי לחייב הפעלה של TLS 1.1)
  • Safari 3.0 ב- Windows Vista / Server 2008 ואילך, או Mac OS X 10.5.6 ואילך

נייד

  • דפדפן Android על 3.0 הכוורת ומעלה
  • iOS Safari ב- iOS 4 ואילך
  • Windows Phone 7 ומעלה

שורת הפקודה

  • cURL 7.18.1 ואילך
  • wget 1.14 ואילך (הפצות עשויות להיות מגובות a תיקון עבור תמיכה ב- SNI)

אין תמיכה

  • דפדפן
  • Internet Explorer (כל גרסה) ב- Windows XP

(הערה: מידע על תשובה זו התקבל מ ויקיפדיה.)


96
2017-08-14 23:05



הרבה יותר טוב :-) אני מקווה, זה עשוי בסופו של דבר לקבל ציון גבוה יותר מאשר אחד קיבל עכשיו, אשר, מלבד העריכה האחרונה בחלק העליון, הוא בדרך כלל לא נכון לצערי. - Bruno
@Bruno אני בהחלט לא להתלונן אם אתה מוצא כמה מאות אנשים כדי upvote זה. :) - Michael Hampton♦
דפדפן BlackBerry האחרון (10?) משתמש בגירסה עדכנית של WebKit, לכן סביר מאוד שהוא תומך ב- SNI כעת. - dave1010


הבעיה:

כאשר לקוח אינטרנט ושרת אינטרנט מדברים אחד עם השני על HTTPS, הכי ראשון הדבר שצריך לקרות הוא לחיצת היד המאובטחת.

הנה דוגמה פשוטה של ​​לחיצת יד כזו:

tls handshake

אם זה היה HTTP ולא HTTPS, הדבר הראשון שהלקוח היה שולח היה משהו כזה:

GET /index.html HTTP/1.1
Host: example.com

זה עשה מארחים וירטואליים מרובים על כתובת IP אחת אפשרית, שכן השרת יודע בדיוק מה התחום הלקוח רוצה לגשת, כלומר example.com.

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

עדיין תוכל להגדיר מארחים וירטואליים בשרת האינטרנט שלך, אך השרת תמיד ישלח את אותו אישור לכל לקוח. אם ניסית לארח הן את האתרים example.com והן את אתרי example.org בשרת שלך, השרת תמיד ישלח את האישור עבור example.com כאשר לקוח מבקש חיבור HTTPS. לכן, כאשר לקוח מבקש example.org מעל חיבור HTTPS מבוסס, זה יקרה:

enter image description here

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

הפתרון:

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

זה בדיוק מה SNI, או מחוון שם שרת עושה.

עם SNI, הלקוח שולח את שם השרת אליו הוא רוצה לגשת כחלק מההודעה הראשונה, שלב "לקוח שלום" בתרשים לחיצת יד לעיל.

כמה דפדפני אינטרנט ישנים יותר אינם תומכים ב- SNI. לדוגמה, ב- Windows XP יש אינה גירסה אחת של Internet Explorer כי יש תמיכה SNI. בעת גישה למשאב על HTTPS בשרת שעושה שימוש במארחים וירטואליים של SNI, יוצג בפניך אישור גנרי, שעלול לגרום לדפדפן להציג אזהרה או שגיאה.

enter image description here

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


37
2017-08-14 19:13





http://wiki.apache.org/httpd/NameBasedSSLVHostsWithSNI

דפדפן הלקוח חייב גם לתמוך ב- SNI. הנה כמה דפדפנים שעושים זאת:

* Mozilla Firefox 2.0 or later
* Opera 8.0 or later (with TLS 1.1 enabled)
* Internet Explorer 7.0 or later (on Vista, not XP)
* Google Chrome
* Safari 3.2.1 on Mac OS X 10.5.6 

16
2018-02-05 00:46





תוסף TLS של שם השרת (RFC6066) TLS נדרש עבור Vhosts מבוססי שם לעבוד על HTTPS.

ההרחבה מיושמת באופן נרחב ועדיין לא נתקלתי בבעיות עם התוכנה הנוכחית, אבל יש סיכוי כי חלק מהלקוחות (אלה שאינם תומכים בה) ינותבו לאתר ברירת המחדל שלך אם אתה תלוי ב- SNI.


6
2017-08-14 19:10



בנוסף לתשובה של Falcon IIS גם דורש כמה שינויים מיוחדים כדי לקבל מספר אתרי IIS לעבוד על אותו IP. עליך לערוך ידנית את קובץ ההגדרות עבור השרת או להשתמש בכלי CLI כדי לבצע את השינויים המחייבים, הכלי GUI אינו יכול לעשות זאת. ב- IIS הוא מתייחס כאל הקצאת אישורי SSL למארח כותרות. לאפאצ'י לא היתה בעיה במשך זמן מה. - Brent Pabst
אה, בסדר, זה מנקה קצת. כיצד תוכל לדעת אם לקוח (דפדפן) תומך בכך? לדוגמה, אם אני רוצה לבדוק את MSIE6, איך אני יכול לבדוק את זה בלי להתקין מכונה וירטואלית XP או כך? - Luc
@Luc en.wikipedia.org/wiki/Server_Name_Indication#Support - cjc
@ FALcon SNI לא עובד עם IE ב- XP; אשר עדיין מהווה כמעט רבע ממשתמשי Internet Desktop. לא הייתי קורא לזה "מיושם באופן נרחב" כאשר רבע מבקרים פוטנציאליים לא עובדים. - Chris S
@ מיכאלהמפטון IE משתמש בערימה מקורית של Windows Crypto עבור SSL. XP אינו תומך SNI, עבור כל גירסה של IE פועל של XP לא. IE תומך רק SNI ב Vista ו חדש יותר OSes. - Chris S