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

时间:2017-03-06 20:32:54

标签: openssl x509

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

最困难的部分是对该死的东西进行单元测试!

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

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

两张X509证书。 一个CRL

我需要CRL为两个X509证书之一提供一个条目。这将允许我测试撤销结果,也可以测试非撤销。

我已经尝试了以下指南,但安全性远非我的强项 - 我无法让它发挥作用。

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

1 个答案:

答案 0 :(得分:1)

Jamie Nguyen有一个关于创建证书颁发机构和颁发证书和CRL的精彩指南,可以找到here。这是我在回答你的问题时会松散地提到的。如果您在任何时候对这些命令的输出看起来很好奇,我会将您引荐到他的网站。这里省略了它们以保持这个已经很长的帖子易于管理。

基本上我们需要做以下事情:

  • 创建自签名证书以充当证书颁发机构
  • 使用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

现在我们需要使用新私钥生成CA证书。您将被要求输入您在创建私钥时输入的密码,然后提示您输入一些信息,例如国家/地区,州和公用名。公共名称字段在这里很重要,对于这个测试,我只是放Test Root 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

创建Leaf证书

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

openssl genrsa -aes256 -out private/test1.key 4096
openssl genrsa -aes256 -out private/test2.key 4096

对于其中每一项,您将生成证书签名请求(CSR),CA将使用该证书来生成实际证书。您在创建CA证书时会被问到类似的问题。您可以使用Test 1Test 2作为通用名称。

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证书和私钥来撤销Test 2的叶子。以下命令将需要CA私钥密码。

openssl ca -config openssl.cnf -revoke certs/test2.crt

如果您感到好奇,db/root-ca.index文件(此时已经记录了我们颁发的证书的序列号和时间戳)现在应该在Test 2旁边显示第二个撤销时间戳。这是一个普通的文本文件。

发布CRL

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

openssl ca -config openssl.cnf -gencrl -out crl/root-ca.crl

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

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

Test 2使用此选项应返回已撤销的证书状态。为Test 1运行相同的命令应该返回OK。

总结

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

  • certs/root-ca.crt
  • 中的一个CA证书
  • certs/test1.crt
  • 中的一个优质叶证书
  • certs/test2.crt
  • 中的一个已撤销的叶证书
  • crl/root-ca.crl
  • 中的一个CRL

注1:这是假设您将在Linux机器上使用OpenSSL。如果您需要Windows的说明,可以提供certutil

注意2:我从本指南中遗漏了很多与您的问题没有直接关系的内容。如果您想了解有关此流程的更多详细信息,请再次向您推荐顶部发布的链接。