คีย์ SSH แตกต่างจากคีย์อสมมาตรที่ใช้เพื่อวัตถุประสงค์อื่นอย่างไร


13

กุญแจ SSH แตกต่างจากคีย์แบบไม่สมมาตรที่ใช้เพื่อวัตถุประสงค์อื่นอย่างไรเช่นการลงชื่ออีเมล

ฉันได้รับแจ้งให้ถามสิ่งนี้ส่วนหนึ่งเนื่องจากใน OS X มีแอปที่จัดการคีย์ SSH (ssh-agent, SSHKeychain ฯลฯ ) รวมถึงแอพที่ออกแบบมาเพื่อจัดการคีย์ GPG (GPG เข้าถึงพวงกุญแจ ฯลฯ ) และเห็นได้ชัดว่าไม่เคยพบทั้งสอง อย่างไรก็ตามฉันไม่เชื่อว่านี่เป็นปัญหาเฉพาะของ OS X

การแยกข้อกังวลนี้เป็นเพราะกุญแจมีความแตกต่างกันมากหรือเพราะมันถูกเก็บไว้ในสถานที่ต่างกันหรือเป็นเพราะเหตุผลอื่นหรือการรวมกันของเหตุผลเช่นเหตุผลทางประวัติศาสตร์?

คำตอบ:


14
  • คีย์ SSH เป็นเพียงคู่คีย์ RSA, DSA หรือ ECDSA ธรรมดา รหัสคู่ที่สร้างโดย OpenSSH นั้นสามารถใช้งานได้โดย OpenSSL และโปรแกรมอื่น ๆ ส่วนใหญ่

    ( .pubเอาต์พุตไฟล์โดยssh-keygenอยู่ในรูปแบบเฉพาะของ OpenSSH แต่ไม่เกี่ยวข้องเนื่องจากไฟล์ "ส่วนตัว" มีทั้งกุญแจส่วนตัวและกุญแจสาธารณะอยู่แล้ว)

    ซอฟต์แวร์ SSH อื่นอาจมีรูปแบบการจัดเก็บของตนเองเช่นRFC 4716หรือPPKของ PuTTY แต่จะเก็บข้อมูล RSA / DSA / ECDSA เดียวกัน

  • X.509 (ใช้โดย SSL, S / MIME) มีความซับซ้อนกว่าเล็กน้อย: คีย์ "ส่วนตัว" ยังคงเหมือนเดิม แต่แทนที่จะเป็นไฟล์กุญแจสาธารณะเปลือยคุณมี "ใบรับรอง" - โครงสร้าง ASN.1 ที่มี รหัสสาธารณะชื่อเรื่องและผู้ออกวันที่ที่มีผลบังคับใช้ ในใบรับรอง X.509 v3 จะมีนามสกุลเช่น "การใช้คีย์" และ "ชื่อหัวเรื่องสำรอง" ใบรับรองทั้งหมดมีการลงนามโดยคีย์ของผู้ออกใบรับรอง (หรือลงชื่อด้วยตนเองหากไม่มีผู้ออกใบรับรองแยกต่างหาก)

    คุณสามารถใช้ไฟล์ "ไพรเวทคีย์" X.509 สำหรับ SSH - OpenSSH ได้อย่างง่ายดายแม้ใช้รูปแบบเดียวกัน

    คุณสามารถสร้างใบรับรอง X.509 จากคีย์แพร์ธรรมดาแล้วลงนามด้วยตนเองหรือคุณสามารถสร้าง "คำขอใบรับรอง" และส่งเพื่อลงชื่อโดย CA (หน่วยงานออกใบรับรอง)

    ในการแสดงข้อมูลในใบรับรอง X.509 ให้ใช้:

    certtool -i < foo.pem
    certtool -i --inder < foo.crt
    
    openssl x509 -noout -text < foo.pem
    openssl x509 -noout -text -inform der < foo.crt
    

    ( certtoolเป็นส่วนหนึ่งของ GnuTLS)

  • ปุ่ม OpenPGP (ใช้โดย GPG) นั้นซับซ้อนที่สุด สิ่งที่คุณเรียกว่า "คีย์ PGP" หรือ "PGP keypair" เป็นโครงสร้างที่ซับซ้อนที่เรียกว่า "ใบรับรอง OpenPGP" ซึ่งมี:

    • หนึ่ง "คีย์หลัก" - คู่ของคีย์อสมมาตรซึ่งมักใช้สำหรับการเซ็นชื่อ
    • "ID ผู้ใช้" อย่างน้อยหนึ่งรายการ - ป้ายกำกับข้อความซึ่งมักจะอยู่ในรูปแบบของ "ชื่อ <email @ address>"
      • อย่างน้อยหนึ่งรายการถูกทำเครื่องหมายเป็น "ID ผู้ใช้หลัก"
      • สำหรับแต่ละ ID ผู้ใช้ "ลายเซ็นตนเอง" - ลายเซ็นโดยคีย์หลักของคุณเอง
      • สำหรับ ID ผู้ใช้แต่ละรายการ "ผู้ใช้อื่น ๆ " มีลายเซ็น "หรือมากกว่านั้น
      • แพ็กเก็ตลายเซ็นต์ตนเองประกอบด้วยอัลกอริธึมที่คุณต้องการ (SHA-1, AES ฯลฯ )
    • คีย์ย่อย "หนึ่งคีย์หรือมากกว่า" - คู่คีย์เพิ่มเติมโดยปกติตัวแรกจะใช้สำหรับการเข้ารหัส
      • สำหรับแต่ละคีย์ย่อยลายเซ็นโดยคีย์หลัก
    • "ID ภาพถ่าย" หรือศูนย์หรือไฟล์แนบ JPEG หรือ PNG ที่มีใบหน้าของคุณ
      • ลงนามเช่นเดียวกับ ID ผู้ใช้
    • ใบรับรอง X.509 เป็นศูนย์ขึ้นไป

    คู่คีย์ทั้งหมดมีวันที่หมดอายุและบิตการใช้งาน: ข้อมูลลงชื่อคีย์รับรอง (ลงชื่อ) เข้ารหัสเข้ารหัสรับรองกับบริการ คีย์หลักโดยค่าเริ่มต้นมีบิต "เครื่องหมาย" และ "รับรอง" และคีย์ย่อยแรกคือ "เข้ารหัส" หากคุณเพิ่มคีย์ย่อย "การรับรองความถูกต้อง" คุณสามารถใช้มันผ่านgpg-agentการตรวจสอบความถูกต้องของ SSH

    หากต้องการดูว่าใบรับรองของคุณมีอะไรบ้าง:

    gpg --export joe@example.com | gpg -vv
    
    gpg --export joe@example.com | certtool --pgp-certificate-info
    

    ( certtoolเป็นส่วนหนึ่งของ GnuTLS)


ใบรับรอง X.509 และกุญแจส่วนตัวที่เกี่ยวข้องมีหลายรูปแบบ:

  • DERเป็นการเข้ารหัสแบบไบนารีของโครงสร้าง ASN.1 ของใบรับรอง ไฟล์ดังกล่าวมักจะมี.crtหรือ.cerนามสกุลไฟล์ ( .derเป็นเรื่องธรรมดาน้อยกว่า แต่ไม่ได้มองไม่เห็น)

  • ไฟล์รูปแบบ "PEM" มีข้อมูลที่เข้ารหัส DER เหมือนกัน แต่เข้ารหัสเพิ่มเติมโดยใช้ Base64 และระหว่าง "เริ่มต้นสิ่งนี้" กับ "ส่วนหัว" END That " นามสกุลไฟล์ทั่วไปคือ.pemแม้ว่าทั้งสองอย่าง.crtและ.cerบางครั้งก็ใช้ที่นี่ด้วย (แต่ไม่เคย.der)

  • สำหรับคีย์ส่วนตัวที่เป็นของใบรับรองมักใช้รูปแบบ "PEM" - Base64 ที่ล้อมรอบด้วยส่วนหัว "BEGIN PRIVATE KEY" (คีย์ในโครงสร้าง PKCS # 7) หรือ "BEGIN RSA (หรือ DSA) PRIVATE KEY" (คีย์เปล่า OpenSSL รูปแบบ). บางครั้งคีย์จะอยู่ใน.keyไฟล์แยกต่างหากบางครั้งก็มาพร้อมกับใบรับรอง

  • PKCS # 12และPFX ที่เก่ากว่าเล็กน้อยเป็นคอนเทนเนอร์ที่เข้ารหัสซึ่งเก็บทั้งใบรับรองและคีย์ส่วนตัว (มักเป็นใบรับรองของผู้ออกใบรับรองด้วย) ซอฟต์แวร์ส่วนใหญ่ใช้รูปแบบนี้เมื่อส่งออกหรือ "สำรองข้อมูล" ด้วยคีย์ส่วนตัว

สถานการณ์ที่สับสนน้อยกว่าอยู่ใน OpenPGP: ข้อมูลทั้งหมดเป็นไปตามรูปแบบไบนารีที่เหมือนกันและเป็นทางเลือก "เกราะ" (เข้ารหัสด้วย Radix64 และระหว่างส่วนหัวคล้าย PEM)


2

จัดเก็บในสถานที่ต่าง ๆ และในรูปแบบที่แตกต่างกัน (รูปแบบที่ใช้โดย PGP, GnuPG sshและรูปแบบ X.509 ที่แตกต่างกันหลายรายการแตกต่างกันมาก) มันเป็นไปได้ที่จะแปลงระหว่างพวกเขาไปบ้างโดยการผสมและการจับคู่ตัวเลือกที่เหมาะสมในการssh-keygen, pgp, gpg/ gpg2, opensslฯลฯ .; แต่โดยทั่วไปแล้วมันไม่คุ้มค่ากับความพยายาม นอกจากนี้รูปแบบคีย์ที่แตกต่างกันยังรองรับปริมาณข้อมูลที่แตกต่างกันด้วยsshการพกพาข้อมูลที่น้อยที่สุดและรูปแบบ X.509 PEM และ DER ที่มีความสำคัญมากที่สุด นอกจากนี้ OSX Keychain เป็นเพียงการจัดเก็บคีย์ / ค่าที่เข้ารหัสดังนั้นจึงจำเป็นต้องใช้กลไกที่แตกต่างกันในแต่ละแอปพลิเคชันเพื่อแปลงระหว่างรูปแบบเนทีฟของคีย์หลัก + ข้อมูลเมตาของโปรแกรมและบางอย่างที่สามารถเก็บไว้ใน Keychain (ข้อกังวลที่คล้ายกันนี้นำไปใช้กับกระเป๋าเงิน KDE และพวงกุญแจ GNOME)


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