ใบรับรองไวด์การ์ดที่ลงนามเอง


18

ฉันได้รับการตั้งค่า pihole ที่บ้านดังนั้นฉันจึงต้องการที่จะสามารถจัดการคำขอสำหรับเว็บไซต์ใด ๆ กับเซิร์ฟเวอร์ของฉันเองเพื่อแสดงหน้า "ไซต์นี้ถูกบล็อก"

ฉันพยายามทำสิ่งนี้โดยการสร้างใบรับรองแบบลงนามด้วยตนเองสำหรับ url ใด ๆ และติดตั้งบนอุปกรณ์ของฉัน คำสั่งที่ฉันใช้ในการสร้างใบรับรอง:

openssl genrsa 2048 > pihole.key
openssl req -new -x509 -nodes -days 36500\
    -key pihole.key \
    -subj "/C=NL/ST=Utrecht, Inc./CN=*" \
    -reqexts SAN \
    -config <(cat /etc/ssl/openssl.cnf \
        <(printf "\n[SAN]\nsubjectAltName=DNS:*,DNS:*")) \
    -out pihole.cert
openssl x509 -noout -fingerprint -text < pihole.cert > pihole.info
cat pihole.cert pihole.info > pihole.pem
service apache2 reload

ฉันได้ติดตั้งใบรับรองนี้บนอุปกรณ์ windows ของฉันและ windows แสดงว่าเป็นใบรับรองที่ถูกต้อง

อย่างไรก็ตามโครเมี่ยมให้ฉันNET::ERR_CERT_COMMON_NAME_INVALIDและขอบทำให้ฉันมีข้อผิดพลาดที่คล้ายกัน ( DLG_FLAGS_SEC_CERT_CN_INVALID)

ทำไมนี้ เป็นCN = *เพียงแค่ไม่ได้รับอนุญาต? ฉันจะบรรลุสิ่งที่ฉันต้องการได้อย่างไร


ตามหมายเหตุด้านข้าง: สำหรับเว็บไซต์หลักเบราว์เซอร์ของคุณอาจไม่ยอมรับใบรับรองใด ๆ ที่คุณจัดการเพื่อสร้าง ไซต์เหล่านั้นใช้การยึดใบรับรองและส่งลายนิ้วมือของ TLS certs เพื่อรวมไว้ในเบราว์เซอร์เหล่านั้น ใบรับรองของคุณจะไม่ตรงกับลายนิ้วมือที่เก็บไว้และจะถูกบล็อก นี่คือข้อมูลเพิ่มเติม: noncombatant.org/2015/05/01/about-http-public-key-pinning
Martijn Heemels

ใบรับรองที่ลงชื่อด้วยตนเองอาจมีปัญหาตามที่คุณค้นพบ คุณสามารถดูได้รับการรับรอง "เหมาะสม" จาก letsencrypt.org - ฟรีและสนับสนุนสัญลักษณ์แทน ทั้งนี้ขึ้นอยู่กับจำนวนโฮสต์ที่คุณพยายามปกปิดด้วย * ที่คุณต้องการจริง ๆ หนึ่งใบ (หรือมากกว่า) จาก letencrypt สามารถครอบคลุมคุณได้
Dave Smylie

2
@DaveSmylie สำหรับ adblocker ฉันไม่ได้เป็นเจ้าของโดเมน
Daniël van den Berg

1
@Startart โปรดอ่านความคิดเห็นก่อนหน้าของฉัน
Daniël van den Berg

1
นอกจากนี้ยังมีหมายเหตุ: หากคุณกำลังใช้สิ่งนี้สำหรับ adblocker มันอาจจะดีกว่าที่จะทิ้งการเชื่อมต่อไปยังเซิร์ฟเวอร์ที่เกี่ยวข้องแทนการแสดงหน้าอื่น 90% ของโฆษณาสมัยใหม่ถูกโหลดผ่าน JavaScript ในตอนแรกดังนั้นจึงไม่น่าเป็นไปได้ที่หน้าทางเลือกของคุณจะมีการแสดงผลที่แท้จริงในหน้านั้น มันอาจจะทำลายสิ่งต่าง ๆ จริง ๆ แล้วพยายามโหลดทรัพยากรที่ไม่ใช่ JavaScript เป็น Javascript
Nzall

คำตอบ:


42

ไม่อนุญาต. ในฐานะที่เป็นส่วนเสริมเฉพาะโปรโตคอลในการตรวจสอบความถูกต้องชื่อโฮสต์ TLS เว็บเบราว์เซอร์หลักทั้งหมด (ไคลเอนต์ HTTPS) ได้ตกลงที่จะ จำกัด ใบรับรองไวด์การ์ดไว้ที่ "eTLD + 1" - นั่นคือจะต้องมี "TLD ที่มีประสิทธิภาพ" องค์ประกอบบัตร

โดยทั่วไปแล้วสิ่งนี้แปลว่าต้องการส่วนประกอบอย่างน้อยสองชิ้น ( *.example.netไม่เป็นไร แต่*.netไม่ใช่ไม่ใช่ทั้งสองอย่าง*) กฎ "TLD ที่มีประสิทธิภาพ" จะขยายส่วนนี้เป็นส่วนต่อท้ายแบบหลายระดับเนื่องจากco.ukบุคคลนั้นใช้เป็น "TLDs" ที่แยกไม่ออกในทางปฏิบัติ ( *.example.ac.ukได้รับอนุญาต แต่*.ac.ukไม่ได้รับอนุญาต)

คุณสามารถตรวจสอบว่ารายชื่อต่อท้ายสาธารณะจะดำเนินการในโครเมี่ยมและใน Mozilla

ดูการสนทนาที่เกี่ยวข้องใน Security.SEซึ่งมีการอ้างอิงจากข้อกำหนดพื้นฐานของฟอรัม CA-Browser (ซึ่งใช้กับ WebPKI CA สาธารณะเท่านั้น แต่ยังคงสะท้อนการใช้งานทั่วไปอยู่ดี):

CAs SHALL เพิกถอนใบรับรองใด ๆ ที่มีอักขระตัวแทนในตำแหน่งป้ายกำกับแรกทางด้านซ้ายของป้ายกำกับ "การควบคุมรีจิสทรี" หรือ "ส่วนต่อท้ายสาธารณะ"


เพื่อหลีกเลี่ยงข้อ จำกัด นี้ให้สร้างหน่วยงานออกใบรับรองที่ออกใบรับรอง "ตามต้องการ" สำหรับเว็บไซต์ใดก็ตามที่คุณพยายามเข้าชม ฉันไม่รู้ว่าจะใช้งานได้อย่างไรในเว็บเซิร์ฟเวอร์ทั่วไป แต่นี่เป็นวิธีการทั่วไปที่ใช้โดยระบบการสกัดกั้น TLS เชิงพาณิชย์ โปรแกรมป้องกันไวรัสและมัลแวร์อื่น ๆ และเครื่องมือในการพัฒนาเช่นชุด Burp Proxy

ตัวอย่างเช่นเว็บเซิร์ฟเวอร์ OpenResty (โดยทั่วไปแล้ว Nginx-with-Lua) มีssl_certificate_by_luaตัวเลือกในการสร้างใบรับรองแบบไดนามิก Squid proxy รองรับการเลียนแบบใบรับรองในคุณสมบัติ ssl-bump

นอกจากนี้โปรดทราบว่า SAN จะแทนที่ Subject-CN อย่างสมบูรณ์หากมีทั้งคู่ สิ่งนี้ทำให้รวมถึง CN ที่ซ้ำซ้อนส่วนใหญ่ (เว้นแต่ว่าไคลเอ็นต์ซอฟต์แวร์ของคุณเก่าแก่แล้วมันขาดการสนับสนุน SAN) และสำหรับเว็บเบราว์เซอร์ CA สาธารณะไม่ยอมรับแม้แต่อีกต่อไป


ฉันพบแล้วเกี่ยวกับการ จำกัด TLD + 1 เชิงประจักษ์ที่นี่ในโครงการก่อนหน้านี้ ขอบคุณสำหรับการจัดวาง +1
Rui F Ribeiro

ขอบคุณสำหรับคำตอบที่ซับซ้อนของคุณฉันเดาว่าจะอธิบายใช่ คุณรู้วิธีอื่นที่ฉันสามารถใช้ได้หรือไม่?
Daniël van den Berg

26
อัปโหลดแล้วสำหรับการวางตำแหน่งเชิงกลยุทธ์ของ "และมัลแวร์อื่น ๆ "
Džuris

@ DaniëlvandenBerg: ฉันบังเอิญได้แนะนำสิ่งหนึ่งในโพสต์ของตัวเอง ฉันเพิ่งเพิ่มลิงค์ไปยังตัวอย่าง Nginx และ Squid
user1686

5

จะมีเพียงสัญลักษณ์เดียวในใบรับรอง (เช่นไม่มี*.*.example.com) สามารถจับคู่ป้ายกำกับเดียว (เช่นเท่านั้นwwwไม่ใช่www.example.com) สามารถอยู่ในตำแหน่งซ้ายสุดเท่านั้น (เช่น*.www.example.comแต่ไม่ใช่www.*.example.com) และไม่สามารถอยู่ในคำต่อท้ายสาธารณะ (เช่นไม่มี*.com)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.