Openssl X509证书单元测试-我需要创建一个证书和一个包含它的CRL

Openssl X509证书单元测试-我需要创建一个证书和一个包含它的CRL,openssl,x509,Openssl,X509,好的,我有一个方法,可以传递一个CRL和一个证书。我使用它在应用程序运行时验证来自供应商的证书 最困难的部分是单元测试 我需要创建一个证书文件和一个CRL文件,然后我可以将其作为应用程序的资源分发,然后在单元测试期间传递它们 我也编写了单元测试,但使用了硬编码值-但现在我需要知道如何创建以下内容: 两张X509证书。 一个CRL 我需要CRL有两个X509证书之一的条目。这将允许我测试撤销结果,以及非撤销 我试过下面的指南,但安全性远远不是我的强项——我无法让它发挥作用 https://blog

好的,我有一个方法,可以传递一个CRL和一个证书。我使用它在应用程序运行时验证来自供应商的证书

最困难的部分是单元测试

我需要创建一个证书文件和一个CRL文件,然后我可以将其作为应用程序的资源分发,然后在单元测试期间传递它们

我也编写了单元测试,但使用了硬编码值-但现在我需要知道如何创建以下内容:

两张X509证书。 一个CRL

我需要CRL有两个X509证书之一的条目。这将允许我测试撤销结果,以及非撤销

我试过下面的指南,但安全性远远不是我的强项——我无法让它发挥作用

https://blog.didierstevens.com/2013/05/08/howto-make-your-own-cert-and-revocation-list-with-openssl/

Jamie Nguyen在创建证书颁发机构以及颁发证书和CRL方面有很好的指南,可以找到。这就是我在回答你的问题时所说的。如果你想知道这些命令的输出是什么样子的,我建议你访问他的网站。这里省略它们是为了使这个已经很长的帖子易于管理

基本上,我们需要做以下工作:

  • 创建自签名证书以充当证书颁发机构
  • 使用CA证书签署两个叶证书
  • 撤消其中一个叶证书
  • 发布CRL
创建自签名CA证书

首先,我们需要准备CA配置。如果您不想阅读他的教程,只需使用以下略为缩写的配置:

# OpenSSL root CA configuration file.

[ ca ]
default_ca = ca_default

[ ca_default ]
dir               = /etc/pki/CA
certs             = $dir/certs
crl_dir           = $dir/crl
new_certs_dir     = $dir/newcerts
database          = $dir/db/root-ca.index
serial            = $dir/db/root-ca.serial
RANDFILE          = $dir/private/.rand
private_key       = $dir/private/root-ca.key
certificate       = $dir/certs/root-ca.crt
crlnumber         = $dir/db/root-ca.crlnumber
crl               = $dir/crl/root-ca.crl
crl_extensions    = crl_ext
default_crl_days  = 180
default_md        = sha384
name_opt          = ca_default
cert_opt          = ca_default
default_days      = 375
preserve          = no
policy            = policy_loose

[ policy_strict ]
countryName             = match
stateOrProvinceName     = match
organizationName        = match
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional

[ policy_loose ]
countryName             = optional
stateOrProvinceName     = optional
localityName            = optional
organizationName        = optional
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional

[ req ]
default_bits        = 3072
distinguished_name  = req_distinguished_name
string_mask         = utf8only
default_md          = sha384
x509_extensions     = root_ca

[ req_distinguished_name ]
countryName                     = Country Name (2 letter code)
stateOrProvinceName             = State or Province Name
localityName                    = Locality Name
0.organizationName              = Organization Name
organizationalUnitName          = Organizational Unit Name
commonName                      = Common Name
emailAddress                    = Email Address
countryName_default             = US
stateOrProvinceName_default     = MD
localityName_default            =
0.organizationName_default      = LAB
organizationalUnitName_default  =
emailAddress_default            =

[ root_ca ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = critical, CA:true
keyUsage = critical, digitalSignature, cRLSign, keyCertSign

[ usr_cert ]
basicConstraints = CA:FALSE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = clientAuth, emailProtection
crlDistributionPoints = URI:http://pki.lab.local/int-ca.crl
authorityInfoAccess = caIssuers;URI:http://pki.lab.local/int-ca.crt

[ server_cert ]
basicConstraints = CA:FALSE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer:always
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
crlDistributionPoints = URI:http://pki.lab.local/int-ca.crl
authorityInfoAccess = caIssuers;URI:http://pki.lab.local/int-ca.crt

[ crl_ext ]
authorityKeyIdentifier=keyid:always
authorityInfoAccess = caIssuers;URI:http://pki.lab.local/int-ca.crt
这应该作为
openssl.cnf
放在工作目录中

您应该修改
dir=/etc/pki/CA
行以指向您将要使用的目录,如果您希望通过CDP启用撤销检查,还可以更改CDP URL以指向实际域

接下来,我们需要创建CA所需的一些文件和目录,然后为CA证书生成RSA私钥。注意:CA私钥将使用密码短语进行保护

mkdir db private certs crl newcerts csr & touch db/root-ca.index
echo 1000 > db/root-ca.serial & echo 1000 > db/root-ca.crlnumber
openssl genrsa -aes256 -out private/root-ca.key 4096
openssl ca -config openssl.cnf -revoke certs/test2.crt
现在我们需要使用新的私钥生成CA证书。系统将要求您输入创建私钥时输入的密码短语,然后提示您输入一些信息,如国家、州和通用名称。公共名称字段在这里很重要,对于这个测试,我只需要将
测试根CA

openssl req -config openssl.cnf -key private/root-ca.key \
    -new -x509 -days 3650 -sha256 -extensions root_ca \
    -out certs/root-ca.crt
命令成功完成后,您将在
certs/root-ca.crt
上看到一个新证书,您可以使用以下命令查看该证书:

openssl x509 -in certs/root-ca.crt -noout -text
创建叶证书

要创建叶证书(也称为最终实体证书),您需要为每个叶证书生成另一个私钥。我们将它们称为
test1
test2

openssl genrsa -aes256 -out private/test1.key 4096
openssl genrsa -aes256 -out private/test2.key 4096
对于其中的每一个,您将生成证书签名请求(CSR),CA将使用该请求生成实际的证书。当您创建CA证书时,将询问类似的问题。您可以使用
test1
test2
作为常用名称

openssl req -config openssl.cnf -key private/test1.key
    -new -sha256 -out csr/test1.req
openssl req -config openssl.cnf -key private/test2.key
    -new -sha256 -out csr/test2.req
您现在应该在
csr
目录中有两个证书请求。我们将使用这些来生成证书。您需要输入CA私钥密码短语来签署这些请求

openssl ca -config openssl.cnf -in csr/test1.req -out certs/test1.crt \
    -extensions server_cert -days 365 -notext -md sha256
openssl ca -config openssl.cnf -in csr/test2.req -out certs/test2.crt \
    -extensions server_cert -days 365 -notext -md sha256
现在,在
certs
目录中应该有两个闪亮的新叶证书。可以使用以下命令查看它们

openssl x509 -in certs/test1.crt -noout -text
openssl x509 -in certs/test2.crt -noout -text
撤销证书

现在是有趣的部分。撤销证书的过程类似于签名。我们将使用CA证书和私钥撤销
测试2
的叶子。以下命令将需要CA私钥密码短语

mkdir db private certs crl newcerts csr & touch db/root-ca.index
echo 1000 > db/root-ca.serial & echo 1000 > db/root-ca.crlnumber
openssl genrsa -aes256 -out private/root-ca.key 4096
openssl ca -config openssl.cnf -revoke certs/test2.crt
如果您好奇的话,
db/root-ca.index
文件现在应该在
test2
旁边显示第二个撤销时间戳,该文件到目前为止一直记录着我们颁发的证书的序列号和时间戳。这是一个普通的文本文件

发布CRL

现在,要生成CRL,我们只需执行以下操作(需要CA私钥密码短语):

查看CRL非常简单。使用下面的命令,您应该可以看到
test2
的序列号条目及其撤销的时间戳

openssl crl -in crl/root-ca.crl -noout -text
要验证证书是否已吊销,请使用以下命令:

cat certs/root-ca.crt crl/root-ca.crl > crl/crl-chain.pem
openssl verify -crl_check -CAfile crl/crl-chain.pem certs/test2.crt
将其用于测试2应返回吊销的证书状态。为测试1运行相同的comand应返回OK

总结

假设一切正常,最终结果应该是:

  • certs/root-CA.crt中的一个CA证书
  • certs/test1.crt中的一个好的叶子证书
  • certs/test2.crt中有一个已吊销的叶子证书
  • CRL/root-ca.CRL
注1:这都是假设您将在Linux机器上使用OpenSSL。如果您需要windows和
certutil
的说明,可以提供


注2:我在本指南中遗漏了许多与您的问题不直接相关的内容。如果您想了解有关此过程的更多详细信息,请再次参阅顶部的链接。

Jamie Nguyen提供了一个关于创建证书颁发机构以及颁发证书和CRL的优秀指南,您可以找到。这就是我在回答你的问题时所说的。如果你想知道这些命令的输出是什么样子的,我建议你访问他的网站。这里省略它们是为了使这个已经很长的帖子易于管理

基本上,我们需要做以下工作:

  • 创建自签名证书t