好的,所以我有一个方法,可以传递一个CRL和一个证书。我使用它来验证应用程序运行时来自供应商的证书。
最难的部分是单元测试这该死的东西!
我需要创建一个证书文件和一个CRL文件,然后我可以将它们作为资源与应用程序一起分发,然后在单元测试期间传递它们。
我还编写了单元测试,但是使用了硬编码的值--但是现在我需要知道如何创建以下内容:
两个X509证书。一次CRL
我需要CRL有两个X509证书之一的条目。这将允许我测试撤销结果,也可以不撤销.
我已经试过了下面的指南,但是安全还远远不是我的强项--而且我无法让它起作用。
https://blog.didierstevens.com/2013/05/08/howto-make-your-own-cert-and-revocation-list-with-openssl/发布于 2017-03-07 00:31:23
Jamie有一个关于创建证书颁发机构以及颁发证书和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创建叶子证书
要创建叶证书(也称为end实体证书),您需要为每个证书生成另一个私钥。我们叫他们test1和test2。
openssl genrsa -aes256 -out private/test1.key 4096
openssl genrsa -aes256 -out private/test2.key 4096为此,您将生成一个证书签名请求(CSR),CA将使用该请求生成实际证书。您将被问到与创建CA证书时类似的问题。您可以只使用Test 1和Test 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运行相同的comand应该返回OK。
包扎
假设一切正常工作,最终的结果应该是:
certs/root-ca.crt中的一个CA证书certs/test1.crt中的一个好的叶证书certs/test2.crt叶证书crl/root-ca.crl中的一个CRL注1:这都是假设您将在Linux机器上使用OpenSSL。如果您需要有关windows和certutil的说明,可以提供它们。
注2:我在本指南中遗漏了许多与你的问题无关的内容。如果你想了解这个过程的更多细节,我再一次向你推荐在顶部发布的链接。
https://stackoverflow.com/questions/42635007
复制相似问题