ฉันมีไฟล์ SSL CRT ในรูปแบบ PEM มีวิธีที่ฉันสามารถแยกชื่อสามัญ (CN) จากใบรับรองจากบรรทัดคำสั่งหรือไม่
ฉันมีไฟล์ SSL CRT ในรูปแบบ PEM มีวิธีที่ฉันสามารถแยกชื่อสามัญ (CN) จากใบรับรองจากบรรทัดคำสั่งหรือไม่
คำตอบ:
หากคุณopensslติดตั้งแล้วคุณสามารถเรียกใช้:
openssl x509 -noout -subject -in server.pem
openssl x509 -noout -subject -in server.pem | sed -n '/^subject/s/^.*CN=//p'
sed -e 's/^subject.*CN=\([a-zA-Z0-9\.\-]*\).*$/\1/'เพื่อรับโดเมนเนื่องจากฉันมีรายละเอียดเพิ่มเติมหลังจาก CN มันไม่ใช่การจับคู่ที่เข้มงวดอย่างยิ่งสำหรับ CN ที่ถูกต้อง แต่ในกรณีส่วนใหญ่มันใช้งานได้คุณอาจจะเฉื่อยมากขึ้นและแทนที่[a-zA-Z0-9\.\-]ด้วย[^/]แต่ฉันไม่แน่ใจว่ามันจะใช้ได้ตลอด
\*ไปยังสิ่งที่ @flungo ใช้เพื่อสนับสนุนโดเมนไวด์การ์ด: sed -e 's/^subject.*CN=\([a-zA-Z0-9\.\-\*]*\).*$/\1/' (ใช้[^/]งานได้ในกรณีของฉัน)
sedคำสั่งที่แนะนำข้างต้นจะไม่ทำงานหากใบรับรองมีชื่อแตกต่างสัมพัทธ์ (rDNS) ที่ระบุไว้หลังชื่อสามัญ (CN) เช่น OU (organizationalUnit) หรือ C (Country) วิธีหนึ่งที่จะตอบสนองสำหรับกรณีดังกล่าวจะมีการเพิ่มเติม:sed openssl x509 -noout -subject -in server.pem | sed 's/^.*CN=//' | sed sed 's/\/.*$//'
openssl x509 -noout -subject -nameopt multiline | grep commonNameหรือสำหรับค่าเท่านั้น| sed -n 's/ *commonName *= //p'
certtool -i < whatever.pem | egrep "^\s+Subject:"
ขอให้สังเกตว่าจะนำไฟล์ไปยังอินพุตมาตรฐานผ่านทาง<ไม่ใช่ใช้เป็นอาร์กิวเมนต์ Sans egrepสิ่งนี้จะพิมพ์ใบรับรองทั้งหมด แต่ CN อยู่ในSubject:ฟิลด์ใกล้ด้านบน (ระวังยังมีค่า CN ในIssuer:ฟิลด์ด้วย)
X.509 Certificate Information:
Version: 3
Serial Number (hex): 01
Issuer: [...] CN=unixandlinux.ex <- Not this one.
Validity: ...
Subject: CN=goldilocks
certtoolเป็นส่วนหนึ่งของ gnutls หากไม่ได้ติดตั้งเพียงค้นหาสิ่งนั้น GnuTLS ดีกว่า OpenSSL, IMO เล็กน้อย
gnutls-certtoolซึ่งติดตั้งผ่านbrew install gnutls
gnutls-bin
ฉันพบคำตอบข้างต้นและพบว่ามันมีประโยชน์มาก แต่ฉันก็พบว่าcerttoolไวยากรณ์คำสั่ง(บน Ubuntu Linux วันนี้)แตกต่างอย่างเห็นได้ชัดกว่าที่อธิบายโดย goldilocks เช่นเดียวกับผลลัพธ์ ดังนั้นฉันคิดว่าดีที่สุดในการอัปเดตคำตอบที่ยอดเยี่ยมด้วยสิ่งที่อาจเป็น "รุ่นวันนี้"
"i"ตัวเลือก(ตอนนี้?)ย่อมาจาก "นำเข้า" ตามman certtoolดังนั้นคำสั่งที่เหมาะสมที่ดูเหมือนจะเป็น"d""การแสดงผล." ดังนั้นคำสั่งนี้:
certtool d myfoo.crt
(นามสกุลไฟล์ในกรณีของฉันเพิ่งจะ.crtไม่ใช่.pem... นี่ไม่เกี่ยวข้อง)
... สร้างผลลัพธ์ที่ในส่วนที่เกี่ยวข้องมีลักษณะเช่นนี้:
Common Name : Foobar
ไม่ต้องสงสัยเลยว่า goldilocks นั้นถูกต้อง: certtoolเอาท์พุทนั้นง่ายกว่ามากในการทำงานกับมันมากกว่าopensslในกรณีนี้
certtoolตัวเลือกที่ใช้ตัวดำเนินการตามปกติ ( -หรือ--) และman certtoolสำหรับ v. 3.5.8 (debian), 3.5.16 (fedora รุ่นเดียวหลังจากนั้นในสาขาคอกต้นน้ำคือ 3.5.17 จาก เดือนที่ผ่านมา) เอกสารออนไลน์ของ GnuTLS และแน่นอนหน้า man online สำหรับ Ubuntu 17.10 (รุ่นเดียวกันกับ debian ปัจจุบัน) ทั้งหมดอ้างถึง:
ฉันใช้:
openssl x509 -noout -subject -in mycert.crt | awk -F= '{print $NF}'เพิ่ม| sed -e 's/^[ \t]*//'ถ้าคุณไม่สามารถอยู่กับพื้นที่สีขาว