Làm thế nào để tạo khóa gpg mà không cần tương tác người dùng?


13

Tôi đã tìm thấy trong https://www.gnupg.org/documentation/manuals/gnupg/Unattends-GPG-key-generation.html#Unattends-GPG-key-generation để tạo khóa gpg mà không cần tương tác của người dùng, nhưng nó không dường như làm việc

Kịch bản của tôi là:

#!/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

Khi tôi chạy nó, nó hiển thị:

=$ ./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'

Nhưng sau đó nó chỉ bị treo.

Khi tôi kiểm tra, trong lúc này, cây ps cho người dùng này, tôi thấy:

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

Trong ~ / .gnupg / gpg.conf không có đề cập nào về đại lý và tôi không biết nó đang cố gắng làm gì.

Các tệp foo.pub/foo.sec được tạo trong thư mục nhà, nhưng trống.

Tôi đang thiếu gì? Làm thế nào để tạo khóa mà không có bất kỳ loại tương tác người dùng?

Phiên bản:

  • gpg (GnuPG) 2.0.26
  • libgcrypt 1.6.2

Câu trả lời:


4

Có khả năng là bạn đang hết entropy. Tạo khóa đòi hỏi rất nhiều số ngẫu nhiên chất lượng rất cao; không có hoạt động của người dùng để cung cấp tính ngẫu nhiên chất lượng cao cho máy tính, nhóm entropy đang bị cạn kiệt bởi thế hệ và quá trình tạo chỉ bị treo, chờ cho bể được nạp lại.

Sự lựa chọn của bạn, để tăng sự hài lòng, là

  1. cấu hình lại gpg để sử dụng trình tạo số giả ngẫu nhiên không chặn, điều này sẽ không khôn ngoan nhất (mặc dù xem bên dưới),

  2. sử dụng một giải pháp phần mềm để lấy thêm entropy từ trạng thái hệ thống hiện có (hạt nhân nổi tiếng là bảo thủ về mức độ entropy được chuẩn bị để lấy từ trạng thái hệ thống, đặc biệt là khi trạng thái đó không có đầu vào trực tiếp của con người, ví dụ như định thời CPU hoặc NIC); như bạn đã chỉ ra, hasged là một trong những giải pháp như vậy, hoặc

  3. cung cấp cho máy tính một nguồn entropy cao cấp khác. Các thiết bị như Entropy Key hoặc OneRNG có thể đáp ứng yêu cầu này (Tôi không có kết nối với bất kỳ sản phẩm nào mà tôi sở hữu Khóa Entropy và rất hài lòng với nó).

Chỉnh sửa : mzhaase thu hút sự chú ý của tôi trong một bình luận cho bài viết này về / dev / urandom vs. / dev / ngẫu nhiên (trong đó cảm ơn rất nhiều, đó là một bài viết tuyệt vời!) Và có vấn đề với việc tôi không thích sử dụng urandomđể tạo khóa. Trên thực tế, bài báo không nói rằng hai nguồn này là tương đương và lưu ý rằng

Linux / dev / urandom vui vẻ cung cấp cho bạn những con số không quá ngẫu nhiên trước khi hạt nhân thậm chí có cơ hội thu thập entropy. Khi nào vậy? Khi khởi động hệ thống, khởi động máy tính.

Điều đó có nghĩa là, sau khi khởi động, cho đến khi urandomPRNG được khởi tạo với đủ entropy, thực sự không an toàn khi sử dụng nó để tạo khóa. Điều đó có thể mất một lúc, đặc biệt là trên một máy chủ không đầu, không giám sát và chúng tôi không biết khi nào đạt đến ngưỡng, bởi vì hệ thống không cho chúng tôi biết rõ ràng.

Bây giờ, nếu /dev/randomđược chuẩn bị để phát hành số, tôi có thể suy luận hợp lý rằng nhóm entropy đủ sâu để urandomđược khởi tạo đúng cách. Nhưng nếu tôi phải kiểm tra /dev/randomchặn trước mỗi lần sử dụng urandom(điều này cho thấy tôi tạo khóa ít hơn khi tôi khởi động lại, rất có thể là trường hợp này) tôi cũng có thể chỉ sử dụng các số từ /dev/randomđể tạo khóa.


2
Đó là / là vấn đề. Đã thêm daemon đã tạo, và bây giờ nó hoạt động tốt - tạo khóa trong ~ 0,7 giây.
eijeze

Rằng PRNG không 'tốt như' là một huyền thoại. Trong thực tế, cả / dev / ngẫu nhiên và / dev / urandom đều sử dụng cùng một PRNG. Bạn không yêu cầu tính ngẫu nhiên thực sự đối với các thuật toán chỉ an toàn về mặt tính toán (và / dev / ngẫu nhiên cũng không / dev / urandom thực sự có thể mang lại cho bạn tính ngẫu nhiên thực sự: bạn cần đo lường những điều thực sự ngẫu nhiên cho điều đó). Mật mã duy nhất yêu cầu tính ngẫu nhiên thực sự là các thuật toán bảo mật thông tin như bộ đệm một lần. Liên kết này nói về điều này một cách chi tiết: 2uo.de/myths-about-urandom
mzhaase

@mzhaase thật kỳ lạ, tôi đã xem qua liên kết đó và đọc nó vào đầu tuần này. Tôi sẽ chỉnh sửa câu trả lời của tôi ở trên để phản ánh bài viết, mặc dù tôi không hoàn toàn đồng ý với nó. Tôi cũng lưu ý rằng hệ thống của tôi, thật kỳ lạ, có lẽ nhận được sự ngẫu nhiên thực sự từ /dev/random(và do đó là những con số rất khó đoán từ /dev/urandomgần như mọi lúc), bởi vì tôi có một thiết bị phần cứng sử dụng đường hầm lượng tử để tạo entropy gắn liền với máy chủ của tôi (xem ở trên).
MadHatter

1
đã hoạt động tốt, khóa được tạo trong 1 giây. Chỉ cần cài đặt apt-get đã cài đặt, rồi chạy: haveged
waza123

@ waza123 điểm tốt, mặc dù có thể nói là một điểm đã được thực hiện bởi eijeze hai năm trước (nhìn vào bình luận đầu tiên ở trên).
MadHatter

2

Tôi thấy có một vài thay đổi đơn giản làm cho kịch bản của bạn hoạt động. Tôi cũng đã bao gồm một vài thử nghiệm để một khi khóa được tạo, nó sẽ tự động được kiểm tra.

Tôi cũng đã xóa mật khẩu để các bài kiểm tra chính có thể được tự động.

#!/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

Làm việc này như là một phần của việc tạo khóa cho cài đặt ứng dụng tự động. Cài đặt và bắt đầu gói ' rngd ' để tạo entroy sẽ khắc phục sự cố của bạn. Đơn giản để cài đặt và sử dụng.

Đây là mã .

  • Bắt đầu rngd ( /dev/hwrandomtheo mặc định, nhưng có thể sửa đổi) để cung cấp một nguồn entropy
  • Sao chép một mẫu đơn giản hơn (thay thế tên và email của mẫu jinja bằng những gì bạn muốn)
  • tạo khóa bằng gpg
  • nhập nó vào keyring cục bộ

Trong mã mẫu được cung cấp urandomđược sử dụng làm nguồn, điều đó không được khuyến khích. 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 sử dụng /dev/hwrandomtheo mặc định và có thể sửa đổi. Xem trang người đàn ông.
xddsg

Đúng, tôi đã nói rằng trong mã bạn liên kết với nó được sử dụng rõ ràng urandomvà làm như vậy là không được khuyến khích.
keyneom

-1

Đây là một cái bạn có thể sử dụng nhưng tôi khuyên bạn nên chạy tập lệnh này trong một thiết bị đầu cuối mới để không ảnh hưởng đến tập lệnh hiện tại của bạn. Tập lệnh này sẽ tiếp tục tạo entropy bằng cách giữ cho máy bận và bị kẹt trong một vòng lặp vô hạn cho đến khi người dùng thoát khỏi tập lệnh. Không có tương tác người dùng là cần thiết cho đến sau khi tạo khóa. Tất cả các kịch bản hiện là danh sách các tập tin mãi mãi.

Có thể mất vài phút (đôi khi 10+) để tạo tùy thuộc vào máy và kích thước phím của bạn nhưng thật tuyệt khi không phải tương tác với nó.

#!/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

Thực hiện tìm kiếm trên một hệ thống tập tin không tạo ra một nguồn entropy thực sự an toàn vì hành vi của nó có thể dự đoán và có thể tái tạo.
Joffrey
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.