자체 인증서 체인을 만드는 방법은 무엇입니까?


62

테스트 목적으로 만 OCSP 응답자를 설정하고 싶습니다. 이를 위해서는 루트 인증서와 그로부터 생성 된 몇 가지 인증서가 있어야합니다.

openssl을 사용하여 자체 서명 된 인증서를 만들었습니다. 루트 인증서로 사용하고 싶습니다. 다음 단계는 파생 된 인증서를 만드는 것입니다. 그러나이 작업을 수행하는 방법에 대한 설명서를 찾을 수없는 것 같습니다. 누구든지이 정보를 어디서 찾을 수 있는지 알고 있습니까?

편집
후, 내 질문에 아직 완전히 대답하지 않았습니다. 문제를 명확히하기 위해 다음과 같이 인증서 체인을 나타냅니다.

루트-> 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 단계에서 만든 인증서에만 의존하고 루트 인증서는 아닌 다른 인증서를 만드는 방법입니다.
quack quixote

3
"CA 개인 키를로드 할 수 없습니다"로 마지막 단계에서 실패합니다. 키와 cert를 제공하여 어느 정도 얻을 수 openssl ca -in client.csr -out client.cer -cern ca.pem -keyfile ca.key있지만 demoCA디렉토리와 다양한 accouterments를 원합니다 .
Iiridayn

23
"일부 옵션을 추가해야 할 수도 있습니다 ..."는 실제로이 답변에서 유틸리티를 제거합니다.
Zach

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
    

    그래서 _B 및 *의 * _A로 교체에 CA_certificate_you_created.crt함께 crt_A.crtCA_key_you_created.key함께key_A.key

당신의 변화 :

basicConstraints=CA:TRUE  # prev value was FALSE

발급 한 인증서를 사용하여 다른 인증서에 서명 할 수 있습니다.


thx, 매우 도움이
flotto

1
.crt 파일은 무엇입니까?
MickyD

9

OpenSSL에는 Perl 스크립트 "CA.pl"이 포함되어있어 자체 서명 된 루트 CA 인증서와 일치하는 개인 키와 함께 서명 할 향후 인증서를 추적하는 데 도움이되는 몇 가지 간단한 파일 및 디렉토리를 제공합니다 (일명 문제) )를 루트 CA와 함께 사용하십시오. 또한 다른 키 페어 및 CSR (인증서 서명 요청)을 생성하고 해당 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 : //.com/questions/19665863/how-do-i-use-a-self-signed-certificate-for-a-https-node-js-server

Node.JS 용이지만 이 GitHub 저장소의 스크립트 는 openSLL 명령을 사용하여 루트 CA 인증서 및 도메인 인증서를 작성합니다.

다음을 사용하여 실행하십시오. 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.