Bagaimana cara membuat rantai sertifikat saya sendiri?

62

Saya ingin mengatur OCSP Responder saya sendiri (hanya untuk tujuan pengujian). Ini mengharuskan saya untuk memiliki sertifikat root dan beberapa sertifikat dihasilkan darinya.

Saya telah berhasil membuat sertifikat yang ditandatangani sendiri menggunakan openssl. Saya ingin menggunakannya sebagai sertifikat root. Langkah selanjutnya adalah membuat sertifikat yang diturunkan. Sepertinya saya tidak dapat menemukan dokumentasi tentang bagaimana melakukan ini. Adakah yang tahu di mana saya dapat menemukan informasi ini?

Sunting
Dalam retrospeksi, pertanyaan saya belum sepenuhnya dijawab. Untuk mengklarifikasi masalah saya akan mewakili rantai sertifikat saya seperti ini:

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

Saat ini saya dapat membuat sertifikat ROOT dan A, tetapi saya belum menemukan cara membuat rantai yang lebih panjang.

Perintah saya untuk membuat sertifikat root adalah:

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

Sertifikat A dibuat seperti ini:

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

Perintah ini secara implisit tergantung pada sertifikat root, yang untuk itu ia menemukan info yang diperlukan dalam file konfigurasi openssl.

Namun Sertifikat B hanya harus bergantung pada A, yang tidak terdaftar dalam file konfigurasi, sehingga perintah sebelumnya tidak akan berfungsi di sini.

Baris perintah apa yang harus saya gunakan untuk membuat sertifikat B dan seterusnya?

Sunting
Saya menemukan jawabannya di artikel ini . Sertifikat B (rantai A -> B) dapat dibuat dengan dua perintah ini:

# 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

Saya juga mengubah file openssl.cnf:

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

Pendekatan ini tampaknya bekerja dengan baik.

StackedCrooked
sumber
Tautan di bagian bawah di bagian edit rusak
antusiastastic
2
Hingga 2015 artikel yang disebutkan pada edit terakhir dari posting ini sudah mati. Jadi, Anda dapat memeriksa halaman melalui arsip web : web.archive.org/web/20100504162138/http://www.ibm.com/…
Iomanip

Jawaban:

28

Anda dapat menggunakan OpenSSL secara langsung.

  1. Buat kunci pribadi Otoritas Sertifikat (ini adalah kunci terpenting Anda):

    openssl req -new -newkey rsa:1024 -nodes -out ca.csr -keyout ca.key
    
  2. Buat sertifikat yang ditandatangani sendiri CA Anda:

    openssl x509 -trustout -signkey ca.key -days 365 -req -in ca.csr -out ca.pem
    
  3. Keluarkan sertifikat klien dengan terlebih dahulu membuat kunci, lalu minta (atau gunakan yang disediakan oleh sistem eksternal) kemudian tandatangani sertifikat menggunakan kunci pribadi CA Anda:

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

(Anda mungkin perlu menambahkan beberapa opsi karena saya menggunakan perintah ini bersama dengan file openssl.conf saya. Anda mungkin perlu mengatur file .conf Anda sendiri terlebih dahulu.)

twk
sumber
Terima kasih, instruksi Anda berfungsi setelah beberapa penyesuaian file openssl.conf saya.
StackedCrooked
3
@twk: perhatikan pertanyaan memiliki satu langkah lagi yang diperlukan untuk jawaban yang lengkap - bagaimana membuat sertifikat lain yang hanya bergantung pada sertifikat yang dibuat pada langkah 3, tetapi bukan sertifikat root.
quack quixote
3
Gagal pada langkah terakhir dengan "tidak dapat memuat kunci pribadi CA"; Saya bisa mendapatkan setengah jalan di sana dengan memasok kunci dan cert dengan openssl ca -in client.csr -out client.cer -cern ca.pem -keyfile ca.key, tetapi menginginkan demoCAdirektori dan berbagai perlengkapan.
Iiridayn
23
"Anda mungkin perlu menambahkan beberapa opsi ..." benar-benar menghapus utilitas dari jawaban ini.
Zach
14

Setelah Anda membuat CA Anda, Anda dapat menggunakannya untuk masuk sebagai berikut:

  • Buat kunci:

    openssl genrsa -out key_A.key  1024
    
  • Buat csr:

    openssl req -new -key key_A.key -out csr_A.csr
    You are about to be asked to enter information etc....
    
  • Tanda tangani:

    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
    

    dan seterusnya mengganti * _A dengan * _B dan CA_certificate_you_created.crtdengan crt_A.crtdan CA_key_you_created.keydengankey_A.key

Perubahan Anda:

basicConstraints=CA:TRUE  # prev value was FALSE

berarti bahwa sertifikat yang Anda terbitkan dapat digunakan untuk menandatangani sertifikat lain.

Mr_and_Mrs_D
sumber
thx, sangat membantu
flotto
1
File .crt apa?
MickyD
9

OpenSSL dilengkapi dengan skrip Perl "CA.pl" untuk membantu Anda membuat root CA cert yang ditandatangani sendiri , bersama dengan kunci pribadi yang cocok, ditambah beberapa file dan direktori sederhana untuk membantu melacak setiap sertifikat masa depan yang Anda tanda tangani (masalah alias ) dengan root CA. Ini juga membantu Anda menghasilkan pasangan kunci lainnya dan permintaan penandatanganan sertifikat (CSR) dan membantu Anda memproses CSR tersebut (yaitu, menerbitkan sertifikat untuk mereka), dan banyak lagi.

Perhatikan bahwa banyak produk memerlukan sertifikat CA untuk memuat atribut tertentu yang menandainya sebagai sertifikat CA, atau mereka tidak akan diterima sebagai penandatangan / penerbit valid dari sertifikat lain. Jika sertifikat yang ditandatangani sendiri yang Anda buat tidak mengandung atribut itu, Anda mungkin akan kesulitan mendapatkan perangkat lunak lain untuk memperlakukannya seperti sertifikat CA root yang valid.

Jika saya ingat dengan benar, sintaksnya berjalan seperti ini:

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    
Spiff
sumber
4
Ini sangat membantu. Di Ubuntu 14,04 saya menemukan file di/usr/lib/ssl/misc/CA.pl
Colin M
-1

Saya menemukan posting ini: https://stackoverflow.com/questions/19665863/how-do-i-use-a-self-signed-certificate-for-a-https-node-js-server

Ini untuk Node.JS tetapi skrip dalam repo GitHub ini menggunakan perintah openSLL untuk membuat root CA cert dan Domain cert.

Jalankan menggunakan: bash make-root-ca-and-certificates.sh 'example.com'

Atau untuk localhost menggunakan: bash make-root-ca-and-certificates.sh 'localhost'

make-root-ca-and-certificates.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
Ralph Bisschops
sumber