好的,所以我有一个方法可以传递CRL和证书。我用它在我的应用程序运行时验证来自供应商的证书。
最困难的部分是对该死的东西进行单元测试!
我需要创建一个证书文件和一个CRL文件,然后我可以将其作为资源与应用程序一起分发,然后在单元测试期间传递它们。
我也编写了单元测试,但是使用了硬编码值 - 但现在我需要知道如何创建以下内容:
两张X509证书。 一个CRL
我需要CRL为两个X509证书之一提供一个条目。这将允许我测试撤销结果,也可以测试非撤销。
我已经尝试了以下指南,但安全性远非我的强项 - 我无法让它发挥作用。
https://blog.didierstevens.com/2013/05/08/howto-make-your-own-cert-and-revocation-list-with-openssl/
答案 0 :(得分:1)
Jamie Nguyen有一个关于创建证书颁发机构和颁发证书和CRL的精彩指南,可以找到here。这是我在回答你的问题时会松散地提到的。如果您在任何时候对这些命令的输出看起来很好奇,我会将您引荐到他的网站。这里省略了它们以保持这个已经很长的帖子易于管理。
基本上我们需要做以下事情:
创建自签名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证书
要创建叶证书(也称为最终实体证书),您需要为每个证书生成另一个私钥。我们会称他们为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
运行相同的命令应该返回OK。
总结
假设一切正常,最终结果应为:
certs/root-ca.crt
certs/test1.crt
certs/test2.crt
crl/root-ca.crl
注1:这是假设您将在Linux机器上使用OpenSSL。如果您需要Windows的说明,可以提供certutil
。
注意2:我从本指南中遗漏了很多与您的问题没有直接关系的内容。如果您想了解有关此流程的更多详细信息,请再次向您推荐顶部发布的链接。