Sử dụng OpenSSL, những gì không thể viết 'trạng thái ngẫu nhiên' có nghĩa là gì?


407

Tôi đang tạo chứng chỉ SSL tự ký để bảo vệ phần quản trị viên của máy chủ của mình và tôi tiếp tục nhận được thông báo này từ OpenSSL:

không thể viết 'trạng thái ngẫu nhiên'

Điều đó có nghĩa là gì?

Đây là trên một máy chủ Ubuntu. Tôi đã nâng cấp libssl để sửa lỗ hổng bảo mật gần đây .

Câu trả lời:


555

Trong thực tế, lý do phổ biến nhất cho điều này xảy ra dường như là tệp .rnd trong thư mục chính của bạn được sở hữu bởi root chứ không phải tài khoản của bạn. Cách khắc phục nhanh:

sudo rm ~/.rnd

Để biết thêm thông tin, đây là mục từ Câu hỏi thường gặp về OpenSSL :

Đôi khi, tiện ích dòng lệnh openssl không hủy bỏ với thông báo lỗi "PRNG không được gieo", nhưng phàn nàn rằng nó "không thể ghi 'trạng thái ngẫu nhiên'". Thông báo này đề cập đến tập tin gieo hạt mặc định (xem câu trả lời trước). Một lý do có thể là không có tên tệp mặc định nào được biết vì cả RANDFILE và HOME đều không được đặt. (Phiên bản lên đến 0.9.6 tệp đã sử dụng ".rnd" trong thư mục hiện tại trong trường hợp này, nhưng điều này đã thay đổi với 0.9.6a.)

Vì vậy, tôi sẽ kiểm tra RANDFILE, HOME và quyền để ghi vào những nơi đó trong hệ thống tập tin.

Nếu mọi thứ dường như theo thứ tự, bạn có thể thử chạy với strace và xem chính xác những gì đang xảy ra.


42
Hệ thống của tôi đã cho tôi vấn đề này vì tệp ".rnd" được sở hữu bởi root chứ không phải người dùng của tôi. Một cách nhanh chóng sudo chown user:user ~/.rndlàm cho mọi thứ làm việc ra.
HalfBrian

1
Tôi đã có cùng một vấn đề như OP. Tôi đã làm sudođiều đó và nó đã làm việc. Nhưng tại sao tôi vẫn có một .rndthư mục được root bởi $ HOME sau khi tôi tạo chứng chỉ tự ký?
Luc M

3
Có, nếu bạn chạy từ máy chủ web php, người dùng là dữ liệu www và bạn nên thêm "export" trước mỗi openssl: shell_exec ('export RANDFILE = ". Rnd"; openssl ecparam -genkey -name secp256k1'))
chủ nghĩa tự làm

2
Nếu bạn đang sử dụng ngôn ngữ kịch bản lệnh như PHP để gọi openssl dưới dạng dữ liệu www, bạn có thể giải quyết vấn đề này bằng cách tạo /var/www/.rndvà truy cập nó www-data. (Giả sử đó /var/wwwwww-datathư mục nhà của nó, có trên hầu hết các hệ thống. Bạn có thể kiểm tra www-datathư mục nhà của mình với cat /etc/passwd | grep www-data)
Nick

1
Tôi đang sử dụng Windows - tất nhiên, tôi cần chạy dấu nhắc CMD với tư cách Quản trị viên! Làm như vậy, đã làm tròn vấn đề này.
NickBeaugié

264

Tôi biết câu hỏi này là trên Linux, nhưng trên windows tôi cũng gặp vấn đề tương tự. Hóa ra bạn phải bắt đầu dấu nhắc lệnh trong chế độ "Chạy với tư cách quản trị viên" để nó hoạt động. Nếu không, bạn sẽ nhận được cùng một lỗi: không thể viết lỗi 'trạng thái ngẫu nhiên'.


13
Tôi đang chạy trên windows với tư cách quản trị viên nhưng vẫn gặp lỗi
Smalcat

6
Là quản trị viên trên máy và sử dụng "Chạy với tư cách quản trị viên" thì khác. "Chạy với tư cách quản trị viên" buộc chương trình chạy với tư cách Quản trị viên, nếu không, ngay cả khi bạn là quản trị viên, lời nhắc sẽ chạy với giải phóng mặt bằng bảo mật không phải của quản trị viên.
Beachhouse

67
Nếu bạn đang chạy trong chế độ quản trị viên và bạn vẫn nhận được "Không thể ghi 'trạng thái ngẫu nhiên'", một giải pháp khác là set RANDFILE=.rndtrước khi thực hiện openssl.
jevon

3
Trong Powershell điều này là $env:RANDFILE=".rnd"hơn set RANDFILE=.rnd.
x5657

Nhược điểm của việc KHÔNG làm điều đó là gì?
StanTastic

41

Một vấn đề khác trên nền tảng Windows, hãy đảm bảo bạn đang chạy dấu nhắc lệnh của mình với tư cách là Người dùng quản trị!

Tôi không biết điều này đã cắn tôi bao nhiêu lần ...


1
như những người khác đã đề xuất cài đặt bộ này RANDFILE = .rnd làm việc cho tôi mà không cần thực hiện dòng cmd với Quản trị viên
Svetoslav Marinov

16

Rõ ràng, tôi cần chạy OpenSSL với quyền root để nó có quyền đối với tệp seeding.


16
Có nhiều khả năng là bạn đã từng chạy nó dưới dạng root, trong đó tệp .rnd trong thư mục chính của bạn đã được tạo với quyền chỉ được đặt cho root. Điều này đã xảy ra với tôi một thời gian trở lại. Xóa .rnd đã giải quyết vấn đề.
fotNelton

13

Tôi đã có điều tương tự trên máy chủ windows. Sau đó, tôi đã tìm ra bằng cách thay đổi vars.batđó là:

set HOME=C:\Program Files (x86)\OpenVPN\easy-rsa

sau đó làm lại từ đầu và mọi thứ sẽ ổn


Điều đó là vậy đó! cảm ơn. tôi đã thực hiện thay đổi này ngay giữa các lệnh "init-config" và "vars", từ các hướng dẫn (ở đây: openvpn.net/index.php/open-source/documentation/howto.html#pki ). phải bởi vì tôi đã cài đặt phiên bản 32 bit (mà tôi thích).
cộng sinh

4
Đó là một mẹo nhỏ và tôi không phải chạy với tư cách quản trị viên. Cảm ơn! Trên thực tế, tôi chỉ đơn giản sử dụngset HOME=.
Synetech

6

Vấn đề đối với tôi là tôi đã có .rnd trong thư mục nhà của mình nhưng nó thuộc sở hữu của root. Xóa nó và phát hành lại lệnh openssl đã sửa lỗi này.


6

Bạn nên đặt biến môi trường $ RANDFILE và / hoặc tạo tệp $ HOME / .rnd. ( Câu hỏi thường gặp về OpenSSL ). (Tất nhiên, bạn nên có quyền đối với tệp đó. Những câu trả lời khác ở đây là về điều đó. Nhưng trước tiên, bạn nên có tệp và tham chiếu đến nó.)

Lên đến phiên bản 0.9.6 OpenSSL đã ghi tệp gieo vào thư mục hiện tại trong tệp ".rnd". Tại phiên bản 0.9.6a, bạn không có tệp seeding mặc định. OpenSSL 0.9.6b trở lên sẽ hoạt động tương tự 0.9.6a, nhưng sẽ sử dụng mặc định "C: \" cho HOME trên các hệ thống Windows nếu biến môi trường chưa được đặt.

Nếu tệp gieo hạt mặc định không tồn tại hoặc quá ngắn, thông báo lỗi "PRNG không được gieo" có thể xảy ra.

Biến môi trường $ RANDFILE và $ HOME / .rnd chỉ được sử dụng bởi các công cụ dòng lệnh OpenSSL. Các ứng dụng sử dụng thư viện OpenSSL cung cấp các tùy chọn cấu hình riêng để chỉ định nguồn entropy, vui lòng kiểm tra tài liệu đi kèm với ứng dụng.


2

Tôi đã gặp vấn đề này ngày hôm nay trên AWS Lambda. Tôi đã tạo một biến môi trường RANDFILE = /tmp/.random

Điều đó đã lừa

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.