วิธีสร้างคีย์ gpg โดยที่ผู้ใช้ไม่ต้องทำอะไร


13

ฉันพบในhttps://www.gnupg.org/documentation/manuals/gnupg/Unattended-GPG-key-generation.html#Unattended-GPG-key-generationเมธอดเพื่อสร้างคีย์ gpg โดยไม่ต้องมีการโต้ตอบกับผู้ใช้ ดูเหมือนจะทำงาน

สคริปต์ของฉันคือ:

#!/usr/bin/env bash
rm -rf .gnupg
mkdir -m 0700 .gnupg
touch .gnupg/gpg.conf
chmod 600 .gnupg/gpg.conf
tail -n +4 /usr/share/gnupg2/gpg-conf.skel > .gnupg/gpg.conf

touch .gnupg/{pub,sec}ring.gpg


cat >.gnupg/foo <<EOF
    %echo Generating a basic OpenPGP key
    Key-Type: RSA
    Key-Length: 2048
    Subkey-Type: RSA
    Subkey-Length: 2048
    Name-Real: User 1
    Name-Comment: User 1
    Name-Email: user@1.com
    Expire-Date: 0
    Passphrase: kljfhslfjkhsaljkhsdflgjkhsd
    %pubring foo.pub
    %secring foo.sec
    # Do a commit here, so that we can later print "done" :-)
    %commit
    %echo done
EOF

gpg2 --verbose --batch --gen-key .gnupg/foo

เมื่อฉันเรียกใช้มันจะแสดง:

=$ ./gen.keys.sh 
gpg: Generating a basic OpenPGP key
gpg: no running gpg-agent - starting one
gpg: writing public key to `foo.pub'
gpg: writing secret key to `foo.sec'

แต่แล้วมันก็หยุด

เมื่อฉันตรวจสอบในเวลาเฉลี่ยทรี ps สำหรับผู้ใช้นี้ฉันเห็น:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
tstpg    22603  0.0  0.0  24108  5688 pts/9    Ss   14:59   0:00 -bash
tstpg    22624  0.0  0.0  13688  3168 pts/9    S+   14:59   0:00  \_ bash ./gen.keys.sh
tstpg    22632  0.2  0.0  27428  3676 pts/9    SL+  14:59   0:00      \_ gpg2 --verbose --batch --gen-key .gnupg/foo
tstpg    22634  0.3  0.0  18072  2884 pts/9    SL+  14:59   0:00          \_ gpg-agent --server

ใน ~ / .gnupg / gpg.conf ไม่มีการพูดถึงตัวแทนและฉันไม่รู้ว่ามันกำลังพยายามทำอะไร

ไฟล์ foo.pub/foo.sec ถูกสร้างขึ้นใน home dir แต่ว่างเปล่า

ฉันกำลังคิดถึงอะไร วิธีสร้างคีย์โดยไม่มีการโต้ตอบกับผู้ใช้ชนิดใด

รุ่น:

  • gpg (GnuPG) 2.0.26
  • libgcrypt 1.6.2

คำตอบ:


4

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

ทางเลือกของคุณเพื่อเพิ่มความพึงพอใจคือ

  1. กำหนดค่า gpg อีกครั้งเพื่อใช้ตัวสร้างหมายเลขปลอมที่ไม่ปิดกั้นซึ่งจะไม่ฉลาดที่สุด (แม้ว่าจะดูด้านล่าง)

  2. การใช้โซลูชันซอฟต์แวร์เพื่อรับเอนโทรปีมากขึ้นจากสถานะระบบที่มีอยู่ (เคอร์เนลมีการอนุรักษ์อย่างฉาวโฉ่เกี่ยวกับปริมาณเอนโทรปีที่เตรียมไว้เพื่อรับมาจากสถานะระบบโดยเฉพาะอย่างยิ่งเมื่อสถานะนั้นไม่มีอินพุตมนุษย์โดยตรงเช่น CPU หรือ NIC timings) ในขณะที่คุณได้ชี้ให้เห็นว่าได้รับการแก้ไขเป็นหนึ่งในวิธีการแก้ปัญหาดังกล่าวหรือ

  3. จัดหาคอมพิวเตอร์ที่มีแหล่งกำเนิดเอนโทรปีคุณภาพสูงอีกแหล่งหนึ่ง อุปกรณ์เช่นEntropy KeyหรือOneRNGสามารถตอบสนองความต้องการนี้ได้ (ฉันไม่ได้เชื่อมต่อกับผลิตภัณฑ์ใดบันทึกว่าฉันเป็นเจ้าของ Entropy Key และมีความสุขมากกับมัน)

แก้ไข : mzhaase ดึงความสนใจของฉันในความคิดเห็นไปที่บทความนี้ใน / dev / urandom เทียบกับ / dev / random (ซึ่งขอบคุณมากมันเป็นบทความที่ยอดเยี่ยม!) และมีปัญหากับฉันไม่ชอบการใช้urandomเพื่อสร้างกุญแจ ในความเป็นจริงบทความไม่ได้บอกว่าทั้งสองแหล่งนั้นมีความเท่าเทียมกันและบันทึกไว้ว่า

Linux / dev / urandom อย่างมีความสุขช่วยให้คุณไม่ได้สุ่มตัวเลขก่อนที่เคอร์เนลจะมีโอกาสรวบรวมเอนโทรปี เมื่อไหร่ เมื่อระบบเริ่มต้นให้ทำการบูทคอมพิวเตอร์

กล่าวคือหลังจากการบู๊ตจนกระทั่งurandomPRNG ได้รับการเริ่มต้นด้วยเอนโทรปีเพียงพอมันไม่ปลอดภัยที่จะใช้สำหรับการสร้างคีย์ อาจใช้เวลาสักครู่โดยเฉพาะอย่างยิ่งในเซิร์ฟเวอร์ที่ไม่ต้องดูแลและเราไม่ทราบว่าเมื่อถึงขีด จำกัด เนื่องจากระบบไม่ได้บอกเราอย่างชัดเจน

ตอนนี้ถ้า/dev/randomพร้อมที่จะออกหมายเลขฉันอาจสรุปได้ว่าเอนโทรปีพูนั้นลึกพอที่urandomจะเริ่มต้นได้อย่างถูกต้อง แต่ถ้าฉันต้องตรวจสอบ/dev/randomการบล็อกก่อนการใช้งานแต่ละครั้งurandom(ซึ่งทำให้ฉันสร้างรหัสน้อยกว่าที่ฉันรีบูตก็น่าจะเป็นกรณี) ฉันอาจใช้ตัวเลขจาก/dev/randomเพื่อสร้างกุญแจของฉัน


2
นั่นคือ / เป็นปัญหา เพิ่ม hasged daemon และตอนนี้ก็ใช้งานได้ดี - การสร้างคีย์ใน ~ 0.7 วินาที
eijeze

PRNG นั้นไม่ดีเท่าตำนาน ในความเป็นจริงทั้ง / dev / random และ / dev / urandom ใช้ PRNG เดียวกัน คุณไม่จำเป็นต้องสุ่มตัวอย่างที่แท้จริงสำหรับอัลกอริทึมที่มีความปลอดภัยในการคำนวณเท่านั้น (และ / / / dev / Random หรือ / dev / urandom ไม่สามารถให้สุ่มได้จริง: คุณต้องวัดสุ่มสำหรับสิ่งนั้น) การเข้ารหัสเท่านั้นที่ต้องใช้การสุ่มอย่างแท้จริงคืออัลกอริธึมที่ปลอดภัยในการให้ข้อมูลเช่นแผ่นเพียงครั้งเดียว ลิงค์นี้พูดถึงรายละเอียดนี้: 2uo.de/myths-about-urandom
mzhaase

@mzhaase ผิดปกติฉันเจอลิงค์นั้นและอ่านเมื่อต้นสัปดาห์นี้ ฉันจะแก้ไขคำตอบของฉันด้านบนเพื่อสะท้อนบทความแม้ว่าฉันจะไม่เห็นด้วยทั้งหมด ฉันยังทราบว่าระบบของฉันผิดปกติอาจได้รับการสุ่มอย่างแท้จริงจาก/dev/random(และดังนั้นตัวเลขที่คาดเดาไม่ได้สูงจาก/dev/urandomเกือบตลอดเวลา) เพราะฉันมีอุปกรณ์ฮาร์ดแวร์ที่ใช้อุโมงค์ควอนตัมเพื่อสร้างเอนโทรปีที่แนบกับเซิร์ฟเวอร์ของฉัน (ดู ข้างบน).
MadHatter

1
hasged ใช้งานได้ดีรหัสถูกสร้างใน 1 วินาที เพียงติดตั้ง apt-get hasged แล้วเรียกใช้: hasged
waza123

@ จุดที่ดี waza123 แต่เนื้อหาที่ทำโดย eijeze เมื่อสองปีก่อน (ดูความคิดเห็นแรกข้างต้น)
MadHatter

2

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

ฉันยังลบรหัสผ่านเพื่อให้การทดสอบสำคัญสามารถเป็นไปโดยอัตโนมัติ

#!/usr/bin/env bash
rm -rf .gnupg
mkdir -m 0700 .gnupg
touch .gnupg/gpg.conf
chmod 600 .gnupg/gpg.conf
tail -n +4 /usr/share/gnupg2/gpg-conf.skel > .gnupg/gpg.conf

cd .gnupg
# I removed this line since these are created if a list key is done.
# touch .gnupg/{pub,sec}ring.gpg
gpg2 --list-keys


cat >keydetails <<EOF
    %echo Generating a basic OpenPGP key
    Key-Type: RSA
    Key-Length: 2048
    Subkey-Type: RSA
    Subkey-Length: 2048
    Name-Real: User 1
    Name-Comment: User 1
    Name-Email: user@1.com
    Expire-Date: 0
    %no-ask-passphrase
    %no-protection
    %pubring pubring.kbx
    %secring trustdb.gpg
    # Do a commit here, so that we can later print "done" :-)
    %commit
    %echo done
EOF

gpg2 --verbose --batch --gen-key keydetails

# Set trust to 5 for the key so we can encrypt without prompt.
echo -e "5\ny\n" |  gpg2 --command-fd 0 --expert --edit-key user@1.com trust;

# Test that the key was created and the permission the trust was set.
gpg2 --list-keys

# Test the key can encrypt and decrypt.
gpg2 -e -a -r user@1.com keydetails

# Delete the options and decrypt the original to stdout.
rm keydetails
gpg2 -d keydetails.asc
rm keydetails.asc

1

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

นี่คือรหัส

  • เริ่ม rngd ( /dev/hwrandomโดยค่าเริ่มต้น แต่สามารถแก้ไขได้) เพื่อจัดเตรียมแหล่งที่มาของเอนโทรปี
  • คัดลอกเทมเพลตแบบง่าย ๆ (แทนที่อีเมลและชื่อเท็มเพลต jinja ด้วยสิ่งที่คุณต้องการ)
  • สร้างคีย์โดยใช้ gpg
  • นำเข้าสู่พวงกุญแจท้องถิ่น

ในโค้ดตัวอย่างที่ให้ไว้urandomจะใช้เป็นแหล่งข้อมูลซึ่งไม่สนับสนุน wiki.archlinux.org/index.php/Rng-tools Warning: Some tutorials available in the Internet, and even early versions of rng-tools package, recommend the following line for systems without TRGN: RNGD_OPTS="-o /dev/random -r /dev/urandom" Of course, this is a really bad idea, since you are simple filling the kernel entropy pool with entropy coming from the kernel itself! If your system does not have an available TRGN consider using haveged instead. See FS#34580 for details.
keyneom

@keyneom rngd ใช้งาน/dev/hwrandomโดยค่าเริ่มต้นและสามารถแก้ไขได้ ดูหน้าคน
xddsg

ใช่ฉันกำลังบอกว่าในรหัสที่คุณเชื่อมโยงกับมันมีการใช้อย่างชัดเจนurandomและไม่ควรทำเช่นนั้น
keyneom

-1

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

อาจใช้เวลาสักครู่ (บางครั้ง 10+) ในการสร้างขึ้นอยู่กับเครื่องและขนาดของคีย์ของคุณ แต่มันก็ดีที่ไม่ต้องโต้ตอบกับมัน

#!/bin/sh

while true;
do find * / && find * / && find * / && find * / && find * / && find * / && find * / && find * / && find * /;

echo "Press ctrl+c to exit this infinite loop"
sleep 2;
done

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