จะสร้างห่วงโซ่ใบรับรองของตัวเองได้อย่างไร


62

ฉันต้องการตั้งค่า OCSP Responder ของตัวเอง (เพื่อจุดประสงค์ในการทดสอบ) สิ่งนี้ต้องการให้ฉันมีใบรับรองรูทและใบรับรองไม่กี่รายการที่สร้างขึ้นจากมัน

ฉันจัดการเพื่อสร้างใบรับรองที่ลงชื่อด้วยตัวเองโดยใช้ openssl ฉันต้องการใช้เป็นใบรับรองรูท ขั้นตอนต่อไปคือการสร้างใบรับรองที่ได้รับ ฉันไม่สามารถหาเอกสารเกี่ยวกับวิธีการทำเช่นนี้ได้ ไม่มีใครรู้ว่าฉันสามารถหาข้อมูลนี้ได้ที่ไหน?

แก้ไข
ในการหวนกลับคำถามของฉันยังไม่ได้ตอบอย่างสมบูรณ์ เพื่อชี้แจงปัญหาฉันจะเป็นตัวแทนของห่วงโซ่ใบรับรองของฉันเช่นนี้:

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

ขณะนี้ฉันสามารถสร้างใบรับรอง ROOT และ A แต่ฉันไม่พบวิธีการสร้างเครือข่ายที่ยาวขึ้น

คำสั่งของฉันสำหรับการสร้างใบรับรองหลักคือ:

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

สร้างใบรับรอง A ดังนี้:

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

คำสั่งนี้ขึ้นอยู่กับใบรับรองรูทซึ่งจะค้นหาข้อมูลที่ต้องการในไฟล์กำหนดค่า openssl โดยปริยาย

อย่างไรก็ตามใบรับรอง B ต้องพึ่งพา A เท่านั้นซึ่งไม่ได้ลงทะเบียนในไฟล์กำหนดค่าดังนั้นคำสั่งก่อนหน้านี้จะไม่ทำงานที่นี่

บรรทัดคำสั่งใดที่ฉันควรใช้เพื่อสร้างใบรับรอง B และอื่น ๆ

แก้ไข
ผมพบคำตอบในบทความนี้ ใบรับรอง B (เชน A -> B) สามารถสร้างขึ้นได้ด้วยสองคำสั่ง:

# 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

ฉันยังเปลี่ยนไฟล์ openssl.cnf ด้วย:

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

วิธีการนี้ดูเหมือนว่าจะทำงานได้ดี


ลิงค์ที่อยู่ด้านล่างในส่วนแก้ไขใช้งานไม่ได้
กระตือรือร้น

2
ถึงปี 2015 บทความที่กล่าวถึงในการแก้ไขล่าสุดของโพสต์นี้จะตาย ดังนั้นคุณสามารถตรวจสอบหน้าเว็บผ่านเว็บเก็บถาวร : web.archive.org/web/20100504162138/http://www.ibm.com/…
Iomanip

คำตอบ:


28

คุณสามารถใช้ OpenSSL โดยตรง

  1. สร้างคีย์ส่วนตัวของผู้ให้บริการออกใบรับรอง (นี่คือกุญแจสำคัญที่สุดของคุณ):

    openssl req -new -newkey rsa:1024 -nodes -out ca.csr -keyout ca.key
    
  2. สร้างใบรับรองที่ลงนามด้วยตนเอง CA ของคุณ:

    openssl x509 -trustout -signkey ca.key -days 365 -req -in ca.csr -out ca.pem
    
  3. ออกใบรับรองไคลเอ็นต์โดยสร้างคีย์ก่อนจากนั้นจึงร้องขอ (หรือใช้ใบรับรองที่จัดทำโดยระบบภายนอก) จากนั้นลงชื่อใบรับรองโดยใช้คีย์ส่วนตัวของ CA ของคุณ:

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

(คุณอาจต้องเพิ่มตัวเลือกบางตัวในขณะที่ฉันกำลังใช้คำสั่งเหล่านี้พร้อมกับไฟล์ openssl.conf ของฉันคุณอาจต้องตั้งค่าไฟล์. conf ของคุณเองก่อน)


ขอบคุณคำแนะนำของคุณทำงานหลังจากปรับแต่งไฟล์ openssl.conf ของฉัน
StackedCrooked

3
@twk: โปรดทราบว่าคำถามมีอีกขั้นตอนหนึ่งที่จำเป็นสำหรับคำตอบที่สมบูรณ์ - วิธีสร้างใบรับรองอื่นที่ขึ้นอยู่กับใบรับรองที่สร้างในขั้นตอนที่ 3 เท่านั้น แต่ไม่ใช่ใบรับรองรูท
ต้มตุ๋น quixote

3
ล้มเหลวในขั้นตอนสุดท้ายด้วย "ไม่สามารถโหลดคีย์ส่วนตัวของ CA"; ฉันสามารถไปได้โดยการจัดหากุญแจและรับรองด้วยopenssl ca -in client.csr -out client.cer -cern ca.pem -keyfile ca.keyแต่มันต้องการdemoCAไดเรกทอรีและอุปกรณ์เสริมต่างๆ
Iiridayn

23
"คุณอาจต้องเพิ่มตัวเลือกบางอย่าง ... " ลบยูทิลิตี้ออกจากคำตอบนี้จริงๆ
ซัค

14

เมื่อคุณสร้าง CA ของคุณแล้วคุณสามารถใช้เพื่อเซ็นชื่อได้ดังนี้:

  • สร้างรหัส:

    openssl genrsa -out key_A.key  1024
    
  • สร้าง csr:

    openssl req -new -key key_A.key -out csr_A.csr
    You are about to be asked to enter information etc....
    
  • เซ็นชื่อ:

    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
    

    และอื่น ๆ แทน * _A ด้วย * _B และCA_certificate_you_created.crtด้วยcrt_A.crtและCA_key_you_created.keyด้วยkey_A.key

การเปลี่ยนแปลงของคุณ:

basicConstraints=CA:TRUE  # prev value was FALSE

หมายความว่าคุณสามารถใช้ใบรับรองที่คุณออกเพื่อลงชื่อใบรับรองอื่น ๆ


ขอบคุณมีประโยชน์มาก
flotto

1
ไฟล์. crt คืออะไร
MickyD

9

OpenSSL มาพร้อมกับสคริปต์ Perl "CA.pl" เพื่อช่วยคุณสร้างใบรับรองCA root ที่ลงนามเองพร้อมกับคีย์ส่วนตัวที่ตรงกันรวมถึงไฟล์และไดเรกทอรีง่ายๆสองสามไฟล์ที่จะช่วยติดตามรายการที่คุณลงชื่อในอนาคต ) ด้วยรูต CA นั้น นอกจากนี้ยังช่วยให้คุณสร้างคู่คีย์อื่น ๆ และคำขอลงนามใบรับรอง (CSRs) และช่วยคุณประมวลผล CSR เหล่านั้น (นั่นคือออกใบรับรองสำหรับพวกเขา) และอีกมากมาย

โปรดทราบว่าผลิตภัณฑ์จำนวนมากจำเป็นต้องมีใบรับรอง CA เพื่อให้มีแอตทริบิวต์บางอย่างที่ทำเครื่องหมายว่าเป็นใบรับรอง CA มิเช่นนั้นจะไม่ได้รับการยอมรับว่าเป็นผู้ลงนาม / ผู้ออกใบรับรองที่ถูกต้องของใบรับรองอื่น ๆ หากใบรับรองที่ลงนามด้วยตนเองที่คุณสร้างไม่มีแอตทริบิวต์นั้นคุณอาจมีปัญหาในการรับซอฟต์แวร์อื่น ๆ เพื่อใช้งานเหมือนใบรับรอง CA ที่รูทที่ถูกต้อง

ถ้าฉันจำได้อย่างถูกต้องไวยากรณ์จะเป็นดังนี้:

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
สิ่งนี้มีประโยชน์ บน Ubuntu 14.04 ฉันพบไฟล์ที่/usr/lib/ssl/misc/CA.pl
Colin M

-1

ฉันพบโพสต์นี้: https://stackoverflow.com/questions/19665863/how-do-i-use-a-self-signed-certificate-for-a-https-node-js-server

มันมีไว้สำหรับ Node.JS แต่สคริปต์ในGitHub repo นี้ใช้คำสั่ง openSLL เพื่อสร้างรูต CA cert และ Domain cert

เรียกใช้โดยใช้: bash make-root-ca-and-certificates.sh 'example.com'

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