简介
个别状况下咱们应用的证书都是由第三方权威机构来颁发的,如果咱们有一个新的https网站,咱们须要申请一个世界范畴内都取得认可的证书,这样咱们的网站能力被无障碍的拜访。
如果在某些状况下,咱们的网站或者零碎并不是公开的,然而也须要应用tls协定的话,那么就须要本人搭建一个CA服务器。这样的CA服务器就叫做private CA。
相熟证书的敌人可能会说了,为什么不应用自签名证书呢?也能够达到平安通信的目标。
这是因为自签名证书的作用比拟无限,它没有CRL和OCSP的能力,并且应用起来也不是很不便。所以咱们须要一整套无效的CA签发体系,这也是咱们须要搭建private CA的目标。
搭建root CA
在搭建root CA之前咱们须要创立几个适合的目录来保留CA的相干信息,比方咱们须要一个保留证书的目录certs,一个保留密钥的中央keys,一个CA数据库db。
其中db须要一个index文件,serial文件和crlnumber文件。
咱们用上面的命令创立对应的文件和目录:
mkdir certs db keys
touch db/index
openssl rand -hex 16 > db/serial
echo 1001 > db/crlnumber
目录建好之后,咱们还须要一个十分重要的root ca配置文件。后续能够依据这个配置文件来创立CA相干的信息。
个别状况下CA配置文件是不须要的,只有咱们须要创立比较复杂CA的状况下才须要应用ca配置文件。
上面是一个CA配置文件的例子:
[default]
name = root-ca
domain_suffix = flydean.com
default_ca = ca_config
name_opt = utf8,esc_ctrl,multiline,lname,align
[ca_config]
database = db/index
serial = db/serial
crlnumber = db/crlnumber
certificate = root-ca.crt
private_key = keys/root-ca.key
RANDFILE = keys/random
new_certs_dir = certs
unique_subject = no
copy_extensions = none
default_days = 365
default_crl_days = 100
default_md = sha256
policy = ca_policy
[ca_policy]
countryName = match
stateOrProvinceName = optional
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[req]
default_bits = 4096
encrypt_key = yes
default_md = sha256
utf8 = yes
string_mask = utf8only
prompt = no
distinguished_name = ca_dist
req_extensions = ca_req_ext
[ca_dist]
countryName = "CN"
organizationName = "flydean"
commonName = "Root CA"
[ca_req_ext]
basicConstraints = critical,CA:true
keyUsage = critical,keyCertSign,cRLSign
subjectKeyIdentifier = hash
[sub_ca_ext]
authorityInfoAccess = @issuer_info
authorityKeyIdentifier = keyid:always
basicConstraints = critical,CA:true,pathlen:0
crlDistributionPoints = @crl_info
extendedKeyUsage = clientAuth,serverAuth
keyUsage = critical,keyCertSign,cRLSign
subjectKeyIdentifier = hash
[crl_info]
URI.0 = http://crl3.digicert.com/DigiCertTLSRSASHA2562020CA1-4.crl
[issuer_info]
caIssuers;URI.0 = http://cacerts.digicert.com/DigiCertTLSRSASHA2562020CA1-1.crt
OCSP;URI.0 = http://ocsp.digicert.com
[ocsp_ext]
authorityKeyIdentifier = keyid:always
basicConstraints = critical,CA:false
extendedKeyUsage = OCSPSigning
noCheck = yes
keyUsage = critical,digitalSignature
subjectKeyIdentifier = hash
生成root CA
有了下面的配置文件和目录信息,就能够生成root CA了。
首先咱们须要创立私钥和root ca的csr文件如下:
openssl req -new -config root-ca.conf -out root-ca.csr -keyout keys/root-ca.key
接下来咱们创立一个自签名的证书,这里咱们须要用到配置文件中的ca_req_ext局部:
openssl ca -selfsign -config root-ca.conf -in root-ca.csr -out root-ca.crt -extensions ca_req_ext
运行该命令之后,咱们会在certs文件夹中创立一个自签名证书文件。
除此之外,还向db中的index文件中写入了上面的内容:
V 230501041451Z 4445DE5C0285EAEF2E58757D5CB1E949 unknown /C=CN/O=flydean/CN=Root CA
这是一个文本文件,外面保留的是生成的证书索引,证书中的字段是通过tab来进行宰割的。
第一个字段V示意valid也就是无效的意思,这个字段还能够有其余几个值,比方R示意revoked,E示意expired。
第二个字段是过期工夫,格局是YYMMDDHHMMSSZ。
第三个字段是Revocation日期,如果空示意没有revoked。
第四个字段是序列号,也就是生成的CA名字。
第五个字段是文件的地位,unknown示意未知。
最初一个字段是这个证书的名字,用于和其余的证书做辨别。
应用CRL
有了root-ca.conf之后,咱们能够应用它来创立CRL:
openssl ca -gencrl -config root-ca.conf -out root-ca.crl
当初生成的root-ca.crl文件还没有任何证书信息。
如果咱们想要撤销某个颁发的CA,能够应用上面的命令:
openssl ca -config root-ca.conf -revoke certs/torevoke.pem -crl_reason unspecified
在revoke中指定要revoke的证书即可。
这里要留神的是咱们须要指定crl_reason,crl_reason能够是上面几个值:
unspecified
keyCompromise
CACompromise
affiliationChanged
superseded
cessationOfOperation
certificateHold
removeFromCRL
应用OSCP
对于OSCP来说,须要一个OCSP responder来响应OCSP的申请。这个OCSP responder和CA自身并不是同一个,须要独自创立。
首先,咱们创立OCSP responder的key和证书申请CSR:
openssl req -new -newkey rsa:2048 -keyout keys/root-ocsp.key -out root-ocsp.csr
当然输出必须的参数之后,key和CSR就能够生成了。
接下来我能够应用root CA和root-ocsp.csr颁发OCSP证书,这里咱们须要用到配置文件中的ocsp_ext局部。
openssl ca -config root-ca.conf -in root-ocsp.csr -out root-ocsp.crt -extensions ocsp_ext -days 10
下面的命令为OCSP responder生成了一个有效期为10天的证书。
有了证书,咱们能够不便的搭建一个本地的OCSP responder如下所示:
openssl ocsp -port 9000 -index db/index -rsigner root-ocsp.crt -rkey keys/root-ocsp.key -CA root-ca.crt -text
Enter pass phrase for keys/root-ocsp.key:
Waiting for OCSP client connections...
这样咱们就启动了一个OCSP服务器端。
另开一个窗口,执行上面的命令来申请OCSP:
openssl ocsp -issuer root-ca.crt -CAfile root-ca.crt -cert root-ocsp.crt -url http://127.0.0.1:9000
能够失去上面的后果:
Response verify OK
root-ocsp.crt: good
This Update: May 1 08:09:31 2022 GMT
这就阐明OCSP responder搭建胜利了。
这里启动的是一个本地服务,在正式环境中能够思考将其迁徙到独自的服务器中。
总结
应用下面的命令,咱们搭建了一个公有的CA服务,和对应的OCSP,openssl十分弱小,基本上你能够用他来做任何事件。
更多内容请参考 http://www.flydean.com/45-openssl-private-ca/
最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不
欢送关注我的公众号:「程序那些事」,懂技术,更懂你!
发表回复