คำตอบสั้น ๆ :
SSL เป็นสารตั้งต้นของ TLS SSL เป็นโปรโตคอลที่เป็นกรรมสิทธิ์ที่พัฒนาโดย Netscape Communications ซึ่งเป็นมาตรฐานในภายหลังใน IETF และเปลี่ยนชื่อเป็น TLS กล่าวโดยย่อคือเวอร์ชันต่างๆเรียงตามลำดับนี้: SSLv2, SSLv3, TLSv1.0, TLSv1.1 และ TLSv1.2
ตรงกันข้ามกับความเชื่อที่แพร่หลายค่อนข้างไม่เกี่ยวกับการเรียกใช้บริการบนพอร์ตที่แตกต่างกับ SSL และสามารถที่จะอยู่บนพอร์ตเดียวกันกับตัวแปรข้อความธรรมดาที่มี TLS ทั้ง SSL และ TLS สามารถใช้ได้ทั้งสองวิธี นี่เป็นเรื่องเกี่ยวกับความแตกต่างระหว่าง SSL / TLS เมื่อเชื่อมต่อ (บางครั้งเรียกว่า "implicit SSL / TLS") และ SSL / TLS หลังจากคำสั่งถูกใช้ในระดับโปรโตคอลโดยทั่วไปSTARTTLS
(บางครั้งเรียกว่า "SSL / TLS ชัดเจน") . คำสำคัญในSTARTTLS
คือ "เริ่มต้น" ไม่ใช่ TLS เป็นข้อความที่ระดับโปรโตคอลของแอปพลิเคชันเพื่อระบุว่าจำเป็นต้องมีการเปลี่ยนเป็น SSL / TLS หากยังไม่ได้เริ่มต้นก่อนที่จะแลกเปลี่ยนโปรโตคอลแอปพลิเคชันใด ๆ
การใช้โหมดใดโหมดหนึ่งควรจะเทียบเท่าหากไคลเอ็นต์ได้รับการกำหนดค่าให้คาดหวัง SSL / TLS ไม่ทางใดก็ทางหนึ่งเพื่อไม่ให้ถูกลดระดับเป็นการเชื่อมต่อข้อความธรรมดา
คำตอบอีกต่อไป:
SSL กับ TLS
เท่าที่ฉันทราบ SSLv1 ไม่เคยออกจากห้องแล็บ SSLv2และSSLv3เป็นโปรโตคอลที่พัฒนาโดย Netscape SSLv2 ได้รับการพิจารณาว่าไม่ปลอดภัยมาระยะหนึ่งแล้วเนื่องจากมีแนวโน้มที่จะลดระดับการโจมตี SSLv3 ใช้(3,0)
เป็นหมายเลขเวอร์ชันภายใน (ภายในClientHello
ข้อความ)
TLS เป็นผลมาจากการกำหนดมาตรฐานให้เป็นโปรโตคอลที่เปิดกว้างมากขึ้นภายใน IETF (ฉันคิดว่าฉันได้อ่านที่ไหนสักแห่งบางทีในหนังสือของ E. Rescorla ว่าชื่อนั้นถูกเลือกในลักษณะที่ผู้เข้าร่วมทุกคนไม่พอใจเท่า ๆ กันเพื่อที่จะไม่สนับสนุน บริษัท ใด บริษัท หนึ่ง: นี่เป็นวิธีปฏิบัติทั่วไปในมาตรฐาน เนื้อหา.) ผู้ที่สนใจว่าการเปลี่ยนแปลงสามารถอ่านคำถามที่พบบ่อยเกี่ยวกับรายการSSL-Talk ; มีเอกสารนี้อยู่หลายชุดรอบ ๆ แต่ลิงก์ส่วนใหญ่ (ถึง) ล้าสมัยnetscape.com
TLS ใช้ข้อความที่คล้ายกันมาก (แตกต่างกันพอที่จะทำให้โปรโตคอลเข้ากันไม่ได้แม้ว่าจะเป็นไปได้ที่จะเจรจารุ่นทั่วไป ) TLS 1.0 , 1.1และ1.2 ClientHello
ข้อความใช้(3,1)
, (3,2)
, (3,3)
เพื่อระบุหมายเลขรุ่นซึ่งแสดงให้เห็นชัดเจนต่อเนื่องมาจากใบรับรอง SSL
มีรายละเอียดเพิ่มเติมเกี่ยวกับความแตกต่างของโปรโตคอลในคำตอบนี้
ฉันจะใช้เมื่อใด ฉันจะไม่ใช้อันไหนเมื่อไหร่?
ใช้เวอร์ชันสูงสุดที่คุณสามารถทำได้ ในทางปฏิบัติในฐานะผู้ให้บริการสิ่งนี้จะกำหนดให้ผู้ใช้ของคุณมีลูกค้าที่รองรับเวอร์ชันเหล่านี้ ตามปกติมันเป็นแบบฝึกหัดการประเมินความเสี่ยงเสมอ (ควรได้รับการสนับสนุนมากกว่ากรณีธุรกิจถ้าเหมาะสม) สิ่งนี้ถูกกล่าวว่าให้ตัด SSLv2 ต่อไป
นอกจากนี้โปรดทราบว่าการรักษาความปลอดภัยที่จัดทำโดย SSL / TLS ไม่ได้เกี่ยวกับรุ่นที่คุณใช้ แต่ยังเกี่ยวกับการกำหนดค่าที่เหมาะสม: แน่นอนว่าควรใช้ SSLv3 กับชุดรหัสที่แข็งแกร่งกว่า TLSv1.0 ที่มีจุดอ่อน (หรือ ชุดเข้ารหัสแบบไม่ระบุชื่อ / null) ชุดรหัสบางชุดซึ่งถือว่าอ่อนแอเกินไปถูกห้ามอย่างชัดเจนโดย TLS เวอร์ชันใหม่ ตารางในผู้ให้บริการ Java 7 SunJSSE (และเชิงอรรถ)อาจเป็นที่สนใจหากคุณต้องการรายละเอียดเพิ่มเติม
มันจะดีกว่าที่จะใช้ TLS 1.1 อย่างน้อย แต่ไม่ใช่ว่าลูกค้าทุกคนจะสนับสนุนพวกเขา แต่น่าเสียดายที่ (เช่น Java 6) เมื่อใช้รุ่นอายุต่ำกว่า 1.1 ก็คุ้มค่าอย่างแน่นอนมองเข้าไปบรรเทาช่องโหว่ BEAST
ฉันมักจะแนะนำหนังสือของ Eric Rescorla - SSL และ TLS: การออกแบบและการสร้างระบบรักษาความปลอดภัย, แอดดิสัน - เวสลีย์, 2001 ไอ 0-201-61598-3กับผู้ที่ต้องการรายละเอียดเพิ่มเติม
โดยปริยาย vs Explicit SSL / TLS
มีตำนานกล่าวว่า TLS อนุญาตให้คุณใช้พอร์ตเดียวกันในขณะที่ SSL ไม่สามารถทำได้ นั่นไม่ใช่ความจริง (และฉันจะทิ้งการรวมพอร์ตไว้สำหรับการสนทนานี้) น่าเสียดายที่ตำนานนี้ดูเหมือนจะถูกเผยแพร่สู่ผู้ใช้ด้วยความจริงที่ว่าบางแอปพลิเคชันเช่น MS Outlook เสนอทางเลือกระหว่าง SSL และ TLS ในตัวเลือกการกำหนดค่าของพวกเขาเมื่อพวกเขาหมายถึงทางเลือกระหว่าง SSL / TLS โดยนัย (มีผู้เชี่ยวชาญ SSL / TLS ที่ Microsoft แต่ดูเหมือนว่าพวกเขาไม่ได้เกี่ยวข้องกับ Outlook UI)
ฉันคิดว่าเหตุผลที่ทำให้เกิดความสับสนนี้เกิดขึ้นเพราะSTARTTLS
โหมด บางคนดูเหมือนจะเข้าใจว่าเป็นSTARTTLS
= TLS แต่นี่ไม่ใช่กรณี คำสำคัญในSTARTTLS
คือ "เริ่มต้น" ไม่ใช่ TLS เหตุใดสิ่งนี้จึงไม่ถูกเรียกSTARTSSL
หรือSTARTSSLORTLS
เป็นเพราะส่วนขยายเหล่านี้มีการระบุไว้ใน IETF ซึ่งใช้ชื่อที่ใช้ในข้อกำหนดเฉพาะของมันเท่านั้น (สมมติว่าชื่อ TLS ในที่สุดจะเป็นสถานะเดียวที่ฉันคาดเดา)
- SSL บนพอร์ตเดียวกันกับบริการข้อความธรรมดา: HTTPS proxy
ทุกวันนี้เซิร์ฟเวอร์ HTTPS ส่วนใหญ่สามารถจัดการ TLS ได้ แต่ไม่กี่ปีที่ผ่านมาผู้คนส่วนใหญ่ใช้ SSLv3 สำหรับ HTTPS HTTPS (พูดอย่างเคร่งครัดมาตรฐานเป็นHTTP ผ่าน TLS ) จะสร้างการเชื่อมต่อ SSL / TLS ตามการเชื่อมต่อ TCP จากนั้นแลกเปลี่ยนข้อความ HTTP ผ่านชั้น SSL / TLS มีข้อยกเว้นเมื่อใช้พร็อกซี HTTP ในระหว่างนั้น ในกรณีนี้ไคลเอ็นต์เชื่อมต่อกับพร็อกซี HTTP อย่างชัดเจน (โดยทั่วไปอยู่ที่พอร์ต 3128) จากนั้นออกCONNECT
คำสั่ง HTTP และหากการตอบสนองสำเร็จให้เริ่มต้นการจับมือ SSL / TLS โดยการส่งClientHello
ข่าวสาร ทั้งหมดนี้เกิดขึ้นในพอร์ตเดียวกันที่เกี่ยวข้องกับการเชื่อมต่อระหว่างเบราว์เซอร์และพร็อกซี (ไม่ชัดเจนระหว่างพร็อกซีและเซิร์ฟเวอร์เป้าหมาย: ไม่ใช่เครื่องเดียวกัน) ใช้งานได้กับ SSLv3 พวกเราหลายคนในสถานการณ์หลังพร็อกซีจะใช้สิ่งนี้กับเซิร์ฟเวอร์ที่ไม่รองรับ TLS 1.0 เป็นอย่างน้อย
- SSL บนพอร์ตเดียวกันกับบริการข้อความธรรมดา: อีเมล
อันนี้ชัดเจนจากข้อกำหนด แต่ในทางปฏิบัติมักใช้งานได้ ข้อกำหนดที่พูดอย่างเคร่งครัดพูดถึงการสลับไปใช้ TLS (ไม่ใช่ SSL) หลังจากใช้คำสั่ง STARTTLS ในทางปฏิบัติ SSL มักจะใช้งานได้เช่นกัน (เช่นเดียวกับข้อมูลจำเพาะ "HTTP over TLS" ซึ่งรวมถึงการใช้ SSL แทน TLS ด้วย) คุณสามารถลองด้วยตัวเอง สมมติว่าคุณมี SMTP หรือ IMAP เซิร์ฟเวอร์ที่สนับสนุน STARTTLS ใช้ธันเดอร์เบิร์ดไปสู่การตั้งค่าตัวเลือกขั้นสูง, security.enable_tls
แก้ไขการตั้งค่าและปิด เซิร์ฟเวอร์จำนวนมากจะยังคงยอมรับการเชื่อมต่อเพียงเพราะการใช้งานของพวกเขามอบหมายเลเยอร์ SSL / TLS ไปยังไลบรารี SSL / TLS ซึ่งโดยทั่วไปจะสามารถจัดการ SSL และ TLS ในลักษณะเดียวกันเว้นแต่กำหนดค่าไว้ไม่ให้ทำเช่นนั้น ดังที่OpenLDAP คำถามพบบ่อยทำให้ "ในขณะที่กลไกถูกออกแบบมาเพื่อใช้กับ TLSv1 การใช้งานส่วนใหญ่จะย้อนกลับไปที่ SSLv3 (และ SSLv2) หากจำเป็น "ถ้าคุณไม่แน่ใจให้ตรวจสอบด้วยเครื่องมืออย่าง Wireshark
ไคลเอนต์จำนวนมากสามารถใช้ TLS 1.0 (อย่างน้อย) สำหรับโปรโตคอลที่ตัวแปรที่ปลอดภัยอยู่บนพอร์ตอื่น เห็นได้ชัดว่ามีเบราว์เซอร์และเว็บเซิร์ฟเวอร์จำนวนมากที่รองรับ TLS 1.0 (หรือสูงกว่า) สำหรับ HTTPS ในทำนองเดียวกัน SMTPS, IMAPS, POPS และ LDAPS ก็สามารถใช้ TLS ได้เช่นกัน ไม่ จำกัด SSL
ฉันจะใช้เมื่อใด ฉันจะไม่ใช้อันไหนเมื่อไหร่?
ระหว่าง SSL / TLS ชัดเจนและโดยนัยมันไม่สำคัญจริงๆ สิ่งที่สำคัญคือลูกค้าของคุณรู้ว่าจะคาดหวังอะไรและมีการกำหนดค่าอย่างเหมาะสมให้ทำ ที่สำคัญกว่านั้นควรจะกำหนดค่าที่จะปฏิเสธการเชื่อมต่อข้อความธรรมดาเมื่อมีการคาดหวังว่าการเชื่อมต่อ SSL / TLS ไม่ว่าจะเป็นนัยหรืออย่างชัดเจน
ความแตกต่างที่สำคัญระหว่าง SSL / TLS ชัดเจนและโดยนัยจะอยู่ในความชัดเจนของการตั้งค่าการกำหนดค่า
ตัวอย่างเช่นสำหรับ LDAP หากลูกค้าเป็นเซิร์ฟเวอร์ Apache Httpd ( mod_ldap
- เอกสารประกอบของมันยังมีความแตกต่างระหว่าง SSL และ TLS อย่างน่าเสียดาย) คุณสามารถใช้ SSL / TLS โดยนัยโดยใช้ldaps://
URL (เช่นAuthLDAPURL ldaps://127.0.0.1/dc=example,dc=com?uid?one
) หรือใช้ SSL / TLS โดยใช้พารามิเตอร์เพิ่มเติม (เช่นAuthLDAPURL ldap://127.0.0.1/dc=example,dc=com?uid?one TLS
)
บางทีอาจจะมีการพูดโดยทั่วไปความเสี่ยงน้อยกว่าเล็กน้อยเมื่อระบุโปรโตคอลการรักษาความปลอดภัยในรูปแบบ URL ( https
, ldaps
, ... ) กว่าเมื่อคาดหวังของลูกค้าในการกำหนดค่าการตั้งค่าเพิ่มเติมเพื่อเปิดใช้งาน SSL / TLS เพราะพวกเขาอาจจะลืม นี่คือการพิสูจน์ อาจมีปัญหาเกี่ยวกับความถูกต้องของการใช้งานของหนึ่งกับอีกด้วย (ตัวอย่างเช่นฉันคิดว่าไคลเอ็นต์ Java LDAP ไม่สนับสนุนการตรวจสอบชื่อโฮสต์เมื่อใช้ldaps://
เมื่อควรในขณะที่ควรได้รับการสนับสนุนด้วยldap://
+ StartTLS)
สงสัยและเพื่อให้เข้ากันได้กับลูกค้ามากขึ้นถ้าเป็นไปได้ดูเหมือนจะไม่เป็นอันตรายใด ๆ ที่จะนำเสนอบริการทั้งสองเมื่อเซิร์ฟเวอร์รองรับ (เซิร์ฟเวอร์ของคุณจะรับฟังสองพอร์ตในเวลาเดียวกัน) การปรับใช้เซิร์ฟเวอร์จำนวนมากสำหรับโปรโตคอลที่สามารถใช้กับโหมดใดโหมดหนึ่งจะสนับสนุนทั้งสองอย่าง
มันเป็นความรับผิดชอบของลูกค้าที่จะไม่ปล่อยให้ตัวเองถูกลดระดับเป็นการเชื่อมต่อข้อความธรรมดา ในฐานะผู้ดูแลเซิร์ฟเวอร์ไม่มีอะไรที่คุณสามารถทำได้ในด้านเทคนิคเพื่อป้องกันการโจมตีที่ลดระดับ (นอกเหนือจากการขอใบรับรองจากลูกค้า) ไคลเอนต์ต้องตรวจสอบว่า SSL / TLS เปิดใช้งานไม่ว่าจะเป็นการเชื่อมต่อหรือหลังจากSTARTTLS
คำสั่งเหมือน ในลักษณะเดียวกับที่เบราว์เซอร์ไม่ควรปล่อยให้ตัวเองถูกเปลี่ยนเส้นทางhttps://
ไปยังhttp://
ไคลเอนต์สำหรับโปรโตคอลที่สนับสนุนSTARTTLS
ควรตรวจสอบให้แน่ใจว่าการตอบสนองเป็นบวกและการเชื่อมต่อ SSL / TLS ถูกเปิดใช้งานก่อนดำเนินการเพิ่มเติม ผู้โจมตี MITM ที่ใช้งานสามารถปรับลดการเชื่อมต่อได้
ตัวอย่างเช่นรุ่นเก่าของธันเดอร์เบิร์ดมีตัวเลือกที่ไม่ดีสำหรับสิ่งนี้เรียกว่า "ใช้ TLS ถ้ามี"ซึ่งบอกเป็นนัยว่าหากผู้โจมตี MITM สามารถแก้ไขข้อความเซิร์ฟเวอร์เพื่อไม่ให้โฆษณาสนับสนุน STARTTLS ลูกค้า จะยอมให้ตัวเองถูกลดระดับเป็นการเชื่อมต่อข้อความธรรมดา (ตัวเลือกที่ไม่ปลอดภัยนี้ไม่มีใน Thunderbird)