ฉันมีไฟล์ 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]*//'
ถ้าคุณไม่สามารถอยู่กับพื้นที่สีขาว