s2n-tls เป็นการใช้งาน C99 ของโปรโตคอล TLS/SSL ที่ออกแบบมาให้เรียบง่าย ขนาดเล็ก รวดเร็ว และให้ความสำคัญกับความปลอดภัยเป็นหลัก ได้รับการเผยแพร่และได้รับอนุญาตภายใต้ Apache License 2.0
s2n-tls ย่อมาจาก "signal to noise" และเป็นการยกย่องการเข้ารหัสที่เกือบจะมหัศจรรย์ — โดยปิดบังสัญญาณที่มีความหมาย เช่น ข้อมูลสำคัญของคุณ ให้เป็นสัญญาณรบกวนที่สุ่มเสี่ยง
-- ประกาศ s2n-tls
# clone s2n-tls
git clone https://github.com/aws/s2n-tls.git
cd s2n-tls
# install build dependencies
sudo apt update
sudo apt install cmake
# install a libcrypto
sudo apt install libssl-dev
# build s2n-tls
cmake . -Bbuild
-DCMAKE_BUILD_TYPE=Release
-DCMAKE_INSTALL_PREFIX=./s2n-tls-install
cmake --build build -j $( nproc )
CTEST_PARALLEL_LEVEL= $( nproc ) ctest --test-dir build
cmake --install build
ดูเอกสารประกอบการสร้าง s2n-tls สำหรับคำแนะนำเพิ่มเติมเกี่ยวกับการสร้าง s2n-tls สำหรับแพลตฟอร์มของคุณ
หากคุณคิดว่าคุณอาจพบปัญหาที่ส่งผลกระทบต่อความปลอดภัย โปรดปฏิบัติตามกระบวนการแจ้งเตือนด้านความปลอดภัยของเรา
หากคุณมีคำถามใดๆ เกี่ยวกับการส่ง PR, การใช้งาน API s2n-tls หรืออะไรที่คล้ายกัน โปรดเปิดประเด็น
s2n-tls ใช้ Doxygen เพื่อจัดทำเอกสาร API สาธารณะ เอกสาร s2n-tls ล่าสุดสามารถพบได้ในหน้า GitHub คู่มือการใช้งานจะอธิบายว่าคุณสมบัติต่างๆ ของ TLS สามารถกำหนดค่าและใช้งานได้อย่างไร
เอกสารประกอบสำหรับเวอร์ชันเก่าหรือสาขาของ s2n-tls สามารถสร้างได้ในเครื่อง หากต้องการสร้างเอกสาร ให้ติดตั้ง doxygen และรัน doxygen docs/doxygen/Doxyfile
ขณะนี้คุณสามารถดูเอกสารประกอบของ doxygen ได้ที่ docs/doxygen/output/html/index.html
คำแนะนำในการติดตั้ง Doxygen มีอยู่ที่หน้าเว็บ Doxygen
เราได้ระบุการแจกจ่ายและแพลตฟอร์มไว้เป็นสองระดับ: แพลตฟอร์มระดับ 1 รับประกันว่าจะสร้าง ใช้งาน และผ่านการทดสอบใน CI รับประกันว่าจะสร้างแพลตฟอร์มระดับ 2 ได้ และเราจะแก้ไขปัญหาที่เปิดกับแพลตฟอร์มเหล่านั้น แต่ขณะนี้แพลตฟอร์มเหล่านั้นไม่ได้ทำงานใน CI ของเรา และไม่ได้รับการตรวจสอบอย่างจริงจังกับทุกการกระทำ หากคุณใช้แพลตฟอร์มที่ไม่อยู่ในรายการด้านล่าง และต้องการขอ (หรือความช่วยเหลือ!) เพิ่มลงใน CI ของเรา โปรดเปิดประเด็นเพื่อหารือกัน
การกระจายสินค้าใน CI | แพลตฟอร์ม |
---|---|
Ubuntu18, Ubuntu24** | x86_64 |
อูบุนตู22 | x86_64, i686 |
AL2, AL2023** | x86_64, aarch64 |
นิกโอเอส | x86_64, aarch64 |
โอเพนบีเอสดี 7.4 | x86_64 |
ฟรีบีเอสดี ใหม่ล่าสุด | x86_64 |
OSX ใหม่ล่าสุด | อาร์ค64 |
**งานอยู่ระหว่างดำเนินการ
การจัดจำหน่ายไม่อยู่ใน CI | แพลตฟอร์ม |
---|---|
เฟโดร่าคอร์ 34-36 | x86_64, aarch64 |
อูบุนตู 14/16/20 | x86_64, aarch64 |
อูบุนตู 18/22/24 | อาร์ค64 |
OSX 12-14 | x86_64 |
รายการแจกจ่ายเหล่านี้ไม่ได้ครบถ้วนสมบูรณ์และขาดเครื่องมือหรือไลบรารี libcrypto ที่รองรับที่ขาดหายไปอาจทำให้การสร้างไม่สำเร็จ
API s2n-tls I/O ได้รับการออกแบบมาให้ใช้งานง่ายสำหรับนักพัฒนาที่คุ้นเคยกับ POSIX I/O API ที่ใช้กันอย่างแพร่หลาย และ s2n-tls รองรับการบล็อก การไม่บล็อก และ I/O ฟูลดูเพล็กซ์ นอกจากนี้ยังไม่มีการล็อกหรือ mutexes ภายใน s2n-tls
/* Create a server mode connection handle */
struct s2n_connection * conn = s2n_connection_new ( S2N_SERVER );
if ( conn == NULL ) {
... error ...
}
/* Associate a connection with a file descriptor */
if ( s2n_connection_set_fd ( conn , fd ) < 0 ) {
... error ...
}
/* Negotiate the TLS handshake */
s2n_blocked_status blocked ;
if ( s2n_negotiate ( conn , & blocked ) < 0 ) {
... error ...
}
/* Write data to the connection */
int bytes_written ;
bytes_written = s2n_send ( conn , "Hello World" , sizeof ( "Hello World" ), & blocked );
สำหรับรายละเอียดเกี่ยวกับการสร้างไลบรารี s2n-tls และวิธีใช้ s2n-tls ในแอปพลิเคชันที่คุณกำลังพัฒนา โปรดดูคู่มือการใช้งาน
s2n-tls ใช้ SSLv3, TLS1.0, TLS1.1, TLS1.2 และ TLS1.3 สำหรับการเข้ารหัส s2n-tls รองรับ AES 128 บิตและ 256 บิตในโหมด CBC และ GCM, ChaCha20, 3DES และ RC4 สำหรับการส่งต่อความลับ s2n-tls รองรับทั้ง DHE และ ECDHE s2n-tls ยังรองรับส่วนขยาย Server Name Indicator (SNI), Application-Layer Protocol Negotiation (ALPN) และส่วนขยาย TLS Online Certificate Status Protocol (OCSP) SSLv3, RC4, 3DES และ DHE แต่ละรายการจะถูกปิดใช้งานตามค่าเริ่มต้นด้วยเหตุผลด้านความปลอดภัย
เนื่องจากเป็นเรื่องยากที่จะติดตามว่าอัลกอริธึมการเข้ารหัสและโปรโตคอลใดเหมาะที่สุด s2n-tls จึงมี API แบบง่ายเพื่อใช้ชุดการตั้งค่า "ค่าเริ่มต้น" ล่าสุด หากคุณต้องการคงอยู่ในเวอร์ชันเฉพาะสำหรับความเข้ากันได้แบบย้อนหลัง ระบบก็รองรับเช่นกัน
/* Use the latest s2n-tls "default" set of ciphersuite and protocol preferences */
s2n_config_set_cipher_preferences ( config , "default" );
/* Use a specific set of preferences, update when you're ready */
s2n_config_set_cipher_preferences ( config , "20150306" )
ภายใน s2n-tls ใช้แนวทางที่เป็นระบบในการปกป้องข้อมูล และมีกลไกหลายอย่างที่ออกแบบมาเพื่อปรับปรุงความปลอดภัย
โค้ดของ s2n-tls มีโครงสร้างและเขียนโดยเน้นที่ความสามารถในการตรวจสอบ รหัส s2n-tls ทั้งหมดอยู่ภายใต้การตรวจสอบโค้ด และเราวางแผนที่จะดำเนินการประเมินความปลอดภัยของ s2n-tls ให้เสร็จสิ้นเป็นประจำทุกปี
จนถึงปัจจุบัน มีการตรวจสอบ s2n-tls ระดับโค้ดภายนอกสองครั้ง ซึ่งรวมถึงการตรวจสอบโดยผู้จำหน่ายความปลอดภัยเชิงพาณิชย์ด้วย นอกจากนี้ s2n-tls ยังได้รับการแชร์กับสมาชิกที่เชื่อถือได้บางส่วนของชุมชนการเข้ารหัส ความปลอดภัย และโอเพ่นซอร์สในวงกว้างอีกด้วย ปัญหาใดๆ ที่พบจะถูกบันทึกไว้ในตัวติดตามปัญหา s2n-tls เสมอ
นอกเหนือจากการตรวจสอบโค้ดแล้ว s2n-tls ยังได้รับการวิเคราะห์แบบคงที่ การทดสอบแบบ Fuzz และการทดสอบการเจาะระบบเป็นประจำ มีการทดสอบการเจาะหลายครั้ง รวมถึงการทดสอบสองครั้งโดยผู้จำหน่ายเชิงพาณิชย์
s2n-tls ประกอบด้วยการทดสอบหน่วยเชิงบวกและเชิงลบ และกรณีการทดสอบแบบ end-to-end
สามารถดูความครอบคลุมการทดสอบหน่วยได้ที่นี่ โปรดทราบว่าสิ่งนี้แสดงถึงความครอบคลุมของหน่วยสำหรับรุ่นเฉพาะ เนื่องจากบิลด์นั้นไม่จำเป็นต้องรองรับฟีเจอร์ s2n-tls ทั้งหมด ความครอบคลุมการทดสอบจึงอาจลดลงอย่างไม่ตั้งใจ
s2n-tls เข้ารหัสหรือลบข้อมูลข้อความธรรมดาโดยเร็วที่สุด ตัวอย่างเช่น บัฟเฟอร์ข้อมูลที่ถอดรหัสจะถูกลบในขณะที่แอปพลิเคชันอ่าน
s2n-tls ใช้คุณสมบัติของระบบปฏิบัติการเพื่อปกป้องข้อมูลจากการสลับไปยังดิสก์หรือปรากฏในคอร์ดัมพ์
s2n-tls หลีกเลี่ยงการใช้ตัวเลือกและส่วนขยายที่ไม่ค่อยได้ใช้ รวมถึงฟีเจอร์ที่มีประวัติการเรียกใช้ช่องโหว่ระดับโปรโตคอล ตัวอย่างเช่น ไม่มีการรองรับ DTLS
ความปลอดภัยของ TLS และอัลกอริธึมการเข้ารหัสที่เกี่ยวข้องนั้นขึ้นอยู่กับการสร้างตัวเลขสุ่มที่ปลอดภัย s2n-tls จัดเตรียมทุกเธรดด้วยตัวสร้างตัวเลขสุ่มสองตัวแยกกัน หนึ่งรายการสำหรับข้อมูลที่สร้างขึ้นแบบสุ่ม "สาธารณะ" ซึ่งอาจปรากฏในที่เปิดเผย และอีกรายการหนึ่งสำหรับข้อมูล "ส่วนตัว" ที่ควรเป็นความลับ วิธีการนี้ช่วยลดความเสี่ยงของจุดอ่อนในการคาดเดาที่อาจเกิดขึ้นในอัลกอริธึมการสร้างตัวเลขสุ่มจากการรั่วไหลของข้อมูลข้ามบริบท
s2n-tls ได้รับการวางโครงสร้างเพื่อให้สามารถใช้งานไลบรารีการเข้ารหัสที่แตกต่างกันได้ ปัจจุบัน s2n-tls รองรับ AWS-LC, OpenSSL (เวอร์ชัน 1.0.2, 1.1.1 และ 3.0.x), LibreSSL และ BoringSSL เพื่อดำเนินการเข้ารหัสลับที่สำคัญ ตรวจสอบเอกสารประกอบการสร้าง libcrypto เพื่อดูรายการคุณลักษณะเฉพาะของ libcrypto
s2n-tls มีการสนับสนุนที่มีโครงสร้างสำหรับการปกปิดช่องทางด้านข้างตามเวลาที่อาจทำให้ข้อมูลที่ละเอียดอ่อนรั่วไหล ตัวอย่างเช่น หาก s2n-tls ไม่สามารถแยกวิเคราะห์บันทึก TLS หรือข้อความจับมือได้ s2n-tls จะเพิ่มการหน่วงเวลาแบบสุ่มระหว่าง 10 ถึง 30 วินาที โดยมีรายละเอียดเป็นนาโนวินาทีก่อนที่จะตอบสนอง สิ่งนี้เพิ่มความซับซ้อนของการโจมตีช่องทางด้านข้างในการจับเวลาในโลกแห่งความเป็นจริงอย่างน้อยนับสิบล้านล้าน
s2n-tls ใช้ตารางอย่างง่ายในการขับเคลื่อนเครื่องสถานะ TLS/SSL ทำให้ยากที่สถานะที่ไม่อยู่ในลำดับที่ไม่ถูกต้องจะเกิดขึ้น
s2n-tls เขียนด้วยภาษา C แต่ใช้ฟังก์ชันไลบรารี C มาตรฐานเพียงเล็กน้อย และรวมการจัดการหน่วยความจำ การจัดการสตริง และการทำให้เป็นอนุกรมทั้งหมดในการตรวจสอบการบังคับใช้ขอบเขตอย่างเป็นระบบ
หากคุณค้นพบปัญหาด้านความปลอดภัยที่อาจเกิดขึ้นใน s2n-tls เราขอให้คุณแจ้ง AWS Security ผ่านหน้าการรายงานช่องโหว่ของเรา กรุณา อย่า สร้างปัญหา GitHub สาธารณะ
หากคุณจัดแพ็คเกจหรือแจกจ่าย s2n-tls หรือใช้ s2n-tls เป็นส่วนหนึ่งของบริการขนาดใหญ่ที่มีผู้ใช้หลายราย คุณอาจมีสิทธิ์ได้รับการแจ้งเตือนล่วงหน้าเกี่ยวกับการเผยแพร่ s2n-tls ในอนาคต โปรดติดต่อ [email protected]
หากคุณสนใจที่จะมีส่วนร่วมใน s2n-tls โปรดดูคู่มือการพัฒนาของเรา
ดูรายการการเชื่อมโยงภาษาของเราสำหรับการเชื่อมโยงภาษาสำหรับ s2n-tls ที่เราทราบ