OpenSSL自建CA和CA链,给主机签发证书的批处理(使用CA命令)(openssl生成ca根证书)

网友投稿 557 2022-10-08


OpenSSL自建CA和CA链,给主机签发证书的批处理(使用CA命令)(openssl生成ca根证书)

​在学习OpenSSL的过程中经常需要建立CA,再用此CA给用户签发证书,这个过程总是反复进行,让人不胜其烦,所以写下了这个批处理把以上过程自动化。​

​一定要把openssl.exe所在目录加入PATH环境变量,这样就可以在任何位置执行批处理,默认安装目录是C:\Program Files\OpenSSL-Win64\bin​

​不建议安装于C盘,因为在生成文件的过程中可能会遇到的权限问题。​

​本实验OpenSSL版本号为Windows版1.1.1c  28 May 2019。​

​有两个命令可以作为CA给客户签发证书:CA命令和x509命令,将分为两篇文档分别介绍;对于每个命令又细分为CA根证书签发和证书链签发两个部分,都给出了执行代码,可以将其复制,然后粘贴到Windows命令行窗口执行,或者也可保存为批处理。​

​使用x509命令签发证书的博文见​​​这里。​​​

​批处理会在D盘根目录创建rca、ca1、ca2、ca3、host1、host2这几个目录,为了保证干净的实验环境,每次执行批处理都会先删除它们然后重建,所以不要在上述这些目录里保存重要资料。​​​切记!​​​​

​实验准备:用ca命令签署证书会用到配置文件:C:\Program Files\Common Files\SSL\openssl.cnf(可以通过环境变量 openssl_conf来指定),该文件有三个“节”(section,由中括号圈定)需要特别注意。​

​​​第一个节是[ CA_default ],定义了ca命令所需要的目录结构及几个固定的文件名,文件名包括CA的证书、CA的私钥、数据库文件、序列号文件:​​​

​​[ CA_default ]​​

dir    = ./demoCA    # 顶层目录,保存一切的起点

database  = $dir/index.txt    # 索引数据库文件名及所在目录

new_certs_dir = $dir/newcerts    # 存放新证书的目录

ertificate  = $dir/cacert.pem     # CA证书文件名及所在目录

private_key  = $dir/private/cakey.pem    # CA私钥文件名及所在目录

serial   = $dir/serial    # 已签发证书的序列号(16进制)所在目录

​如果你的取值与上文不同请修改,因为批处理的代码是按照这些取值设计的,#后面是中文注释,可以不填入配置文件。​

​​​第二个节与“策略”有关,因为policy= policy_match,所以找默认策略 [ policy_match ]:​​​

​​         [ policy_match ]​​

countryName   = match    # 国家

stateOrProvinceName = match    # 省

organizationName  = match    # 组织名称

organizationalUnitName = optional    #组织单位名称

commonName   = supplied    # FQDN

emailAddress   = optional    #电子邮件

​这里是DN字段,前三个字段的取值为match,意思是请求文件(CSR文件)该字段的取值,必须与签署时输入的CA证书对应字段的取值一模一样,否则不能签署。之所以有这个奇葩的策略,是因为OpenSSL认定只有在建立组织内部的信任关系时,才需要自己当CA,既然是组织内部的信任关系,CA和它所签署的证书就应该有相同的国家、省份和所属组织,而这就会给本实验带来麻烦,对此有三种解决方法:​

​1.把前三个字段的取值改为optional(optional:可选项,可以留空;supplied :必选项,可以与CA对应字段的值不同)​

​3.CA命令使用选项:-policy policy_anything​

​本文采用第一种方法,即修改​​[ policy_match ],​​注意除了修改了optional之外,还多了一行:城市​

​​[ policy_match ]​​

countryName = optional     # 国家

stateOrProvinceName = optional     # 省

localityName = optional    #城市

organizationName  = optional     # 组织名称

organizationalUnitName = optional    #组织单位名称

commonName   = supplied    # FQDN

emailAddress   = optional    #电子邮件

​​第三个节是 [ v3_ca ],必须存在CA:true​​

​​            [ v3_ca ]​​

basicConstraints = critical,CA:true

​经过以上准备就可以创建CA并给其它用户签发SSL证书了。​

​为了防止谷歌浏览器弹出“没有指定主题备用名称”的提示:​

​本实验在代码里添加了对应的扩展选项,具体是:​

​req命令添加:-addext "subjectAltName = DNS:host1"​

​ca命令添加:-extfile md.ext​

​md.ext由之前的一条命令产生:echo subjectAltName = DNS:host1>md.ext​

​​​​使用CA命令签发证书,之前请确保上述三个节的准备工作已经完成。​​​​

​​​​根CA签发:​​​​建立根CA,再由根CA直接签发主机HOST1和HOST2的证书​​​​

​批处理会在D盘根目录下建立三个目录:RCA,HOST1和HOST2,RCA的目录结构如下:​

​cacert.pem是CA的根证书,index.txt是数据库,记录了曾经签署和吊销过的证书的历史记录;serial是为下一个证书准备的序列号文件(本例初始序列号置为01),每次签署之后该序列号都会加一;cakey.pem是CA的私钥,输出的新证书在private里留有备份,其主文件名是序列号。​

​此外,RCA目录下还有CA的根证书、私钥、公钥,以及给用户签发的所有证书的备份。​

​HOST1/HOST2目录分别存放了六个文件:HOST1/HOST2的证书、私钥、公钥,请求文件,以及CA根证书和CA的公钥。​

​根CA:RCA​

:: 根CA签发:: 删除之前创建的所有的文件d:&cd\&rd/s/q host1&rd/s/q host2&rd/s/q rca&md host1&md host2&md rca&cd rca&md democa&md democa\newcerts&md democa\private:: 生成自签名的根证书,私钥和公钥:openssl req -x509 -newkey rsa:8192 -keyout rca.key -out rca.cer -days 3650 -subj /C=CN/ST=jiangsu/L=nanjing/O=Tiger/OU=CA-R/CN=RCA/emailAddress=ca@tiger.com -passout pass:abcdopenssl rsa -in rca.key -pubout -out rca.pub -passin pass:abcd:: 把RCA的证书和公钥拷贝到HOST1和HOST2copy rca.cer d:\host1© rca.pub d:\host1© rca.cer d:\host2© rca.pub d:\host2:: 把rca的证书和私钥拷贝到配置文件要求的目录,并建立数据库文件和序列号文件,以便给用户签发证书copy rca.cer democa\cacert.pem© rca.key democa\private\cakey.pem&cd.>democa\index.txt&echo 01>democa\serial:: 生成HOST1与HOST2的证书请求、公钥和私钥openssl req -newkey rsa:8192 -keyout host1.key -out host1.csr -subj /C=CN/ST=guangdong/L=shenzhen/O=SUN/OU=Office-1/CN=host1 -addext "subjectAltName = DNS:host1" -passout pass:abcdopenssl req -newkey rsa:8192 -keyout host2.key -out host2.csr -subj /C=CN/ST=guangdong/L=shenzhen/O=SUN/OU=Office-2/CN=host2 -addext "subjectAltName = DNS:host2" -passout pass:abcdopenssl rsa -in host1.key -pubout -out host1.pub -passin pass:abcdopenssl rsa -in host2.key -pubout -out host2.pub -passin pass:abcd:: 用RCA的私钥签署用户请求echo subjectAltName = DNS:host1>md.extopenssl ca -batch -notext -in host1.csr -out host1.cer -days 3650 -extfile md.ext -passin pass:abcdecho subjectAltName = DNS:host2>md.extopenssl ca -batch -notext -in host2.csr -out host2.cer -days 3650 -extfile md.ext -passin pass:abcdcopy host1.* d:\host1© host2.* d:\host2del md.ext:: 验证证书链openssl verify -CAfile rca.cer -show_chain host1.ceropenssl verify -CAfile rca.cer -show_chain host2.ceropenssl x509 -in rca.cer -noout -text|find "CA:TRUE"openssl x509 -in host1.cer -noout -text|find "CA:TRUE"openssl x509 -in host2.cer -noout -text|find "CA:TRUE"

​​​证书链签发:二级CA签发证书​​​

​根CA:CA1​

​中间CA:CA2​

​CA1签发CA2的证书,CA2签发主机HOST1和HOST2的证书。​

​批处理在D盘根目录下建立目录CA1、CA2、HOST1、HOST2,各目录存放的文件顾名思义,其中CA2保留所签发的所有证书的备份。​

:: 二级CA签发:: 删除之前创建的所有的文件d:&cd\&rd/s/q host1&rd/s/q host2&rd/s/q ca1&rd/s/q ca2&md host1&md host2&md ca1&md ca2&cd ca1&md democa&md democa\newcerts&md democa\private&cd\ca2&md democa&md democa\newcerts&md democa\private&cd\ca1:: 生成自签名的CA1根证书,私钥和公钥:openssl req -x509 -newkey rsa:8192 -keyout ca1.key -out ca1.cer -days 3650 -subj /C=CN/ST=jiangsu/L=nanjing/O=Tiger/OU=CA-1/CN=CA1/emailAddress=ca1@tiger.com -set_serial 0xca01 -passout pass:abcdopenssl rsa -in ca1.key -pubout -out ca1.pub -passin pass:abcd:: 把CA1的证书和公钥拷贝到HOST1和HOST2copy ca1.cer d:\host1© ca1.pub d:\host1© ca1.cer d:\host2© ca1.pub d:\host2:: 把CA1的证书和私钥拷贝到配置文件指定的目录,并建立数据库文件和序列号文件,以便给CA2签发证书copy ca1.cer democa\cacert.pem© ca1.key democa\private\cakey.pem&cd.>democa\index.txt&echo ca02>democa\serial:: 生成CA2的请求,私钥和公钥openssl req -newkey rsa:8192 -keyout ca2.key -out ca2.csr -subj /C=CN/ST=jiangsu/L=nanjing/O=Tiger/OU=CA-2/CN=CA2/emailAddress=ca2@tiger.com -passout pass:abcdopenssl rsa -in ca2.key -pubout -out ca2.pub -passin pass:abcd:: 用CA1的私钥签署CA2的请求openssl ca -extensions v3_ca -batch -notext -in ca2.csr -out ca2.cer -days 3650 -passin pass:abcd:: 把CA2的证书和公钥拷贝到HOST1和HOST2copy ca2.cer d:\host1© ca2.pub d:\host1© ca2.cer d:\host2© ca2.pub d:\host2:: 把属于CA2的所有文件拷贝到CA2目录,同时把CA2的证书和私钥拷贝到配置文件指出的目录,以便用CA2的私钥给用户签发证书copy ca2.* \ca2© ca2.cer \ca2\democa\cacert.pem© ca2.key \ca2\democa\private\cakey.pem&cd\ca2&cd.>democa\index.txt&echo 01>democa\serial© \ca1\ca1.cer© \ca1\ca1.pub:: 生成HOST1与HOST2的证书请求和私钥openssl req -newkey rsa:8192 -keyout host1.key -out host1.csr -subj /C=CN/ST=guangdong/L=shenzhen/O=SUN/OU=Office-1/CN=host1 -addext "subjectAltName = DNS:host1" -passout pass:abcdopenssl req -newkey rsa:8192 -keyout host2.key -out host2.csr -subj /C=CN/ST=guangdong/L=shenzhen/O=SUN/OU=Office-2/CN=host2 -addext "subjectAltName = DNS:host2" -passout pass:abcd:: 用CA2的私钥签发用户证书:echo subjectAltName = DNS:host1>md.extopenssl ca -batch -notext -in host1.csr -out host1.cer -days 3650 -extfile md.ext -passin pass:abcdecho subjectAltName = DNS:host2>md.extopenssl ca -batch -notext -in host2.csr -out host2.cer -days 3650 -extfile md.ext -passin pass:abcdopenssl rsa -in host1.key -pubout -out host1.pub -passin pass:abcdopenssl rsa -in host2.key -pubout -out host2.pub -passin pass:abcddel md.ext:: 把HOST1和HOST2的所有文件拷贝到对应目录copy host1.* d:\host1© host2.* d:\host2:: 验证证书链copy ca2.cer+ca1.cer ca-chain.ceropenssl verify -CAfile ca-chain.cer -show_chain host1.ceropenssl verify -CAfile ca-chain.cer -show_chain host2.ceropenssl x509 -in ca1.cer -noout -text|find "CA:TRUE"openssl x509 -in ca2.cer -noout -text|find "CA:TRUE"openssl x509 -in host1.cer -noout -text|find "CA:TRUE"openssl x509 -in host2.cer -noout -text|find "CA:TRUE"

​​​证书链签发:三级CA签发证书​​​

​根CA:CA1​

​中间CA:CA2和CA3​

​CA1签发CA2的证书,CA2签发CA3的证书,CA3给HOST1和HOST2签发证书。​

​批处理在D盘根目录下建立目录CA1、CA2、CA3、HOST1、HOST2,各目录存放的文件顾名思义,其中CA3保留所签发的所有证书的备份。​

:: 三级CA签发:: 删除之前创建的所有的文件d:&cd\&rd/s/q host1&rd/s/q host2&rd/s/q ca1&rd/s/q ca2&rd/s/q ca3&md host1&md host2&md ca1&md ca2&md ca3&cd ca1&md democa&md democa\newcerts&md democa\private&cd\ca2&md democa&md democa\newcerts&md democa\private&cd \ca3&md democa&md democa\newcerts&md democa\private&cd\ca1 :: 生成自签名的CA1根证书,私钥和公钥:openssl req -x509 -newkey rsa:8192 -keyout ca1.key -out ca1.cer -days 3650 -subj /C=CN/ST=jiangsu/L=nanjing/O=Tiger/OU=CA-1/CN=CA1/emailAddress=ca1@tiger.com -set_serial 0xca01 -passout pass:abcdopenssl rsa -in ca1.key -pubout -out ca1.pub -passin pass:abcd :: 把CA1的证书和公钥拷贝到HOST1和HOST2copy ca1.cer d:\host1© ca1.pub d:\host1© ca1.cer d:\host2© ca1.pub d:\host2 :: 把CA1的证书和私钥拷贝到配置文件指出的目录,并建立数据库文件和序列号文件,以便给用CA1的私钥给CA2签发证书copy ca1.cer democa\cacert.pem© ca1.key democa\private\cakey.pem&cd.>democa\index.txt&echo ca02>democa\serial :: 生成CA2的请求,私钥和公钥openssl req -newkey rsa:8192 -keyout ca2.key -out ca2.csr -subj /C=CN/ST=jiangsu/L=nanjing/O=Tiger/OU=CA-2/CN=CA2/emailAddress=ca2@tiger.com -passout pass:abcdopenssl rsa -in ca2.key -pubout -out ca2.pub -passin pass:abcd :: 用CA1的私钥签署CA2的请求openssl ca -extensions v3_ca -batch -notext -in ca2.csr -out ca2.cer -days 3650 -passin pass:abcd :: 把CA2的证书和公钥拷贝到HOST1和HOST2copy ca2.cer d:\host1© ca2.pub d:\host1© ca2.cer d:\host2© ca2.pub d:\host2 :: 把属于CA2的所有文件拷贝到CA2目录,同时把CA2的证书和私钥拷贝到配置文件指出的目录,以便用CA2的私钥给CA3签发证书copy ca2.* \ca2© ca2.cer \ca2\democa\cacert.pem© ca2.key \ca2\democa\private\cakey.pem&cd\ca2&cd.>democa\index.txt&echo ca03>democa\serial© \ca1\ca1.cer© \ca1\ca1.pub :: 生成CA3的请求,私钥和公钥openssl req -newkey rsa:8192 -keyout ca3.key -out ca3.csr -subj /C=CN/ST=jiangsu/L=nanjing/O=Tiger/OU=CA-3/CN=CA3/emailAddress=ca3@tiger.com -passout pass:abcdopenssl rsa -in ca3.key -pubout -out ca3.pub -passin pass:abcd :: 用CA2的私钥签署CA3的请求openssl ca -extensions v3_ca -batch -notext -in ca3.csr -out ca3.cer -days 3650 -passin pass:abcd :: 把CA3的证书和公钥拷贝到HOST1和HOST2copy ca3.cer d:\host1© ca3.pub d:\host1© ca3.cer d:\host2© ca3.pub d:\host2 :: 用把属于CA3的所有文件拷贝到CA3,同时把CA3的证书和私钥拷贝到配置文件指出的目录,以便用CA3的私钥给用户签发证书copy ca3.* \ca3© ca3.cer \ca3\democa\cacert.pem© ca3.key \ca3\democa\private\cakey.pem&cd\ca3&cd.>democa\index.txt&echo 01>democa\serial© ca3.cer \ca1© ca3.pub \ca1© \ca1\ca1.cer© \ca1\ca1.pub© \ca2\ca2.cer© \ca2\ca2.pub :: 生成HOST1与HOST2的证书请求和私钥openssl req -newkey rsa:8192 -keyout host1.key -out host1.csr -subj /C=CN/ST=guangdong/L=shenzhen/O=SUN/OU=Office-1/CN=host1 -addext "subjectAltName = DNS:host1" -passout pass:abcdopenssl req -newkey rsa:8192 -keyout host2.key -out host2.csr -subj /C=CN/ST=guangdong/L=shenzhen/O=SUN/OU=Office-2/CN=host2 -addext "subjectAltName = DNS:host2" -passout pass:abcd :: 用CA3的私钥签署用户的请求echo subjectAltName = DNS:host1>md.extopenssl ca -batch -notext -in host1.csr -out host1.cer -days 3650 -extfile md.ext -passin pass:abcdecho subjectAltName = DNS:host2>md.extopenssl ca -batch -notext -in host2.csr -out host2.cer -days 3650 -extfile md.ext -passin pass:abcdopenssl rsa -in host1.key -pubout -out host1.pub -passin pass:abcdopenssl rsa -in host2.key -pubout -out host2.pub -passin pass:abcdcopy host1.* d:\host1© host2.* d:\host2del md.extcopy ca3.cer+ca2.cer+ca1.cer ca-chain.ceropenssl verify -CAfile ca-chain.cer -show_chain host1.ceropenssl verify -CAfile ca-chain.cer -show_chain host2.ceropenssl x509 -in ca1.cer -noout -text|find "CA:TRUE"openssl x509 -in ca2.cer -noout -text|find "CA:TRUE"openssl x509 -in ca3.cer -noout -text|find "CA:TRUE"openssl x509 -in host1.cer -noout -text|find "CA:TRUE"openssl x509 -in host2.cer -noout -text|find "CA:TRUE"


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:SpringBoot如何自动生成API文档详解
下一篇:Nmap参数整合(nmap综合性扫描参数)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~