Tránh nhắc mật khẩu cho các khóa và lời nhắc cho thông tin DN


90

Tôi đang sử dụng mã sau đây để tạo khóa:

apt-get -qq -y install openssl;
mkdir -p /etc/apache2/ssl;
openssl genrsa -des3 -out server.key 1024;
openssl req -new -key server.key -out server.csr;
cp server.key server.key.org;
openssl rsa -in server.key.org -out server.key;
openssl x509 -req -days 12000 -in server.csr -signkey server.key -out server.crt;
mv server.crt  /etc/apache2/ssl/cert.pem;
mv server.key  /etc/apache2/ssl/cert.key;
rm -f server.key.orig;
rm -f server.csr

Tôi có hai câu hỏi:

  1. Làm cách nào tôi có thể bỏ qua lời nhắc mật khẩu? Nó sẽ được an toàn hợp lý cho tôi để làm như vậy? (vì trong đó không nên hết sức ngu ngốc như bất kỳ ai nên có thể hack chứng chỉ)

  2. Làm cách nào để tránh nhắc nhở cho tên quốc gia, tổ chức, v.v ... Tôi hy vọng tôi có thể cung cấp cho họ trên dấu nhắc lệnh (trang man chỉ hiển thị các tùy chọn cấp cao nhất cho OpenSSL)

Câu trả lời:


150

Chỉnh sửa: Đây là câu trả lời phổ biến nhất của tôi và đến nay đã được vài năm rồi nên tôi đã thêm một biến thể ECDSA. Nếu bạn có thể sử dụng ECDSA, bạn nên.


Bạn có thể cung cấp tất cả thông tin đó trên dòng lệnh.

Tạo một chứng chỉ không cần mật khẩu một bước:

Phiên bản RSA

openssl req \
    -new \
    -newkey rsa:4096 \
    -days 365 \
    -nodes \
    -x509 \
    -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com" \
    -keyout www.example.com.key \
    -out www.example.com.cert

Phiên bản ECDSA

openssl req \
    -new \
    -newkey ec \
    -pkeyopt ec_paramgen_curve:prime256v1 \
    -days 365 \
    -nodes \
    -x509 \
    -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com" \
    -keyout www.example.com.key \
    -out www.example.com.cert

Tất cả các tiểu ban openssl đều có trang người đàn ông của riêng họ. Xem man req.


Cụ thể giải quyết các câu hỏi của bạn và để rõ ràng hơn về chính xác các tùy chọn có hiệu lực:

  1. Các -nodestín hiệu cờ để không mã hóa phím, do đó bạn không cần mật khẩu. Bạn cũng có thể sử dụng -passout argcờ. Xem PASS PHRASE ARGUMENTStrong openssl(1)trang man để biết cách định dạng arg.

  2. Sử dụng -subjcờ bạn có thể chỉ định chủ đề (ví dụ ở trên).


3
Tuy nhiên, việc đọc nội dung qua "-subj" hoạt động rất tốt - đối với tôi - chỉ khi OPENSSL_CONF KHÔNG được đặt. IOW: nếu OPENSSL_CONF được đặt, OpenSSL sẽ thử đọc từ đó và bỏ qua đối số dòng lệnh "-subj". Mất một lúc để tìm hiểu.
oberstet

oberstet: Vâng, đó là sự thật.
bahamat

Có thể vượt qua khóa chủ đề từ stdin? Tôi đã thử "-key stdin", "-key fd: 1" và "-key -" .. không có may mắn.
oberstet

1
@JeremyBaker: Không, bạn sẽ cần một quy trình hai bước cho việc đó. Bỏ qua -x509-daysđể tạo CSR thay vì chứng chỉ, sau đó sử dụng phương thức ký CA thông thường của bạn.
bahamat

1
@jww - và thời điểm đó đã đến. Bắt đầu với Chrome v58, khi cố tải trang an toàn nhưng chứng chỉ không chứa chủ đề phù hợpAltName, nó hiển thị trang lỗi bảo mật với thông báo lỗi "NET :: ERR_CERT_COMMON_NAME_INVALID". Nhấp vào nút nâng cao sẽ hiển thị thông báo "... chứng chỉ bảo mật của nó là từ [Mất_subjectAltName]"
Phần mềm Insomniac

11

Không -passinlựa chọn làm thủ thuật cho bạn?

Với file:pathnamehình thức bạn có thể khá an toàn với quyền 600 cho tệp đó.


Saw tùy chọn trong trang người đàn ông. Có vẻ như tôi có thể có cụm mật khẩu theo cách đó mà không cần nhắc. Cảm ơn!

Và với -passin 'pass:YOUR_PASSWORD'? - doc: openssl.org/docs/man1.0.2/apps/ từ
andras.tim

5

Câu trả lời được chấp nhận cần một vài sửa chữa nhỏ. Dòng EC:

-newkey ec
-pkeyopt ec_paramgen_curve:prime256v1

nên là:

 -newkey ec \
 -pkeyopt ec_paramgen_curve:prime256v1 \

Trên MacOS - OpenSSL 1.0.2f được cài đặt qua brew Tôi đã xác minh câu trả lời được chấp nhận như được mô tả dưới đây

  • Để liệt kê các đường cong Elliptic có sẵn:

    $ openssl ecparam -list_curves
    
  • Để tạo một tệp chính:

    $ openssl ecparam -name secp256k1 -out secp256k1.pem
    
  • Để tạo chứng chỉ mà không cần mật khẩu nhắc:

    openssl req \
        -new \
        -newkey ec:secp256k1.pem \
        -days 365 \
        -nodes \
        -x509 \
        -subj "/C=US/ST=FL/L=Ocala/O=Home/CN=example.com" \
        -keyout server.key \
        -out server.crt
    
  • Để xem chứng chỉ:

    $ openssl x509 -noout -text -in server.crt
    

Điều này khác với câu trả lời được chấp nhận như thế nào?
Ramhound

1
Sự khác biệt quan trọng duy nhất là tôi liệt kê rõ ràng bước tạo tệp pem. Câu trả lời được chấp nhận thiếu hai ký tự \ và nó khiến tôi nghĩ rằng lệnh không chính xác.
Andrei Sura

1
Bạn có thể muốn đề cập đến thực tế đó. Nếu câu trả lời được chấp nhận thực sự không đầy đủ và thiếu các ký tự, điều quan trọng là làm nổi bật sự khác biệt và cách câu trả lời của bạn chứa thông tin quan trọng.
Ramhound

3

Hãy thử lệnh sau:

openssl genrsa -des3 -out user.key -passout pass:foo 1024

Phần bỏ qua là : -passout pass:foo.


2

@bahamat có một câu trả lời tuyệt vời. Thật không may, một số phiên bản của openssl gây ra lỗi khi cố gắng tạo chứng chỉ ECDSA bằng một lệnh. Lỗi xảy ra như sau:

routines:EVP_PKEY_CTX_ctrl:invalid operation:pmeth_lib.c:404

Tôi đã sử dụng openssl 1.0.1e-fipstrên CentOS 7.

Tạo chứng chỉ của bạn với 3 lệnh sau dường như hoạt động:

openssl ecparam -genkey -name prime256v1 -out key.pem
openssl req -new -key key.pem -out csr.pem -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com"
openssl req -x509 -days 365 -key key.pem -in csr.pem -out certificate.pem

Không phải dòng cuối cùng kết thúc với server.crt?
8/12/2016
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.