介绍一般我们使用的证书都是由第三方权威机构颁发的。如果我们有一个新的https网站,我们需要申请一个全球认可的证书。证书,以便我们的网站可以无障碍访问。如果在某些情况下,我们的网站或系统不是公开的,又需要使用tls协议,那么我们就需要自己搭建一个CA服务器。这样的CA服务器称为私有CA。熟悉证书的朋友可能会说,为什么不用自签名证书呢?也可以达到安全通信的目的。这是因为自签名证书功能有限,不具备CRL和OCSP的能力,使用起来不是很方便。所以我们需要一套完整有效的CA颁发体系,这也是我们需要建设私有CA的原因。构建根CA在构建根CA之前,我们需要创建几个合适的目录来保存CA相关信息,例如我们需要一个目录certs来保存证书,一个地方来保存keys密钥,以及一个CA数据库db。其中db需要一个index文件,serial文件和crlnumber文件。我们使用如下命令创建对应的文件和目录:mkdircertsdbkeystouchdb/indexopensslrand-hex16>db/serialecho1001>db/crlnumber目录创建完成后,我们还需要一个非常重要的rootca配置文件。以后可以根据这个配置文件创建CA相关的信息。一般情况下,CA配置文件是不需要的,只有当我们需要创建比较复杂的CA时,才需要使用ca配置文件。下面是一个CA配置文件的例子:[default]name=root-cadomain_suffix=flydean.comdefault_ca=ca_configname_opt=utf8,esc_ctrl,multiline,lname,align[ca_config]database=db/indexserial=db/serialcrlnumber=db/crlnumbercertificate=root-ca.crtprivate_key=keys/root-ca.keyRANDFILE=keys/randomnew_certs_dir=certsunique_subject=nocopy_extensions=nonedefault_days=365default_crl_days=100default_md=sha256policy=ca_policy[ca_policy]countryName=matchstateOrProvinceName=optionalorganizationName=matchorganizationalUnitName=optionalremailcommonName=optionalremailcommonName=[suppliededefault_bits=4096encrypt_key=yesdefault_md=sha256utf8=yesstring_mask=utf8onlyprompt=nodistinguished_name=ca_distreq_extensions=ca_req_ext[ca_dist]countryName="CN"organizationName="flydean"commonName="RootCA"[ca_req_ext]basicConstraints=critical,CA:truekeyUsage=critical,keyCertSign,cRLSignsubjectKeyIdentifier=hash[sub_ca_ext]authorityInfoAccess=@issuer_infoauthorityKeyIdentifier=keyid:alwaysbasicConstraints=critical,CA:true,pathlen:0crlDistributionPoints=@crl_infoextendedKeyUsage=clientAuth,serverAuthkeyUsage=critical,keyCertSign,cRLSignsubjectKeyIdentifier=hash[crl_info]URI.0=http://crl3.digicert.com/DigiCertTLSRSASHA2562020CA1-4.crl[issuer_info]caIssuers;URI.0=http://cacerts.digicert.com/DigiCertTLSRSASHA2562020CA1-1.crtOCSP;URI.0=http://ocsp.digicert.com[ocsp_ext]authorityKeyIdentifier=keyid:alwaysbasicConstraints=critical,CA:falseextendedKeyUsage=OCSSPigningnoCheck=yeskeyUsage=critical,digitalSignaturesubjectKeyIdentifier=hash生成根CA有了上面的配置文件和目录信息,就可以生成根CA了。首先我们需要创建私钥和rootca的csr文件如下:opensslreq-new-configroot-ca.conf-outroot-ca.csr-keyoutkeys/root-ca.key接下来我们创建一个自签名证书,这里我们需要使用配置文件的ca_req_ext部分:opensslca-selfsign-configroot-ca.conf-inroot-ca.csr-outroot-ca.crt-extensionsca_req_ext运行这条命令后,我们将在certs文件夹中创建一个自签名证书文件。另外,在db中的index文件中也写入了如下内容:V230501041451Z4445DE5C0285EAEF2E58757D5CB1E949unknown/C=CN/O=flydean/CN=RootCA这是一个文本文件,存放生成的证书Index,其中的字段证书按制表符划分。第一个字段V表示valid,表示有效。该字段还可以有其他几个值,比如R表示已撤销,E表示已过期。第二个字段是到期时间,格式为YYMMDDHHMMSSZ。第三个字段是撤销日期,如果为空,则表示没有撤销。第四个字段是序列号,也就是生成的CA名称。第五个字段是文件所在位置,unknown表示未知。最后一个字段是这个证书的名称,用来区别于其他证书。使用CRL一旦我们有了root-ca.conf,我们就可以用它来创建一个CRL:opensslca-gencrl-configroot-ca.conf-outroot-ca.crl现在生成的root-ca.crl文件没有任何证书信息。如果我们要吊销一个颁发的CA,我们可以使用如下命令:opensslca-configroot-ca.conf-revokecerts/torevoke.pem-crl_reasonunspecified在吊销中指定要吊销的证书。这里需要注意的是,我们需要指定crl_reason,crl_reason可以是以下值:unspecifiedkeyCompromiseCACompromiseaffiliationChangedsupersededcessationOfOperationcertificateHoldremoveFromCRLusingOSCP对于OSCP,需要一个OCSPresponder来响应OCSP请求。OCSP响应者和CA本身是不一样的,需要单独创建。首先,我们创建OCSP响应者的密钥和证书请求CSR:opensslreq-new-newkeyrsa:2048-keyoutkeys/root-ocsp.key-outroot-ocsp.csr当然,输入必要的参数后,可以生成密钥和CSR。接下来,我可以使用根CA和root-ocsp.csr来颁发OCSP证书,这里我们需要使用配置文件中的ocsp_ext部分。opensslca-configroot-ca.conf-inroot-ocsp.csr-outroot-ocsp.crt-extensionsocsp_ext-days10以上命令为OCSP响应器生成有效期为10天的证书。有了证书,我们就可以轻松构建本地OCSP响应器,如下所示:opensslocsp-port9000-indexdb/index-rsignerroot-ocsp.crt-rkeykeys/root-ocsp.key-CAroot-ca。crt-textEnterpassphraseforkeys/root-ocsp.key:WaitingforOCSPclientconnections...所以我们启动一个OCSP服务器。另开一个窗口,执行如下命令请求OCSP:opensslocsp-issuerroot-ca.crt-CAfileroot-ca.crt-certroot-ocsp.crt-urlhttp://127.0.0.1:9000得到如下内容结果:ResponseverifyOKroot-ocsp.crt:goodThisUpdate:May108:09:312022GMT这意味着OCSP响应器已经构建成功。这里启动的是本地服务,在正式环境下可以考虑迁移到单独的服务器上。小结使用上面的命令,我们搭建了一个私有CA服务,以及对应的OCSP,openssl非常强大,基本上拿它做什么都行。更多内容请参考http://www.flydean.com/45-openssl-private-ca/最流行的解读,最深刻的干货,最简洁的教程,很多不欢迎你关注我的公众号:《程序那些事》,懂技术,更懂你!
