ทำความสะอาดพวงกุญแจ gnupg ของฉันหรือไม่


46

พวงกุญแจ gnupg ของฉันมีหลายร้อยรายการที่ไม่จำเป็น ฉันจะลบคีย์ที่หมดอายุถูกเพิกถอนและไม่มีลายเซ็นจากมันได้อย่างไร

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


1
ผมจะใช้gpgtools.org มันไม่ได้ช่วยในการลบหมดอายุ แต่แน่นอนลดการจัดการของคีย์ gpg
Nick Roz

คำตอบ:


37

จากสูตรโกง GPGของ Charles Lockhart :

ฉันใช้User Nameเป็นชื่อที่เกี่ยวข้องกับกุญแจ ขออภัยที่จินตนาการไม่มาก ฉันคิดว่า gpg ค่อนข้างกว้างในการกำหนดผู้ใช้เช่นชื่อกุญแจส่วนตัวของฉันคือ“ Charles Lockhart” แต่ฉันสามารถอ้างอิงได้โดยเพียงใส่“ Lockhart” นั่นไม่สมเหตุสมผลเลยขอโทษ

            ︙

เพื่อลบรหัสสาธารณะ (จากแหวนกุญแจสาธารณะของคุณ):

$ gpg --delete-key "User Name"

สิ่งนี้จะลบกุญแจสาธารณะออกจากวงแหวนกุญแจสาธารณะของคุณ
หมายเหตุ: หากมีรหัสส่วนตัวในรหัสส่วนตัวที่เชื่อมโยงกับรหัสสาธารณะนี้คุณจะได้รับข้อผิดพลาด! คุณต้องลบกุญแจส่วนตัวสำหรับคู่กุญแจนี้จากแหวนกุญแจส่วนตัวของคุณก่อน

เพื่อลบคีย์ส่วนตัว (คีย์บนริงคีย์ส่วนตัวของคุณ):

$ gpg --delete-secret-key "User Name"

การทำเช่นนี้จะเป็นการลบคีย์ลับออกจากวงแหวนลับของคุณ


2
ขอบคุณ; นั่นคือจุดเริ่มต้นอย่างน้อย ฉันสามารถใช้มันเพื่อค้นหาและแสดงรายการกุญแจที่หมดอายุ:gpg --list-keys | awk '/^pub.* \[expired\: / {id=$2; sub(/^.*\//, "", id); print id}' | fmt -w 999 | sed 's/^/gpg --delete-keys /;'
39811

"User Name"สามารถเป็นกุญแจสาธารณะสั้น ๆ ได้
nmz787

8

ฉันมีสคริปต์ทุบตีกำหนดให้ทำงานทุกสัปดาห์จาก cron เพื่อจัดการสิ่งนี้:

#!/bin/bash
# Clean up the GPG Keyring.  Keep it tidy.
# blog.lavall.ee

echo -n "Expired Keys: "
for expiredKey in $(gpg2 --list-keys | awk '/^pub.* \[expired\: / {id=$2; sub(/^.*\//, "", id); print id}' | fmt -w 999 ); do
    echo -n "$expiredKey"
    gpg2 --batch --quiet --delete-keys $expiredKey >/dev/null 2>&1
    if [ $? -eq 0 ]; then
        echo -n "(OK), "
    else
        echo -n "(FAIL), "
    fi
done
echo done.

echo -n "Update Keys: "
for keyid in $(gpg -k | grep ^pub | grep -v expired: | grep -v revoked: | cut -d/ -f2 | cut -d' ' -f1); do
    echo -n "$keyid"
    gpg2 --batch --quiet --edit-key "$keyid" check clean cross-certify save quit > /dev/null 2>&1
    if [ $? -eq 0 ]; then
        echo -n "(OK), "
    else
        echo -n "(FAIL), "
    fi
done
echo done.

gpg2 --batch --quiet --refresh-keys > /dev/null 2>&1
if [ $? -eq 0 ]; then
    echo "Refresh OK"
else
     echo "Refresh FAIL."
fi

มีอะไรอยู่$2ในawkส่วนของสคริปต์ของคุณ? และในขณะที่มันคือ$1อะไร ไชโย
Cbhihe

ไวยากรณ์ awk ปกติสำหรับฟิลด์ที่สองและช่องที่หนึ่ง (คั่นด้วยช่องว่าง) ในบรรทัดอินพุตปัจจุบัน
fche

ผมไม่เข้าใจว่าทำไมทำล้างข้อมูลในท้องถิ่นของคีย์แล้ว ... ดาวน์โหลดทุกสิ่งที่คุณเพียงแค่ลบออกจาก keyserver --refresh-keysอีกครั้งกับ ฉันจะใส่ความสดชื่นไว้กลางสคริปต์ไม่ใช่ตอนจบ
lapo

4
% gpg --edit-key KEYID
gpg> clean
User ID [...]: 139 signatures removed
gpg> save
% gpg --version
gpg (GnuPG) 1.4.18
[...]

1
เมื่อฉันทำตามขั้นตอนเหล่านั้นจากนั้นตรวจสอบด้วย `gpg --list-keys 'ฉันคอยดูกุญแจเก่าที่หมดอายุแล้วเหมือนเดิม ...
Cbhihe

5
gpg cleanไม่ได้ลบคีย์ที่หมดอายุแล้วลายเซ็นที่หมดอายุเท่านั้น
fche

0
echo -n "Expired Keys: "
list_expired_keys="$(gpg2 --list-keys | grep -1 pub | sed 'N;s/\n/ /' | awk '/^pub.* \[expired\: / {id=$7; sub(/^.*\//, "", id); print id}' | fmt -w 999)";
list_revoked_keys="$(gpg2 --list-keys | grep -1 pub | sed 'N;s/\n/ /' | awk '/^pub.* \[revoked\: / {id=$7; sub(/^.*\//, "", id); print id}' | fmt -w 999)";
for key in $list_expired_keys $list_revoked_keys; do
    echo -n "$key"
    gpg2 --batch --quiet --delete-keys $key >/dev/null 2>&1
    if [ $? -eq 0 ]; then
        echo -n "(OK), "
    else
        echo -n "(FAIL), "
    fi
done
echo done.

นี่คือ bash-script ในการทำงาน มันเป็นการปรับตัวของhttps://superuser.com/a/859739สำหรับ gpg2 โดยที่ id หลักอยู่ในบรรทัดที่สอง

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