Làm thế nào để tạo khóa openSSL bằng cách sử dụng cụm mật khẩu từ dòng lệnh?


107

Đầu tiên - điều gì xảy ra nếu tôi không nhập cụm mật khẩu? Một số loại cụm từ ngẫu nhiên giả có được sử dụng không? Tôi chỉ đang tìm kiếm thứ gì đó "đủ tốt" để ngăn chặn những tin tặc bình thường.

Thứ hai - làm cách nào để tạo một cặp khóa tạo thành dòng lệnh, cung cấp cụm mật khẩu trên dòng lệnh?


Cuối cùng tôi đã làm cho nó hoạt động bằng cách sử dụng các lệnh này, bằng cách sử dụng execute () mà nó thường được coi là không an toàn khi sử dụng, tốt hơn là cung cấp PassPhrase trong một tệp. Tôi có thể chấp nhận rủi ro này vì tôi chắc chắn rằng PHP sẽ chỉ được thực thi trên PC của tôi (chạy windows và không có lệnh PS).

openssl genrsa -aes128 -passout pass:foobar -out privkey.pem 2048
openssl rsa -in privkey.pem -passin pass:foobar -pubout -out privkey.pub

Rất cám ơn @caf, nếu không có người thì điều này sẽ không thể thực hiện được.

Chỉ có một điều đáng tiếc - rằng dù tôi có Google đến đâu, dường như không ai có thể openssl_pkey_new()làm việc với Xampp trên Windows (đó là cách thích hợp để tạo cặp khóa)


4
tại sao openssl_pkey_new()... là cách "thích hợp" để tạo một cặp khóa?
Jake Berger

Windows không (bình thường) có psnhưng kể từ Vista thì cówmic process get commandline
dave_thompson_085

Câu trả lời:


210

Nếu bạn không sử dụng cụm mật khẩu, thì khóa cá nhân không được mã hóa bằng bất kỳ mật mã đối xứng nào - nó được xuất ra hoàn toàn không được bảo vệ.

Bạn có thể tạo một cặp khóa, cung cấp mật khẩu trên dòng lệnh bằng cách sử dụng lời gọi như (trong trường hợp này, mật khẩu là foobar):

openssl genrsa -aes128 -passout pass:foobar 3072

Tuy nhiên, lưu ý rằng cụm mật khẩu này có thể bị lấy bởi bất kỳ quá trình nào khác đang chạy trên máy vào thời điểm đó, vì các đối số dòng lệnh thường hiển thị cho tất cả các quá trình.

Một giải pháp thay thế tốt hơn là ghi cụm mật khẩu vào một tệp tạm thời được bảo vệ bằng quyền đối với tệp và chỉ định rằng:

openssl genrsa -aes128 -passout file:passphrase.txt 3072

Hoặc cung cấp cụm mật khẩu trên đầu vào chuẩn:

openssl genrsa -aes128 -passout stdin 3072

Bạn cũng có thể sử dụng một đường ống được đặt tên với file:tùy chọn hoặc một trình mô tả tệp.


Sau đó, để có được khóa công khai phù hợp, bạn cần sử dụng openssl rsa, cung cấp cùng một cụm mật khẩu với -passintham số như được sử dụng để mã hóa khóa riêng tư:

openssl rsa -passin file:passphrase.txt -pubout

(Điều này mong đợi khóa cá nhân được mã hóa trên đầu vào chuẩn - thay vào đó bạn có thể đọc nó từ một tệp bằng cách sử dụng -in <file>).


Ví dụ về cách tạo cặp khóa riêng tư và công khai 3072 bit trong tệp, với cặp khóa cá nhân được mã hóa bằng mật khẩu foobar:

openssl genrsa -aes128 -passout pass:foobar -out privkey.pem 3072
openssl rsa -in privkey.pem -passin pass:foobar -pubout -out privkey.pub

+1 Tuyệt vời, điều đó hoạt động! Cảm ơn, nếu bạn có thể giúp một thanh thiếu niên nhiều hơn một chút thì bạn sẽ nhận được câu trả lời ... tại sao điều này không hiệu quả? openssl rsa -in privkey.pem -pubout -passout pass: foobar -out pubkey.pem
Mawg nói hãy phục hồi Monica vào

hoặc, nói một cách khác - cách lấy khóa công khai từ lệnh của bạn (hơi khác so với của tôi). Tôi chỉ cần một cặp phù hợp. Đây chỉ là bảo mật "vừa đủ tốt".
Mawg nói hãy phục hồi Monica vào

4
@Mawg: opensslLệnh của bạn đang xuất ra khóa công khai tương ứng với khóa cá nhân được cung cấp - các khóa công khai không được mã hóa (chúng không phải là bí mật), vì vậy việc sử dụng -passoutkhông có ý nghĩa gì. Bạn có thể muốn sử dụng -passinở đó, để cung cấp cụm mật khẩu đã được sử dụng để mã hóa khóa cá nhân trong bước đầu tiên. Tôi cũng đã thêm một số thứ vào câu trả lời.
caf

@caf, cảm ơn vì phản hồi tuyệt vời (+1 lần nữa). Tuy nhiên, tôi dường như quá ngu ngốc để được phép sử dụng OpenSSL. Tôi muốn có khóa trong một tệp và vì lý do nào đó, openssl genrsa 2048 -aes128 -passout pass:foobar -out privkey.pemtôi không làm như vậy. Bạn có thể vui lòng cho tôi hai lệnh - một lệnh để tạo khóa riêng tư vào tệp, lệnh thứ hai để tạo khóa công khai (cũng trong tệp) được không? Xin lỗi là một phiền toái như vậy, nhưng tôi đã được chơi đùa với nó và không thể làm cho nó hoạt :-(
Mawg nói Khôi phục Monica

3
@Mawg: OpenSSL không thích nó nếu -outtham số xuất hiện sau 2048- thực sự, đó được cho là điều cuối cùng trên dòng lệnh (Tôi đã cập nhật câu trả lời của mình như vậy). Xem ví dụ cuối cùng, tôi nghĩ đó là những gì bạn muốn. Đối với AES-128, một người mà tôi tin tưởng trong những vấn đề này đề xuất nó hơn AES-256.
caf,

9

genrsađã được thay thế bằnggenpkey & khi chạy thủ công trong một thiết bị đầu cuối, nó sẽ nhắc nhập mật khẩu:

openssl genpkey -aes-256-cbc -algorithm RSA -out /etc/ssl/private/key.pem -pkeyopt rsa_keygen_bits:4096

Tuy nhiên, khi chạy từ một tập lệnh, lệnh sẽ không yêu cầu mật khẩu, vì vậy để tránh mật khẩu có thể xem được như một quy trình, hãy sử dụng một hàm trong shelltập lệnh:

get_passwd() {
    local passwd=
    echo -ne "Enter passwd for private key: ? "; read -s passwd
    openssl genpkey -aes-256-cbc -pass pass:$passwd -algorithm RSA -out $PRIV_KEY -pkeyopt rsa_keygen_bits:$PRIV_KEYSIZE
}
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.