2017-03-06 34 views
0

OK了CRL,所以我必须是能够通过的CRL和证书的方法。我用它在我的应用程序运行时验证来自供应商的证书。X509证书的单元测试 - 我需要创建一个证书,并具有其

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

我需要创建一个证书文件,和CRL文件,我可以然后分发作为与应用程序的资源,然后在单元测试过程中通过它们英寸

我有单元测试也写,而是用硬编码值 - 但现在我需要知道如何创建以下文件:

2个X509证书。 一个CRL

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

我曾尝试下面的指南,但安全性远我的强项 - 我不能让它开始工作。

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

Stack Overflow是编程和开发问题的网站。这个问题似乎与题目无关,因为它不涉及编程或开发。请参阅帮助中心的[我可以询问哪些主题](http://stackoverflow.com/help/on-topic)。也许[超级用户](http://superuser.com/)或[Unix&Linux堆栈交换](http://unix.stackexchange.com/)会是一个更好的地方。另请参阅[我在哪里发布有关Dev Ops的问题?](http://meta.stackexchange.com/q/134306) – jww

+0

另请参阅[如何使用您的证书颁发机构签署证书签名请求](http:// stackoverflow .com/a/21340898/608639)和[如何使用openssl创建自签名证书?](http://stackoverflow.com/q/10175812/608639) – jww

回答

0

杰米·阮对创建一个证书颁发机构和颁发证书和CRL,可以在这里发现了一个伟大指南:https://jamielinux.com/docs/openssl-certificate-authority/这是我会是什么松散指在回答你的问题。如果您在任何时候都很好奇这些命令的输出是什么样子的话,我会将您引用到他的网站。他们在这里被忽略,以保持这个已经很长的后期管理。

基本上我们需要做到以下几点:

  • 创建一个自签名证书作为证书颁发机构
  • 使用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  = int_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 

创建叶证书

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

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

对于其中的每一个,您都将生成CA将用于生成实际证书的证书签名请求(CSR)。当你创建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 -in csr/test1.req -out certs/test1.crt \ 
    -extensions server_cert -days 365 -notext -md sha256 
openssl ca -config -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 opnessl.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。

的总结,

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

  • 一个CA证书在certs/root-ca.crt
  • 一个很好的叶证书在certs/test1.crt
  • 一个被撤销的叶证书在certs/test2.crt
  • One CRL i n crl/root-ca.crl

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

注2:我从本指南中省略了很多与您的问题没有直接关系的指南。如果你想了解这个过程的更多细节,我会再次引用你在顶部发布的链接。