银河麒麟服务器操作系统搭建证书服务器并颁发可用于签名的证书的方法与前面Centos7上(centos7 使用openssl 配置证书服务器并颁发证书(史上最详细版本)_centos phpinfo显示的openssl配置项为/etc/pki/tls/openssl.c-CSDN博客)是一样的,不过使用的openssl版本不同,可能略微不同。 就还是稍微记录一下吧~~
使用cat /etc/os-release命令获取当前系统版本信息:
rpm -qa openssl #如果没有查询到则需要进行安装
yum install -y openssl #如果服务器可联网,yum install 命令安装即可,如服务器不可联网,则使用对应服务器CPU架构的离线安装包,通过命令 rpm -ivh xxx.rpm 命令安装
安装好了openssl工具之后,默认安装目录为:/etc/pki/目录。cd /etc/pki/ 跳转到目录下,ls查看目录结构:
在进行搭建证书服务器之前,需要先了解openssl配置文件的作用。
openssl工具安装之后,默认配置文件目录为/etc/pki/tls/openssl.cnf,该文件主要设置了证书请求、签名、crl相关的配置。主要相关的伪命令为ca和req。该文件从功能结构上分为4个段落:默认段、ca相关的段、req相关的段、tsa相关的段。每个段中都以name=value的格式定义。
配置默认路径:包括默认的CA路径dir、证书路径certs、crl路径crl_dir、根证书路径certificate、serial文件路径serial、私钥路径private_key等。生成根证书的私钥、证书时可以根据此配置文件里的设置设定文件名,也可以根据自己的需要自行设置文件名,然后再对此配置文件进行修改,将对应的文件名信息改正确。
一般需要设置的就是:
1)dir = /etc/pki/CA 设定这个路径 为home路径,所有ca相关的证书都在这个文件夹里
2)certificate = $dir/XXXX 设定根证书文件路径 ,这是自建证书服务器时需要去生成的。
3)serial = $dir/serial 这个 就建议就用serial做文件名,即需要在这个路径下生成一个名为serial的文件,并且需要向这个文件中添加初始值
4)private_key = $dir/private/XXXX # The private key 设定根证书对应的私钥文件路径
#################################################################### [ ca ] default_ca = CA_default # The default ca section #################################################################### [ CA_default ] dir = /etc/pki/CA # Where everything is kept certs = $dir/certs # Where the issued certs are kept crl_dir = $dir/crl # Where the issued crl are kept database = $dir/index.txt # database index file. #unique_subject = no # Set to 'no' to allow creation of # several ctificates with same subject. new_certs_dir = $dir/newcerts # default place for new certs. certificate = $dir/cacert.pem # The CA certificate serial = $dir/serial # The current serial number crlnumber = $dir/crlnumber # the current crl number # must be commented out to leave a V1 CRL crl = $dir/crl.pem # The current CRL private_key = $dir/private/cakey.pem# The private key RANDFILE = $dir/private/.rand # private random number file |
(具体路径可根据自己的情况进行配置,然后去生成相关的文件,也可以先生成相关的文件,然后再对此配置文件进行修改,一定要确保配置文件里的路径是正确的,否则可能会报错):
如规定证书中的密钥用途:这个证书用途的体现在:当使用证书浏览器查看时看到的密钥用法,如通过浏览器---internet选项---内容---证书---详细信息中显示的密钥用法信息,如下图所示:
对应的配置内容为:
当需要在证书的密钥用法中展示数字签名并可用于签名时,就需要将此部分的keyUsage内容开放:
# This is typical in keyUsage for a client certificate. keyUsage = nonRepudiation, digitalSignature, keyEncipherment |
具体体现在证书生成证书请求文件时设定的要与根证书设定的一样,如果设定不一样,在做证书签名时就会报错,提示对应设定不匹配。
如:以下配置就要求 countryName、stateOrProvinceName、organizationName三个都是一样的。
对于openssl.cnf文件的更加详细的介绍,可参考其他资料。
生成证书的步骤是:生成私钥文件---》生成证书请求文件---》生成公钥证书文件并进行签名。
生成证书的过程中会涉及多个文件,如:私钥文件、证书请求文件、公钥证书文件等,非常容易搞混淆,一定要区分清楚,建议就从文件名、后缀加以区分,否则就真的非常容易踩坑。如私钥就用xxxKey.pem;证书请求文件:xxxreq.pem、公钥证书文件:xxxCert.crt。一定要搞清楚自己的文件到底是哪种类型的!
openssl genrsa 命令是会用来生成 RSA 私有秘钥,不会生成公钥,因为公钥提取自私钥。生成私钥时是可以指定私钥长度和密码保护。如果需要查看公钥或生成公钥,可以使用 openssl rsa 命令。
openssl genrsa [-out filename] [-passout arg] [-aes128] [-aes192] [-aes256] [-camellia128] [-camellia192] [-camellia256] [-des]
可以通过openssl genrsa ?命令查看命令具体参数与用法:
[root@ecs-be9a CA]#openssl genrsa ?
usage: genrsa [args] [numbits]
-des encrypt the generated key with DES in cbc mode
-des3 encrypt the generated key with DES in ede cbc mode (168 bit key)
-idea encrypt the generated key with IDEA in cbc mode
-seed
encrypt PEM output with cbc seed
-aes128, -aes192, -aes256
encrypt PEM output with cbc aes
-camellia128, -camellia192, -camellia256
encrypt PEM output with cbc camellia
-out file output the key to 'file
-passout arg output file pass phrase source
-f4 use F4 (0x10001) for the E value
-3 use 3 for the E value
-engine e use engine e, possibly a hardware device.
-rand file:file:...
load the file (or the files in the directory) into
the random number generator
[root@ecs-be9a CA]#
openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048
生成私钥,私钥中含有公钥,如果需要公钥,需要单独提取公钥 。
如果在openssl genrsa 命令中指定加密算法如 -des3 ,则会提示输入私钥保护密码,那么下次使用这个私钥文件的时候就会提示输入私钥密码,如命令:openssl genrsa -des3 -out test1.key 2048执行效果如下图所示:
在生成证书请求文件之前,需要形成记录数据的文件index.txt以及最初始的自签名证书的序列号可serial文件:
touch index.txt #生成数据记录文件index.txt
向serial中写入证书初始序列号,这个serial文件路径就按照openssl.cnf配置文件中的路径生成就可以。网上很多是向serial中写入01,像这样:
但是,实际上,这个序列号最终是显示到自签名的根证书的序列号里的,像这样:
对于x509证书来说,序列号应该是一个32位的类似uuid的标志证书序列号的,因此,我个人不建议直接向serial中写01,可写一个32位的如:
a87a2d6dec4d07bd9095c9b2ee73b2ea
9579518878956341ccc51615197eb0f3
51b55180d6da29cdbaddf60d9430230a
5ce48cc7f764ad17aa6fe2a1ffab06d5
dd7b4730fa89a66b8edd977415a8b688
1ce7727ba8fb7be4dca36c354d1ae61f
因此,可这样操作:
创建证书请求文件使用openssl req命令。
该命令主要的功能有,生成证书请求文件, 查看验证证书请求文件,还有就是生成自签名证书。生成证书请求需要什么:申请者需要将自己的信息及其公钥放入证书请求中。但在实际操作过程中,所需要提供的是私钥而非公钥,建议使用CA的私钥文件/etc/pki/CA/private/cakey.pem来创建待自签署的证书请求文件,虽非必须,但方便管理。在生成证书请求文件时,就会根据配置文件里要求的整合素必须项进行输入设置。另外,还需要将提供的数据进行数字签名(使用单向加密),保证该证书请求文件的完整性和一致性,防止他人盗取后进行篡改。
openssl req命令参数说明:
-new :说明生成证书请求文件
-x509 :说明生成自签名证书
-key :指定已有的秘钥文件生成秘钥请求,只与生成证书请求选项-new配合。
-newkey :-newkey是与-key互斥的,-newkey是指在生成证书请求或者自签名证书的时候自动生成密钥, 然后生成的密钥名称由-keyout参数指定。当指定newkey选项时,后面指定rsa:bits说明产生 rsa密钥,位数由bits指定。 如果没有指定选项-key和-newkey,默认自动生成秘钥。
-out :-out 指定生成的证书请求或者自签名证书名称
-config :默认参数在ubuntu上为 /etc/pki/tls/openssl.cnf, 可以使用-config指定特殊路径的配置文件
-nodes :如果指定-newkey自动生成秘钥,那么-nodes选项说明生成的秘钥不需要加密,即不需要输入passphase.
-batch :指定非交互模式,直接读取config文件配置参数,或者使用默认参数值
执行如下命令生成根证书的请求文件:
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out careq.pem -days 730 -config /etc/pki/tls/openssl.cnf #使用-key指定使用的根证书的私钥文件 /etc/pki/CA/private/cakey.pem,-config指定配置文件 /etc/pki/tls/openssl.cnf ; -days 730指定有效期为730天 ;-out careq.pem指定输出文件为当前命令执行目录下careq.pem
生成证书请求文件时,要求输入配置文件里设定的必须的信息值。如在上文中我配置了要求countryName、stateOrProvinceName、organizationName三个是一致的,因此此时这三者是需要填写,并且需要记住的。其中对于最终生成的根证书来说这些填写的信息最终体现在证书的详细信息中(生成证书请求文件时输入的信息对应的就是使用者信息):
在证书详细信息中、各参数含义如下:
C-----国家(Country Name)
S----省份(State or Province Name)
L----城市(Locality Name)
O----公司(Organization Name)
OU----部门(Organizational Unit Name)
CN----通用名(Common Name)
emailAddress----邮箱(Email Address)
通过 openssl req 命令生成证书请求文件careq.pem :
要提供CA自己的证书,测试环境下CA只能自签署,使用"openssl req -x509"、"openssl x509"和"openssl ca"都可以自签署证书请求文件。 自签署的证书就是自签名证书,自签名证书的体现就是:查看证书时,证书的颁发给与颁发者是一致的,如下图所示:
openssl x509 命令:
该X509命令是一个多目的证书效用。它可用于显示证书信息、将证书转换为各种形式、像“迷你 CA”一样签署证书请求或编辑证书信任设置。
执行命令:
openssl req -x509 -new -key /etc/pki/CA/private/cakey.pem -in careq.pem -out cacert.pem -days 3650 -new:表明要使用新的私钥文件 -key:指定签名使用的私钥 -in:指定签名使用的证书请求文件 -out:指定输出的证书的文件信息 -days :指定生成的证书文件的有效期
进行自签名:
做完自签名之后,我们就可以得到一个自签名根证书了。
注意:按照前面操作的步骤我们得到的是一个PEM后缀格式的根证书的公钥证书文件cacert.pem,对于后续的个人证书的签发没有影响,但对于windows操作系统来说,是不能直接使用的,如果需要在windows上导入证书存储区需要做一个格式转换。
前面我们提到,在证书的配置文件中规定了证书的信息匹配问题,主要体现在这里,生成证书请求文件时输入的信息与签名用的根证书信息不匹配时可能会报错。例如下图所示就是因为生成证书请求文件时候输入的stateOrProvinceName不一致提示了:The stateOrProvinceName field needed to be the same in the CA certificate(XXXX) and the request(XXX):
在完全生成了需要的根证书的私钥文件、证书请求文件、根证书之后,我们就可以再次确认一下配置文件 /etc/pki/tls/openssl.cnf里的私钥文件路径、根证书路径是否是对的。
做完以上操作就已经完成了根证书的设置,接下来只需要进行需要个人证书的私钥生成、证书请求文件的生成、公钥证书的生成、生成需要的pfx格式证书文件、抽取需要的证书链p7b文件,最后通过结合使用pfx格式证书以及p7b证书链,只要能完整的验证证书的完整性,证书目的是可用于签名的就算是达到目的了。
与生成根证书的过程类似,都是:生成私钥文件---》生成证书请求文件---》生成公钥证书文件并进行签名。不一样的地方在于,签署证书使用的是前面产生的根证书的相关文件。具体步骤如下。
执行如下命令生成签名证书需要的私钥文件:
openssl genrsa -des3 -out testkey.pem 2048
-des3参数表示加密算法为des3 需要输入即将生成这个私钥文件testuser2key.pem的加密密码,请牢记这个密码,后续需要使用到。现象如下 ,提示输入加密密码并确认输入,两次输入的信息必须是一致的。
生成需要使用的签名证书私钥对应的证书请求文件:
openssl req -new -key testkey.pem -out testreq.pem -days 365 -config /etc/pki/tls/openssl.cnf
-key 指定当前使用的私钥文件、-out 指定当前要生成的证书请求文件的名字,如上述命令均为指向当前目录下的文件。当使用的密钥文件有加密时,就会提示输入加密使用的密码。之后会提示输入这个证书请求文件的主要信息如:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:CQ
Locality Name (eg, city) []:cq
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Company
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:test
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
这些信息最终会在证书的详细信息的使用者中展示。
如下图所示就是在生成证书请求文件时设置的Common Name为testuser1最终签发的证书,Common Name就是指的颁发给即证书使用者信息:
整体过程图如下,使用的密钥有密码,需要输入正确的密码,extra部分为可选内容可直接回车:
生成的证书请求文件:
生成签名证书的公钥证书文件,在生成根证书的时候采用的是自签名,所以是使用的根证书自己的私钥去做签名。而到这里需要的签名证书的公钥证书文件的时候就需要注意:是用的签名证书的证书请求文件、根证书的公钥证书文件、以及根证书的私钥文件来进行签发:
执行命令: openssl ca -in testreq.pem -cert /etc/pki/CA/cacert.pem -keyfile /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/testcert.crt -config /etc/pki/tls/openssl.cnf
-in 指定当前使用的证书请求文件;-cert 指定当前签发用的根证书的公钥证书文件,-keyfile 指向当前使用的根证书公钥文件对应的根证书私钥文件;-out 指定即将生成的公钥证书文件名,不指定目录的情况下均为当前目录。
这样就得到了crt后缀的公钥证书文件了。
openssl pkcs12 -export -inkey testkey.pem -in testcert.crt -out test.pfx
-in 使用的是签名通过证书请求文件已签发的公钥证书文件
-inkey 使用的是私钥文件
-out 指定生成的pfx格式文件 不指定路径为当前目录下
导出pfx格式证书文件时,还提示输入的密码就使用此证书文件需要的密码,要牢记。
将生成的pfx文件testuser2.pfx、根证书文件caroot.crt通过windows客户端安装检查最终结果如下:
1、双击安装pfx文件:
下一步:
下一步,输入生成pfx设置的密码:
下一步,根据证书类型,自动选择证书存储即可:
点击完成即可。
如果安装的是根证书,则要选择存储区域,将其安装到受信任的根证书颁发机构中的安装的根证书存储位置:受信任的根证书颁发机构里,颁发给与颁发者信息完全一致,是一个自签名的根证书。
查看证书:
生成证书请求文件输入的Common Name信息就是颁发给显示的,详细信息里的使用者信息就是全部输入的信息:
当对应的根证书也安装时就能进行验证:
证书密钥用法含Digital Signature:
签名盖章时需要使用p7b文件去验证证书链,这里说的证书链必然是要包含到根证书信息的,因此使用的是根证书的相关文件进行抽取证书链。
生成p7b命令语法:
openssl crl2pkcs7 [-inform PEM|DER ] [-outform PEM|DER ] [-in filename ]
[-out filename ] [-certfile filename ] [-nocrl ]
选项说明:
-inform PEM|DER:输入文件的格式。DER是DER编码的CRL对象。PEM(默认的格式)是base64编码的CRL对象。
-outform PEM|DER:指定文件的输出格式,跟-inform的意思一样。
-in filename:指定CRL文件,不设置此项则从标准输入中获取。
-out filename:指定输出文件,不设置此项则输入到标准输出。
-certfile filename:指定证书文件,PEM格式的证书文件可以包含多个证书,此选项可以多次使用。
-nocrl:不处理crl。一般情况下,输出文件中包含crl信息,设置此选项时,读取时忽略CRL信息,生成的信息不保护CRL信息。
要导出的是根证书的证书链文件,一定是通过根证书的公钥证书文件导出证书链p7b文件:
至此需要的签名证书 test.pfx、根证书链caroot.p7b均已生成。