如何创建自己的证书链?


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存档检查页面:web.archive.org/web/20100504162138/http
//www.ibm.com/…– Iomanip

Answers:


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 2010年

3
@twk:请注意,这个问题还需要一个完整的答案步骤,即如何创建仅依赖于步骤3中创建的证书而不依赖于根证书的另一个证书。
quack 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.crtcrt_A.crtCA_key_you_created.key一起替换key_A.key

您的更改:

basicConstraints=CA:TRUE  # prev value was FALSE

表示您颁发的证书可用于签署其他证书。


thx,非常有帮助
flotto

1
什么是.crt文件?
MickyD '18 -10-1

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 : //stackoverflow.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'

使根ca和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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.