Làm thế nào để tạo chuỗi chứng chỉ của riêng tôi?


62

Tôi muốn thiết lập Phản hồi OCSP của riêng tôi (chỉ dành cho mục đích thử nghiệm). Điều này đòi hỏi tôi phải có chứng chỉ gốc và một vài chứng chỉ được tạo từ nó.

Tôi đã quản lý để tạo chứng chỉ tự ký bằng openssl. Tôi muốn sử dụng nó như chứng chỉ gốc. Bước tiếp theo sẽ là tạo các chứng chỉ dẫn xuất. Tôi dường như không thể tìm thấy tài liệu về cách làm điều này tuy nhiên. Có ai biết nơi tôi có thể tìm thấy thông tin này?

Chỉnh sửa
Nhìn lại, câu hỏi của tôi vẫn chưa được trả lời hoàn toàn. Để làm rõ vấn đề tôi sẽ đại diện cho chuỗi chứng chỉ của mình như thế này:

ROOT -> A -> B -> C -> ...

Tôi hiện có thể tạo chứng chỉ ROOT và A, nhưng tôi chưa tìm ra cách tạo chuỗi dài hơn.

Lệnh của tôi để tạo chứng chỉ gốc là:

openssl req -new -newkey rsa:1024 -nodes -out ca.csr -keyout ca.key
openssl x509 -trustout -signkey ca.key -days 365 -req -in ca.csr -out ca.pem

Chứng chỉ A được tạo như thế này:

openssl genrsa -out client.key 1024
openssl req -new -key client.key -out client.csr
openssl ca -in client.csr -out client.cer

Lệnh này hoàn toàn phụ thuộc vào chứng chỉ gốc mà nó tìm thấy thông tin bắt buộc trong tệp cấu hình openssl.

Chứng chỉ B tuy nhiên chỉ phải dựa vào A, không được đăng ký trong tệp cấu hình, vì vậy lệnh trước đó sẽ không hoạt động ở đây.

Tôi nên sử dụng dòng lệnh nào để tạo chứng chỉ B và hơn thế nữa?

Chỉnh sửa
Tôi tìm thấy câu trả lời trong bài viết này . Chứng chỉ B (chuỗi A -> B) có thể được tạo bằng hai lệnh sau:

# Create a certificate request
openssl req -new -keyout B.key -out B.request -days 365

# Create and sign the certificate
openssl ca -policy policy_anything -keyfile A.key -cert A.pem -out B.pem -infiles B.request

Tôi cũng đã thay đổi tệp openssl.cnf:

[ usr_cert ]
basicConstraints=CA:TRUE # prev value was FALSE

Cách tiếp cận này dường như đang hoạt động tốt.


Liên kết ở dưới cùng trong phần chỉnh sửa bị hỏng
nhiệt tình

2
Cho đến năm 2015, bài viết được đề cập trong lần chỉnh sửa cuối cùng của bài đăng này đã chết. Vì vậy, bạn có thể kiểm tra trang thông qua một kho lưu trữ web : web.archive.org/web/20100504162138/http://www.ibm.com/...
Iomanip

Câu trả lời:


28

Bạn có thể sử dụng OpenSSL trực tiếp.

  1. Tạo khóa riêng của Tổ chức phát hành chứng chỉ (đây là khóa quan trọng nhất của bạn):

    openssl req -new -newkey rsa:1024 -nodes -out ca.csr -keyout ca.key
    
  2. Tạo chứng chỉ tự ký CA của bạn:

    openssl x509 -trustout -signkey ca.key -days 365 -req -in ca.csr -out ca.pem
    
  3. Cấp chứng chỉ ứng dụng khách bằng cách trước tiên tạo khóa, sau đó yêu cầu (hoặc sử dụng chứng chỉ do hệ thống bên ngoài cung cấp) sau đó ký chứng chỉ bằng khóa riêng của CA của bạn:

    openssl genrsa -out client.key 1024
    openssl req -new -key client.key -out client.csr
    openssl ca -in client.csr -out client.cer
    

(Bạn có thể cần thêm một số tùy chọn khi tôi đang sử dụng các lệnh này cùng với tệp openssl.conf của tôi. Bạn có thể cần phải thiết lập tệp .conf của riêng mình trước.)


Cảm ơn, hướng dẫn của bạn đã hoạt động sau khi chỉnh sửa tệp openssl.conf của tôi.
StackedCrooking

3
@twk: lưu ý câu hỏi có thêm một bước cần thiết cho câu trả lời hoàn chỉnh - cách tạo chứng chỉ khác chỉ phụ thuộc vào chứng chỉ được tạo ở bước 3 chứ không phải chứng chỉ gốc.
quack quixote

3
Thất bại ở bước cuối cùng với "không thể tải khóa riêng CA"; Tôi có thể có được một phần ở đó bằng cách cung cấp khóa và chứng chỉ openssl ca -in client.csr -out client.cer -cern ca.pem -keyfile ca.key, nhưng nó muốn có một demoCAthư mục và nhiều đồ trang trí khác nhau.
Iiridayn

23
"Bạn có thể cần thêm một số tùy chọn ..." thực sự loại bỏ tiện ích khỏi câu trả lời này.
Zach

14

Khi bạn đã tạo CA, bạn có thể sử dụng nó để ký:

  • Tạo một khóa:

    openssl genrsa -out key_A.key  1024
    
  • Tạo một csr:

    openssl req -new -key key_A.key -out csr_A.csr
    You are about to be asked to enter information etc....
    
  • Kí tên :

    openssl x509 -req -days 365 -in csr_A.csr -CA CA_certificate_you_created.crt \
    -CAkey CA_key_you_created.key -set_serial 01 -out crt_A.crt
    

    và cứ thế thay thế * _A bằng * _B và CA_certificate_you_created.crtbằng crt_A.crtCA_key_you_created.keyvớikey_A.key

Thay đổi của bạn:

basicConstraints=CA:TRUE  # prev value was FALSE

có nghĩa là các chứng chỉ bạn cấp có thể được sử dụng để ký các chứng chỉ khác.


thx, rất hữu ích
flotto

1
Tập tin .crt nào?
MickyD

9

OpenSSL đi kèm với tập lệnh Perl "CA.pl" để giúp bạn tạo chứng chỉ CA gốc tự ký , cùng với khóa riêng phù hợp, cùng với một vài tệp và thư mục đơn giản để giúp theo dõi bất kỳ thông tin nào trong tương lai bạn ký (còn gọi là vấn đề ) với CA gốc đó. Nó cũng giúp bạn tạo các cặp khóa và yêu cầu ký chứng chỉ (CSR) khác và giúp bạn xử lý các CSR đó (nghĩa là phát hành certs cho chúng), v.v.

Lưu ý rằng nhiều sản phẩm yêu cầu CA certs phải chứa một thuộc tính nhất định đánh dấu chúng là certs CA, hoặc chúng sẽ không được chấp nhận là người ký / phát hành hợp lệ của các certs khác. Nếu chứng chỉ tự ký mà bạn đã tạo không chứa thuộc tính đó, bạn có thể gặp khó khăn khi lấy phần mềm khác để coi nó như chứng chỉ CA gốc hợp lệ.

Nếu tôi nhớ lại chính xác, cú pháp sẽ giống như thế này:

CA.pl -newca    # Create a new root CA  

CA.pl -newreq   # Create a new CSR

CA.pl -sign     # Sign a CSR, creating a cert  

CA.pl -pkcs12   # Turn an issued cert, plus its matching private key and trust chain, into a .p12 file you can install on another machine    

4
Điều này rất hữu ích. Trên Ubuntu 14.04, tôi tìm thấy tệp tại/usr/lib/ssl/misc/CA.pl
Colin M

-1

Tôi tìm thấy bài đăng này: https://stackoverflow.com/questions/19665863/how-do-i-use-a-elf-sign-cert ve-for-a-https-node-js-server

Nó dành cho Node.JS nhưng tập lệnh trong repo GitHub này sử dụng các lệnh openSLL để tạo chứng chỉ CA gốc và chứng chỉ miền.

Chạy bằng cách sử dụng: bash make-root-ca-and-certificates.sh 'example.com'

Hoặc cho localhost bằng cách sử dụng: bash make-root-ca-and-certificates.sh 'localhost'

make-root-ca-and-certert.sh

#!/bin/bash
FQDN=$1

# make directories to work from
mkdir -p certs/{server,client,ca,tmp}

# Create your very own Root Certificate Authority
openssl genrsa \
  -out certs/ca/my-root-ca.key.pem \
  2048

# Self-sign your Root Certificate Authority
# Since this is private, the details can be as bogus as you like
openssl req \
  -x509 \
  -new \
  -nodes \
  -key certs/ca/my-root-ca.key.pem \
  -days 1024 \
  -out certs/ca/my-root-ca.crt.pem \
  -subj "/C=US/ST=Utah/L=Provo/O=ACME Signing Authority Inc/CN=example.com"

# Create a Device Certificate for each domain,
# such as example.com, *.example.com, awesome.example.com
# NOTE: You MUST match CN to the domain name or ip address you want to use
openssl genrsa \
  -out certs/server/privkey.pem \
  2048

# Create a request from your Device, which your Root CA will sign
openssl req -new \
  -key certs/server/privkey.pem \
  -out certs/tmp/csr.pem \
  -subj "/C=US/ST=Utah/L=Provo/O=ACME Tech Inc/CN=${FQDN}"

# Sign the request from Device with your Root CA
# -CAserial certs/ca/my-root-ca.srl
openssl x509 \
  -req -in certs/tmp/csr.pem \
  -CA certs/ca/my-root-ca.crt.pem \
  -CAkey certs/ca/my-root-ca.key.pem \
  -CAcreateserial \
  -out certs/server/cert.pem \
  -days 500

# Create a public key, for funzies
# see https://gist.github.com/coolaj86/f6f36efce2821dfb046d
openssl rsa \
  -in certs/server/privkey.pem \
  -pubout -out certs/client/pubkey.pem

# Put things in their proper place
rsync -a certs/ca/my-root-ca.crt.pem certs/server/chain.pem
rsync -a certs/ca/my-root-ca.crt.pem certs/client/chain.pem
cat certs/server/cert.pem certs/server/chain.pem > certs/server/fullchain.pem
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.