การใช้ OpenSSL สิ่งที่“ ไม่สามารถเขียน“ สถานะสุ่ม” หมายความว่าอะไร


407

ฉันสร้างใบรับรอง SSL ที่ลงชื่อด้วยตนเองเพื่อปกป้องส่วนผู้ดูแลระบบเซิร์ฟเวอร์ของฉันและฉันได้รับข้อความนี้จาก OpenSSL:

ไม่สามารถเขียน 'สถานะสุ่ม'

สิ่งนี้หมายความว่า?

นี่คือบนเซิร์ฟเวอร์ Ubuntu ฉันได้รับการอัพเกรด libssl เพื่อแก้ไขช่องโหว่ความปลอดภัยล่าสุด

คำตอบ:


555

ในทางปฏิบัติสาเหตุที่พบบ่อยที่สุดสำหรับเหตุการณ์นี้ดูเหมือนว่าไฟล์. rnd ในโฮมไดเร็กตอรี่ของคุณเป็นเจ้าของโดยรูทมากกว่าบัญชีของคุณ การแก้ไขอย่างรวดเร็ว:

sudo rm ~/.rnd

สำหรับข้อมูลเพิ่มเติมนี่คือรายการจากคำถามที่พบบ่อย OpenSSL :

บางครั้งยูทิลิตีบรรทัดคำสั่ง openssl จะไม่ยกเลิกด้วยข้อความแสดงข้อผิดพลาด "PRNG ไม่ได้ถูก seeded" แต่บ่นว่ามันเป็น "ไม่สามารถเขียน 'random state'" ข้อความนี้อ้างถึงไฟล์การเริ่มต้นที่เป็นค่าเริ่มต้น (ดูคำตอบก่อนหน้า) สาเหตุที่เป็นไปได้คือไม่รู้จักชื่อไฟล์เริ่มต้นเนื่องจากไม่ได้ตั้งค่าไฟล์ RANDFILE หรือ HOME (เวอร์ชันสูงสุด 0.9.6 ไฟล์ที่ใช้ ".rnd" ในไดเรกทอรีปัจจุบันในกรณีนี้ แต่กรณีนี้เปลี่ยนด้วย 0.9.6a)

ดังนั้นฉันจะตรวจสอบ RANDFILE, HOME และสิทธิ์ในการเขียนไปยังสถานที่เหล่านั้นในระบบไฟล์

หากทุกอย่างดูเหมือนจะเป็นระเบียบคุณสามารถลองวิ่งด้วยstraceและดูว่าเกิดอะไรขึ้น


42
ระบบของฉันให้ปัญหานี้กับฉันเพราะไฟล์ ".rnd" เป็นของ root แทนที่จะเป็นผู้ใช้ของฉัน sudo chown user:user ~/.rndทำทุกอย่างได้อย่างรวดเร็ว
HalfBrian

1
ฉันมีปัญหาเช่นเดียวกับ OP ฉันทำsudoสิ่งนั้นและใช้งานได้ แต่ทำไมฉันยังคงมี.rndไดเรกทอรีที่ฉันเป็นเจ้าของโดยรูทใน $ HOME ของฉันหลังจากที่ฉันสร้างใบรับรองแบบลงนามด้วยตนเอง
Luc M

3
ใช่ถ้าคุณเรียกใช้จากเว็บเซิร์ฟเวอร์ php ผู้ใช้คือ www-data และคุณควรเพิ่ม "export" ก่อนทุก openssl: shell_exec ('export RANDFILE = ". rnd"; openssl ecparam -genkey -name secp256k1')
diyism

2
หากคุณกำลังใช้ภาษาสคริปต์เช่น PHP เพื่อ OpenSSL โทรเป็น www-ข้อมูลคุณสามารถแก้ปัญหานี้โดยการสร้าง/var/www/.rndและ Chowning www-dataมัน (สมมติว่า/var/wwwเป็นwww-dataโฟลเดอร์บ้านซึ่งอยู่ในระบบส่วนใหญ่คุณสามารถตรวจสอบwww-dataโฟลเดอร์บ้านด้วยcat /etc/passwd | grep www-data)
Nick

1
ฉันใช้ Windows - แน่นอนฉันต้องเรียกใช้พรอมต์ CMD ในฐานะผู้ดูแลระบบ! การทำเช่นนั้นได้รับปัญหานี้
NickBeaugié

264

ฉันรู้ว่าคำถามนี้อยู่บน Linux แต่บน windows ฉันมีปัญหาเดียวกัน ปรากฎว่าคุณต้องเริ่มต้นพร้อมรับคำสั่งในโหมด "Run As Administrator" เพื่อให้ทำงานได้ มิฉะนั้นคุณจะได้รับเหมือนกัน: ไม่สามารถเขียนข้อผิดพลาด 'สถานะสุ่ม'


13
ฉันทำงานบน windows ในฐานะผู้ดูแล แต่ก็ยังได้รับข้อผิดพลาด
Smalcat

6
การเป็นผู้ดูแลระบบของเครื่องและการใช้ "Run As Administrator" นั้นแตกต่างกัน "Run As Administrator" บังคับให้โปรแกรมทำงานในฐานะผู้ดูแลระบบมิฉะนั้นแม้ว่าคุณจะเป็นผู้ดูแลระบบพรอมต์ก็จะทำงานโดยไม่ต้องมีผู้ดูแลระบบรักษาความปลอดภัย
Beachhouse

66
หากคุณกำลังทำงานในโหมดผู้ดูแลระบบและคุณจะยังคงได้รับการ "ไม่สามารถเขียน 'รัฐสุ่ม", การแก้ปัญหาหนึ่งคือการก่อนที่จะดำเนินset RANDFILE=.rnd openssl
jevon

3
ใน Powershell นี้เป็นมากกว่า$env:RANDFILE=".rnd" set RANDFILE=.rnd
x5657

ข้อเสียของการไม่ทำอย่างนั้นคืออะไร?
StanTastic

41

อีกปัญหาหนึ่งบนแพลตฟอร์ม Windows ตรวจสอบให้แน่ใจว่าคุณกำลังเรียกใช้พรอมต์คำสั่งในฐานะผู้ใช้ที่เป็นผู้ดูแลระบบ!

ฉันไม่รู้ว่ามันจะกัดฉันกี่ครั้ง ...


ตามที่คนอื่น ๆ แนะนำให้ตั้งค่าชุดนี้ RANDFILE = .rnd ทำงานให้ฉันโดยไม่ต้องทำ cmd line กับผู้ดูแลระบบ
Svetoslav Marinov

16

เห็นได้ชัดว่าฉันจำเป็นต้องเรียกใช้ OpenSSL เป็นรูทเพื่อให้ได้รับอนุญาตไปยังไฟล์การเพาะ


16
มีความเป็นไปได้มากกว่าที่คุณจะรันครั้งเดียวในฐานะ root โดยที่ไฟล์. rnd ในโฮมไดเร็กตอรี่ของคุณถูกสร้างขึ้นด้วยสิทธิ์ที่ตั้งไว้สำหรับรูทเท่านั้น เรื่องนี้เกิดขึ้นกับฉันสักพัก การลบ. rnd แก้ไขปัญหา
fotNelton

12

ฉันมีสิ่งเดียวกันบนเซิร์ฟเวอร์ windows จากนั้นฉันก็หาวิธีโดยการเปลี่ยนค่าvars.batซึ่งคือ:

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

จากนั้นทำซ้ำตั้งแต่ต้นและทุกอย่างควรจะดี


นั่นมัน! ขอบคุณ ฉันทำการเปลี่ยนแปลงนี้ระหว่างคำสั่ง "init-config" และ "vars" จากคำแนะนำ (ที่นี่: openvpn.net/index.php/open-source/documentation/howto.html#pki ) ต้องเป็นเพราะฉันติดตั้งรุ่น 32 บิต (ซึ่งฉันชอบ)
symbiont

4
นั่นเป็นเคล็ดลับและฉันไม่จำเป็นต้องเรียกใช้ในฐานะผู้ดูแลระบบ ขอบคุณ! อันที่จริงฉันเพิ่งใช้set HOME=.
Synetech

6

ปัญหาสำหรับฉันคือฉันมี. rnd ในโฮมไดเร็กตอรี่ของฉัน แต่มันเป็นของ root การลบและออกใหม่คำสั่ง openssl แก้ไขสิ่งนี้


5

คุณควรตั้งค่าตัวแปรสภาพแวดล้อม $ RANDFILE และ / หรือสร้างไฟล์ $ HOME / .rnd ( คำถามที่พบบ่อย OpenSSL ) (แน่นอนคุณควรมีสิทธิ์ในไฟล์นั้น ๆ คำตอบอื่น ๆ เกี่ยวกับเรื่องนี้ แต่ก่อนอื่นคุณควรมีไฟล์และการอ้างอิงถึง)

สูงถึงเวอร์ชัน 0.9.6 OpenSSL เขียนไฟล์การเพาะในไดเรกทอรีปัจจุบันในไฟล์ ".rnd" ที่รุ่น 0.9.6a คุณไม่มีไฟล์เริ่มต้น OpenSSL 0.9.6b และใหม่กว่าจะทำงานคล้ายกับ 0.9.6a แต่จะใช้ค่าเริ่มต้นเป็น "C: \" สำหรับ HOME บนระบบ Windows หากไม่ได้ตั้งค่าตัวแปรสภาพแวดล้อม

หากไฟล์การเริ่มต้นเริ่มต้นไม่มีอยู่หรือสั้นเกินไปอาจเกิดข้อความแสดงข้อผิดพลาด "PRNG ที่ไม่ได้หยอด"

ตัวแปรสภาพแวดล้อม $ RANDFILE และ $ HOME / .rnd ถูกใช้โดยเครื่องมือบรรทัดคำสั่ง OpenSSL เท่านั้น แอปพลิเคชันที่ใช้ไลบรารี OpenSSL มีตัวเลือกการกำหนดค่าเพื่อระบุแหล่งที่มาของเอนโทรปีโปรดตรวจสอบเอกสารที่มาพร้อมกับแอปพลิเคชัน


1

ฉันได้พบปัญหานี้ในวันนี้ที่ AWS Lambda ฉันสร้างตัวแปรสภาพแวดล้อม RANDFILE = /tmp/.random

นั่นเป็นกลอุบาย

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