首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >X509证书单元测试-我需要创建一个证书和一个包含它的CRL。

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

Stack Overflow用户
提问于 2017-03-06 20:32:54
回答 1查看 3K关注 0票数 1

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

最难的部分是单元测试这该死的东西!

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

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

两个X509证书。一次CRL

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

我已经试过了下面的指南,但是安全还远远不是我的强项--而且我无法让它起作用。

代码语言:javascript
复制
https://blog.didierstevens.com/2013/05/08/howto-make-your-own-cert-and-revocation-list-with-openssl/
EN

回答 1

Stack Overflow用户

发布于 2017-03-07 00:31:23

Jamie有一个关于创建证书颁发机构以及颁发证书和CRL的很好的指南,可以找到这里。这就是我在回答你的问题时大概要提到的问题。如果您在任何时候都想知道这些命令的输出是什么样子的话,我建议您访问他的站点。这里省略了它们,以使这个已经很长的帖子易于管理。

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

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

创建自签名CA证书

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

代码语言:javascript
复制
# 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私钥将使用密码保护。

代码语言:javascript
复制
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放在其中。

代码语言:javascript
复制
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上看到一个新的证书,您可以使用以下命令查看该证书:

代码语言:javascript
复制
openssl x509 -in certs/root-ca.crt -noout -text

创建叶子证书

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

代码语言:javascript
复制
openssl genrsa -aes256 -out private/test1.key 4096
openssl genrsa -aes256 -out private/test2.key 4096

为此,您将生成一个证书签名请求(CSR),CA将使用该请求生成实际证书。您将被问到与创建CA证书时类似的问题。您可以只使用Test 1Test 2作为常用的名称。

代码语言:javascript
复制
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私钥密码以对这些请求进行签名。

代码语言:javascript
复制
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目录中有两个闪亮的新叶证书。可以使用以下命令查看它们。

代码语言:javascript
复制
openssl x509 -in certs/test1.crt -noout -text
openssl x509 -in certs/test2.crt -noout -text

撤销证书

现在来了有趣的部分。撤销证书的过程类似于签名。我们将使用CA证书和私钥来撤销Test 2的叶子。下面的命令将需要CA私钥密码。

代码语言:javascript
复制
openssl ca -config openssl.cnf -revoke certs/test2.crt

如果您好奇的话,到目前为止一直记录我们发布的证书的序列号和时间戳的db/root-ca.index文件现在应该在Test 2旁边显示第二个吊销时间戳。这是一个普通的文本文件。

发布CRL

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

代码语言:javascript
复制
openssl ca -config openssl.cnf -gencrl -out crl/root-ca.crl

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

代码语言:javascript
复制
openssl crl -in crl/root-ca.crl -noout -text

若要验证证书已被撤销,请使用以下命令:

代码语言:javascript
复制
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运行相同的comand应该返回OK。

包扎

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

  • certs/root-ca.crt中的一个CA证书
  • certs/test1.crt中的一个好的叶证书
  • 一份被撤销的certs/test2.crt叶证书
  • crl/root-ca.crl中的一个CRL

注1:这都是假设您将在Linux机器上使用OpenSSL。如果您需要有关windows和certutil的说明,可以提供它们。

注2:我在本指南中遗漏了许多与你的问题无关的内容。如果你想了解这个过程的更多细节,我再一次向你推荐在顶部发布的链接。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42635007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档