รับชื่อสามัญ (CN) จากใบรับรอง SSL หรือไม่


64

ฉันมีไฟล์ SSL CRT ในรูปแบบ PEM มีวิธีที่ฉันสามารถแยกชื่อสามัญ (CN) จากใบรับรองจากบรรทัดคำสั่งหรือไม่


3
อย่างไรก็ตามโปรดทราบว่าในใบรับรองหลายโดเมน CN ไม่มีใบรับรองทั้งหมด
Torsten Bronger

คำตอบ:


90

หากคุณopensslติดตั้งแล้วคุณสามารถเรียกใช้:

openssl x509 -noout -subject -in server.pem

5
คุณสามารถแยก CN ออกจากหัวเรื่องด้วย:openssl x509 -noout -subject -in server.pem | sed -n '/^subject/s/^.*CN=//p'
Matthew Buckett

1
ฉันแก้ไขสิ่งที่ @ MatthewBuckett พูดและใช้sed -e 's/^subject.*CN=\([a-zA-Z0-9\.\-]*\).*$/\1/'เพื่อรับโดเมนเนื่องจากฉันมีรายละเอียดเพิ่มเติมหลังจาก CN มันไม่ใช่การจับคู่ที่เข้มงวดอย่างยิ่งสำหรับ CN ที่ถูกต้อง แต่ในกรณีส่วนใหญ่มันใช้งานได้คุณอาจจะเฉื่อยมากขึ้นและแทนที่[a-zA-Z0-9\.\-]ด้วย[^/]แต่ฉันไม่แน่ใจว่ามันจะใช้ได้ตลอด
flungo

1
เพิ่ม\*ไปยังสิ่งที่ @flungo ใช้เพื่อสนับสนุนโดเมนไวด์การ์ด: sed -e 's/^subject.*CN=\([a-zA-Z0-9\.\-\*]*\).*$/\1/' (ใช้[^/]งานได้ในกรณีของฉัน)
bryn

1
sedคำสั่งที่แนะนำข้างต้นจะไม่ทำงานหากใบรับรองมีชื่อแตกต่างสัมพัทธ์ (rDNS) ที่ระบุไว้หลังชื่อสามัญ (CN) เช่น OU (organizationalUnit) หรือ C (Country) วิธีหนึ่งที่จะตอบสนองสำหรับกรณีดังกล่าวจะมีการเพิ่มเติม:sed openssl x509 -noout -subject -in server.pem | sed 's/^.*CN=//' | sed sed 's/\/.*$//'
Ohad Schneider

6
วิธีที่ง่ายกว่าในการแยก CN จาก RDN / ATVs อื่น ๆ ในชื่อหัวเรื่อง: openssl x509 -noout -subject -nameopt multiline | grep commonNameหรือสำหรับค่าเท่านั้น| sed -n 's/ *commonName *= //p'
dave_thompson_085

7
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 เล็กน้อย


2
คำตอบที่ดี +1 สำหรับ Mac OS X ฉันต้องใช้gnutls-certtoolซึ่งติดตั้งผ่านbrew install gnutls
Mike D

ในการติดตั้ง debiangnutls-bin
rubo77

1

ฉันพบคำตอบข้างต้นและพบว่ามันมีประโยชน์มาก แต่ฉันก็พบว่าcerttoolไวยากรณ์คำสั่ง(บน Ubuntu Linux วันนี้)แตกต่างอย่างเห็นได้ชัดกว่าที่อธิบายโดย goldilocks เช่นเดียวกับผลลัพธ์ ดังนั้นฉันคิดว่าดีที่สุดในการอัปเดตคำตอบที่ยอดเยี่ยมด้วยสิ่งที่อาจเป็น "รุ่นวันนี้"

"i"ตัวเลือก(ตอนนี้?)ย่อมาจาก "นำเข้า" ตามman certtoolดังนั้นคำสั่งที่เหมาะสมที่ดูเหมือนจะเป็น"d""การแสดงผล." ดังนั้นคำสั่งนี้:

certtool d myfoo.crt

(นามสกุลไฟล์ในกรณีของฉันเพิ่งจะ.crtไม่ใช่.pem... นี่ไม่เกี่ยวข้อง)

... สร้างผลลัพธ์ที่ในส่วนที่เกี่ยวข้องมีลักษณะเช่นนี้:

Common Name     : Foobar

ไม่ต้องสงสัยเลยว่า goldilocks นั้นถูกต้อง: certtoolเอาท์พุทนั้นง่ายกว่ามากในการทำงานกับมันมากกว่าopensslในกรณีนี้


1
ฉันสงสัยว่าเรากำลังพูดถึงซอฟต์แวร์ที่ต่างกันโดยสิ้นเชิง ฉันไม่เคยเห็นรุ่นของcerttoolตัวเลือกที่ใช้ตัวดำเนินการตามปกติ ( -หรือ--) และman certtoolสำหรับ v. 3.5.8 (debian), 3.5.16 (fedora รุ่นเดียวหลังจากนั้นในสาขาคอกต้นน้ำคือ 3.5.17 จาก เดือนที่ผ่านมา) เอกสารออนไลน์ของ GnuTLS และแน่นอนหน้า man online สำหรับ Ubuntu 17.10 (รุ่นเดียวกันกับ debian ปัจจุบัน) ทั้งหมดอ้างถึง:
goldilocks

"-i, --certificate-info: พิมพ์ข้อมูลเกี่ยวกับใบรับรองที่ได้รับ"ในขณะที่"-d"คือ"--debug" ที่แปลกมาก. O_o?
goldilocks

-1

ฉันใช้: openssl x509 -noout -subject -in mycert.crt | awk -F= '{print $NF}'เพิ่ม| sed -e 's/^[ \t]*//'ถ้าคุณไม่สามารถอยู่กับพื้นที่สีขาว

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