使用Openssl创建私有CA中心的整体步骤:

1、生成root ca,再根据roo.ca生成intermediate CAs,最佳实践是,不要让root.ca直接去签名,而是让intermediate CAs 去签名,生成root.ca的机器最好isolated,以免私钥丢失。

1.1、准备root证书放的地儿专门保存私钥和证书

mkdir /root/ca

cd /root/ca

mkdir certs crl newcerts private

chmod 700 private

touch index.txt

echo 1000 > serial

index.txt and serial files 用于记录证书签名的跟踪.

1.2、必须使用一个配置文件给openssl来使用,保存的名字位于/root/ca/openssl.cnf,附:https://jamielinux.com/docs/openssl-certificate-authority/appendix/root-configuration-file.html

1.3、创建root CA的私钥key, 使用aes256加密key文件,私钥文件为4096位。

# cd /root/ca

# openssl genrsa -aes256 -out private/ca.key.pem 4096

-------会提示让你输密码-------

# chmod 400 private/ca.key.pem

1.4、创建root CA的公钥certificate,使用私钥去生成公钥,失效日期设置长一点(eg:20 years)

# cd /root/ca

# openssl req -config openssl.cnf \

      -key private/ca.key.pem \

      -new -x509 -days 7300 -sha256 -extensions v3_ca \

      -out certs/ca.cert.pem

------会提示你输入相关信息--------

# chmod 444 certs/ca.cert.pem

使用-config来指定我们之前下载的配置模板,否则将使用默认的模板,位于/etc/pki/tls/openssl.cnf

1.5、校验生成的公钥是否是我们想要的

#openssl x509 -noout -text -in certs/ca.cert.pem


2、生成intermediate pairs,intermediate CA可以代表root CA去给第三方做签名,root CA签名intermediate CA, 结果会形成一个信任链chain of trust

2.1、准备目录

# mkdir /root/ca/intermediate

# cd /root/ca/intermediate

# mkdir certs crl csr newcerts private

# chmod 700 private

# touch index.txt

# echo 1000 > serial

相比root ca多了一个csr目录,主要用于保存证书签名请求。

# echo 1000 > /root/ca/intermediate/crlnumber

创建一个crlnumber文件,主要用于证书吊销列表的追踪。

2.2、准备配置文件为/root/ca/intermediate/openssl.cnf, 配置文件模板为https://jamielinux.com/docs/openssl-certificate-authority/appendix/intermediate-configuration-file.html

主要有五个选项需要变一下:

[ CA_default ]

dir             = /root/ca/intermediate

private_key     = $dir/private/intermediate.key.pem

certificate     = $dir/certs/intermediate.cert.pem

crl             = $dir/crl/intermediate.crl.pem

policy          = policy_loose

root.ca中的policy是policy_strict是指它只签名intermediate,而intermediate是loose是允许他去签名更多的其他证书。

2.3、创建intermediate私钥,和root ca一样的命令

# cd /root/ca

# openssl genrsa -aes256 \

      -out intermediate/private/intermediate.key.pem 4096

-----提示输入保护密码---- 

# chmod 400 intermediate/private/intermediate.key.pem

2.4、使用intermediate 私钥去创建一个certificate signing request (CSR)

# cd /root/ca

# openssl req -config intermediate/openssl.cnf -new -sha256 \

      -key intermediate/private/intermediate.key.pem \

      -out intermediate/csr/intermediate.csr.pem

---------会输出很多让你输入的信息,除了Common Name和root ca时不一样,其他最好保持一致----------

注意以上使用的是intermediate的配置文件,以下则是使用root ca 的配置文件,with v3_intermediate_ca extension去签名以上生成的CSR,并生成签名后的intermediate公钥证书:

# cd /root/ca

# openssl ca -config openssl.cnf -extensions v3_intermediate_ca \

      -days 3650 -notext -md sha256 \

      -in intermediate/csr/intermediate.csr.pem \

      -out intermediate/certs/intermediate.cert.pem

# chmod 444 intermediate/certs/intermediate.cert.pem

以上命令完后,会在运行openssl ca命令时的目录(/root/ca)下的index.txt下生成类似以下信息,不要删除:V 250408122707Z 1000 unknown ... /CN=Alice Ltd Intermediate CA

2.5、验证intermediate证书的细节是否正确:

# openssl x509 -noout -text \

      -in intermediate/certs/intermediate.cert.pem

然后再验证intermediate证书的是否被root ca正确签名:

# openssl verify -CAfile certs/ca.cert.pem \

      intermediate/certs/intermediate.cert.pem

2.6、创建一个证书链文件,主要用于一个应用程序,例如浏览器要认证intermediate证书的有效签发机构是不是root ca(假设浏览器信任root ca)

# cat intermediate/certs/intermediate.cert.pem \

      certs/ca.cert.pem > intermediate/certs/ca-chain.cert.pem

# chmod 444 intermediate/certs/ca-chain.cert.pem

证书链文件必须包含root ca的certification,并且在每台内部客户端安装root公钥证书.


3、利用intermediate CA去签名平时使用的server和client,如果是第三方给你的话,人家只需要给你CSR即可,你给CSR签名就行了。以下是从自己内部的角度来一步一步操作。

3.1、在server端创建key私钥,尽管root 和 intermediate pair是4096bit,但是给server和client签名时最好是2048bit,减少TLS握手时性能压力。

# cd /root/ca

# openssl genrsa -aes256 \

      -out intermediate/private/www.example.com.key.pem 2048

# chmod 400 intermediate/private/www.example.com.key.pem

如果使用apache,每次启动都要输入保护私钥的密码,如果不想输入密码,就去掉-aes256。

3.2、使用key私钥去生成一个CSR证书(说白了就是未签名的公钥证书),

# cd /root/ca

# openssl req -config intermediate/openssl.cnf \(使用intermediate的私钥去生成server的公钥?错了吧,也许这里面的intermediate相当于第三方自己的内部CA,pending....)

      -key intermediate/private/www.example.com.key.pem \

      -new -sha256 -out intermediate/csr/www.example.com.csr.pem

----输出一堆信息让你填,你不需要和intermediate的相对应,但common name时填写网站全名,如果是client的话,最好填邮箱信息-----


3.3、使用intermediate证书去签名server或client的CSR并生成签名后证书,证书通常一年

# cd /root/ca

# openssl ca -config intermediate/openssl.cnf \

      -extensions server_cert -days 375 -notext -md sha256 \

      -in intermediate/csr/www.example.com.csr.pem \

      -out intermediate/certs/www.example.com.cert.pem

# chmod 444 intermediate/certs/www.example.com.cert.pem

如果是去签名一个client,则改成-extensions usr_cert

最后会在intermediate/index.txt文件中生成一条类似于如下信息: V 160420124233Z 1000 unknown ... /CN=www.example.com

3.4、校验生成的证书信息是否正确

# openssl x509 -noout -text \

      -in intermediate/certs/www.example.com.cert.pem

3.5、使用之前intermediate时创建的证书链文件校验是否ok

# openssl verify -CAfile intermediate/certs/ca-chain.cert.pem \

      intermediate/certs/www.example.com.cert.pem

3.6、部署证书,这里假设是apache,以下文件需要

ca-chain.cert.pem

www.example.com.key.pem

www.example.com.cert.pem

如果是给第三方做签名的话,只需要给他们ca-chain.cert.pem和

www.example.com.cert.pem,因为他们让你做签名时,不会把私钥给你的。


4、证书撤消列表CRLs,主要用来客户端程序(eg: IE)使用CRL去验证一个证书是否被撤消,服务器也可以使用CRLs限制拥有无效证书的客户端连接。目前CRLs这种方式已经被Online Certificate Status Protocol (OCSP)取代,所以这里喜新不喜旧。

OCSP server address 通常会在证书里面指定。


4.1、OCSP准备配置文件,在intermediate CA的配置文件中指定,因为要使用intermediate CA做签名

[ server_cert ]

# ... snipped ...

authorityInfoAccess = OCSP;URI:http://ocsp.example.com

4.2、创建OCSP密钥对,OCSP responder需要使用该密钥对加密回复requesting party, 必须使用证书的拥有者相同的CA签名

生成私钥:

# cd /root/ca

# openssl genrsa -aes256 \

      -out intermediate/private/ocsp.example.com.key.pem 4096

根据私钥生成CSR:

# cd /root/ca

# openssl req -config intermediate/openssl.cnf -new -sha256 \

      -key intermediate/private/ocsp.example.com.key.pem \

      -out intermediate/csr/ocsp.example.com.csr.pem

-----输出很多信息需要填,最好和要使用的签名CA时的信息一样,Common name是全域名------

使用intermediate CA去签名该CSR:

# openssl ca -config intermediate/openssl.cnf \

      -extensions ocsp -days 375 -notext -md sha256 \

      -in intermediate/csr/ocsp.example.com.csr.pem \

      -out intermediate/certs/ocsp.example.com.cert.pem

验证生成的证书含有正确的x509 v3 extension:

# openssl x509 -noout -text \

      -in intermediate/certs/ocsp.example.com.cert.pem

4.2、撤消证书,本次测试环境中使用openssl的ocsp工具作为ocsp responder,在生产环境需要商业版。

建立一个server的证书去测试

# cd /root/ca

# openssl genrsa -out intermediate/private/test.example.com.key.pem 2048

# openssl req -config intermediate/openssl.cnf \(又出现了,为什么生成server证书还要intermediate配置文件?没谷歌到)

      -key intermediate/private/test.example.com.key.pem \

      -new -sha256 -out intermediate/csr/test.example.com.csr.pem

# openssl ca -config intermediate/openssl.cnf \

      -extensions server_cert -days 375 -notext -md sha256 \

      -in intermediate/csr/test.example.com.csr.pem \

      -out intermediate/certs/test.example.com.cert.pem


在本地运行OCSP responder,通常是和intermediate ca在一起(因为他使用他的配置文件呀),the OCSP responder reads index.txt directly,回复的消息也会使用OCSP cryptographic pair (using the -rkey and -rsigner options)

# openssl ocsp -port 127.0.0.1:2560 -text -sha256 \

      -index intermediate/index.txt \

      -CA intermediate/certs/ca-chain.cert.pem \

      -rkey intermediate/private/ocsp.example.com.key.pem \

      -rsigner intermediate/certs/ocsp.example.com.cert.pem \

      -nrequest 1

在另一个窗口,向OCSP发送requery包,使用-cert指定证书来发送:

# openssl ocsp -CAfile intermediate/certs/ca-chain.cert.pem \

      -url http://127.0.0.1:2560 -resp_text \

      -issuer intermediate/certs/intermediate.cert.pem \

      -cert intermediate/certs/test.example.com.cert.pem

------会有很多输出信息,OCSP Response Status表示发回来的状态,Responder Id是指responder的身份,Cert Status表示撤消状态。-------


撤消证书动作,谁签发谁撤消:

# openssl ca -config intermediate/openssl.cnf \

      -revoke intermediate/certs/test.example.com.cert.pem

然后再请求一次,就可以看到撤消的状态了。