关于java:创建私有CA我就用openSSL

26次阅读

共计 4148 个字符,预计需要花费 11 分钟才能阅读完成。

简介

个别状况下咱们应用的证书都是由第三方权威机构来颁发的,如果咱们有一个新的 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/

最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不

欢送关注我的公众号:「程序那些事」, 懂技术,更懂你!

正文完
 0