Mục đích của đối số -nodes trong openssl là gì?


102

Mục đích của -nodesđối số trong openssl là gì?


2
Stack Overflow là một trang dành cho các câu hỏi về lập trình và phát triển. Câu hỏi này có vẻ lạc đề vì nó không liên quan đến lập trình hoặc phát triển. Xem những chủ đề tôi có thể hỏi tại đây trong Trung tâm trợ giúp. Có lẽ Super User hoặc Unix & Linux Stack Exchange sẽ là nơi tốt hơn để hỏi.
jww

20
@jww Tôi không đồng ý, openssl là một bộ công cụ cấp thấp và các nhà phát triển phải xử lý nó mọi lúc. Đường này khá mờ, và sẽ là một mất mát lớn nếu không cho phép các câu hỏi mở ở đây đơn giản vì nó xảy ra là CLI chứ không phải C lib.
gtd

@gtd - đó là lời phàn nàn thường xuyên khi tôi gắn cờ các trang này. Ngoài ra, hãy xem Tôi đăng câu hỏi về Dev Ops ở đâu? . (Nhưng tôi nghĩ rằng tôi đã mắc sai lầm trong câu hỏi này - câu hỏi có từ năm 2011, và tôi tin rằng nó đã đúng chủ đề hồi đó. Tôi không muốn bị phạt vì thay đổi chính sách).
jww

2
@gtd - re: "openssl là bộ công cụ cấp thấp và các nhà phát triển luôn phải xử lý nó." - đó là những gì Super User hoặc Unix & Linux Stack Exchange dành cho. "... sẽ là một mất mát lớn nếu không cho phép đặt câu hỏi openssl ..." - Các câu hỏi lập trình openssl C luôn được chào đón ở đây. Sẽ không bỏ qua những câu hỏi không liên quan đến lập trình vì Stack Overflow là trang lập trình và phát triển. Có những trang web khác để truy cập khi bạn không biết cách sử dụng lệnh.
jww

Cảm ơn vì liên kết, tôi sẽ đăng câu trả lời của mình ở đó vì tôi nghĩ đây là một vấn đề rất quan trọng.
gtd

Câu trả lời:


123

Tùy chọn -nodeskhông phải là từ tiếng Anh "node", mà là "no DES". Khi được cung cấp dưới dạng đối số, điều đó có nghĩa là OpenSSL sẽ không mã hóa khóa cá nhân trong tệp PKCS # 12 .

Để mã hóa khóa cá nhân, bạn có thể bỏ qua -nodesvà khóa của bạn sẽ được mã hóa bằng 3DES-CBC. Để mã hóa khóa, OpenSSL sẽ nhắc bạn nhập mật khẩu và nó sử dụng mật khẩu đó để tạo khóa mã hóa bằng chức năng lấy ra khóa EVP_BytesToKey .

Tùy thuộc vào phiên bản OpenSSL của bạn và các tùy chọn đã biên dịch, bạn thể cung cấp các tùy chọn này thay cho -nodes:

-des          encrypt private keys with DES
-des3         encrypt private keys with triple DES (default)
-idea         encrypt private keys with idea
-seed         encrypt private keys with seed
-aes128, -aes192, -aes256
              encrypt PEM output with cbc aes
-camellia128, -camellia192, -camellia256
              encrypt PEM output with cbc camellia

Cuối cùng ở cấp thư viện, OpenSSL gọi hàm PEM_write_bio_PrivateKey với thuật toán mã hóa (hoặc thiếu) mà bạn chọn.


1
Bằng cách mã hóa, bạn có nghĩa là bằng mật khẩu?
Flimm

4
@Flimm: Được bảo vệ bằng mật khẩu, vâng. Mật khẩu tạo khóa mã hóa bằng cách sử dụng thuật toán dẫn xuất khóa và quá trình mã hóa được thực hiện bằng khóa chứ không phải mật khẩu. Cách duy nhất để sử dụng khóa được mã hóa là giải mã nó trước tiên, bạn cần biết mật khẩu mà nó được mã hóa để tạo ra cùng một khóa.
indiv

Tại sao tôi lại mã hóa tệp khóa cá nhân của mình? chúng không được xuất bản cho bất kỳ ai, do đó có tên. Hoặc là tôi sai?
phil294,

1
@Blauhirn: Bạn sẽ mã hóa tệp khóa cá nhân của mình vì lý do giống như bạn mã hóa bất kỳ tệp nào: bạn không muốn ai đó có được bản sao có thể đọc hoặc sử dụng nó. Việc bạn có nên mã hóa khóa cá nhân hay không tùy thuộc vào tầm quan trọng của khóa và mô hình mối đe dọa của bạn.
indiv 25/09/18

12

chỉnh sửa: nginx v1.7.3 đã thêm chỉ thị ssl_password_file đọc cụm mật khẩu từ một tệp được chỉ định thử từng cụm mật khẩu trên mã hóa-private.key của ngữ cảnh

indiv đúng rằng -nodesđối số có nghĩa là OpenSSL sẽ tạo private.key không được mã hóa ; nếu không, sẽ có một lời nhắc cụm mật khẩu để tạo mã hóa-private.key . xem req , pkcs12 , CA.pl

tuy nhiên, tôi cảm thấy mục đích (dành cho các lập trình viên) là vì:

  • Máy chủ HTTP (ví dụ: Apache , Nginx ) không thể đọc mã hóa-private.key mà không có cụm mật khẩu →
    • Tùy chọn A - mỗi khi máy chủ HTTP khởi động, phải cung cấp cụm mật khẩu cho khóa -private.key được mã hóa
    • Tùy chọn B - chỉ định ssl_password_file file.keys;trong http { }hoặc server { }ngữ cảnh. [tham khảo ]
    • Tùy chọn C - sử dụng -nodesđể tạo private.key mà không cần mã hóa

hữu ích: khóa private.key

  • {thêm máy chủ HTTP vào nhóm ssl-cert }
  • sudo chown root:ssl-cert private.key- ch ange own er of private.key cho người dùng root , nhóm ssl-cert
  • sudo chmod 640 private.key- thay đổi quyền truy cập private.key thành chủ sở hữu R / W, nhóm R
  • bây giờ, máy chủ HTTP sẽ có thể khởi động và đọc private.key chưa được mã hóa

Lựa chọn A

bảo mật mạnh mẽ hơn, nhưng khi máy chủ khởi động lại, phải nhập cụm mật khẩu theo cách thủ công cho khóa -private.key được mã hóa

Lựa chọn B

bảo mật trung bình và có thể cân bằng tốt giữa A / C

Lựa chọn C

bảo mật yếu hơn, nhưng KHÔNG được nhắc nhập cụm mật khẩu private.key chưa được mã hóa


xuất sắc giải thích
rizidoro

1
Nginx có thể đọc các phím tin được mã hóa từ phiên bản 1.7.3, xem: nginx.org/en/docs/http/...
5lava

2
Mục đích của việc đưa nginx và các phiên bản của nó vào cuộc thảo luận là gì? Ngoài ra, (B) và (C) cung cấp bảo mật tương đương (cụ thể là ACL hệ thống tệp). Sự cố bạn đang mô tả là Sự cố Lưu trữ Khoá Không Giám sát và nó là một sự cố không có giải pháp. Xem cuốn sách Bảo mật Kỹ thuật của Gutmann .
jww

@jww câu hỏi " mục đích là gì ...". Tôi đã xem xét ngữ cảnh của câu hỏi (QnA dành cho lập trình viên), mà tôi đã cố gắng chỉ ra thông qua "tuy nhiên, tôi cảm thấy mục đích (đối với lập trình viên) là vì:". đặc biệt liên quan đến bảo mật .. có thể là một cuộc thảo luận cho security.stackexchange.com
Jake Berger
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.