7.4.1 准备证书和密钥

证书和密钥可以通过OpenSSL来生成和管理,OpenSSL提供了一系列的配置参数,指定包含用于生成证书请求或自签名证书的配置信息。

一个OpenSSL配置文件由Section组成。每个Section都以由方括号([])包围的名称开头,并在启动新Section或到达文件末尾时结束。Section名称可以包含字母、数字、字符和下划线,具体描述如下:


[ req ]
default_bits    = 2048         /* 生成证书请求时用到的私钥的长度 */
default_md      = sha1         /* 证书请求签名时的单向加密算法 */
default_keyfile = privkey.pem  /* 默认新创建的私钥存放位置, */
                               /* 如-new选项没指定-key时会自动创建私钥 */
                               /* -newkey选项也会自动创建私钥 */
distinguished_name  = req_distinguished_name /* 可识别的字段名(常被简称为DN) */
                                     /* 引用req_distinguished_name段的设置 */
/*###x509_extensions = v3_ca*/       /* 加入到自签证书中的扩展项 */
req_extensions = v3_req              /* 加入到证书请求中的扩展项 */
attributes  = req_attributes         /* 证书请求的属性,引用req_attributes段的设
            置,可以不设置它 */
prompt = yes | no /* 设置为no将不提示输入DN field,而是直接从配置文件中读取,需要同时
       设置DN默认值,否则创建证书请求时将出错。 */

[ req_distinguished_name ]
/* 以下选项都可以自定义,如countryName = C,commonName = CN */
countryName             = Country Name (2 letter code)   /* 国家名(C) */
stateOrProvinceName = State or Province Name (full name) /* 省份(S) */
localityName = Locality Name (eg, city)                  /* 城市(LT) */
organizationName = Organization Name (eg, company) /* 公司(ON) */
organizationalUnitName      = Organizational Unit Name (eg, section) /* 部门(OU) */
/* 以下的commonName(CN)一般必须给,如果作为CA,那么需要在ca的policy中定义CN = supplied */
/* CN定义的是将要申请SSL证书的域名或子域名或主机名。 */
/* CN必须和将要访问的网站地址一样,否则访问时就会给出警告 */
commonName  = Common Name (eg, your name or your server\'s hostname) /* 主机名(CN) */
emailAddress            = Email Address /* Email地址,很多时候不需要该项 */

[v3_req]
keyUsage = keyCertSign /* 指定允许的密钥用法 */
/* 当basicConstraints=CA:TRUE时,表明要生成的证书请求文件是CA证书请求文件;*/
/* 当basicConstraints=CA:FALSE时,表明要生成的证书请求文件是终端证书请求文件;*/
basicConstraints = CA:TRUE
subjectAltName = @alt_names /* Subject Alternative Name (SAN),备用名称*/

[alt_names]
DNS.1 = ca.istio.io

1)首先,建立配置文件ca.cfg,内容如下:


[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no

[req_distinguished_name]
C = CN
ST = ××××××
L = ××××××
O = Istio
OU = Test
CN = Istio CA
emailAddress = caroot@istio.io

[v3_req]
keyUsage = keyCertSign
basicConstraints = CA:TRUE
subjectAltName = @alt_names

[alt_names]
DNS.1 = ca.istio.io

2)基于上述配置文件,通过如下命令生成根证书和密钥:


docker run --rm -v $(pwd):/key-and-certs frapsoft/openssl req -newkey rsa:2048 -nodes -keyout /key-and-certs/root-key.pem -x509 -days 3650 -out /key-and-certs/root-
cert.pem -config /key-and-certs/ca.cfg  

Generating a 2048 bit RSA private key
...............................................................+++
..........+++
writing new private key to '/key-and-certs/root-key.pem'

3)为确保生成的证书准确无误,可以通过如下命令进行查看:


docker run --rm -v $(pwd):/key-and-certs frapsoft/openssl  x509 -in /key-and-certs/root-cert.pem -noout -text

4)可以通过如下命令生成创建CA证书所需的私钥:


docker run --rm -v $(pwd):/key-and-certs frapsoft/openssl genrsa -out /key-and-
certs/ca-key.pem 2048

Generating RSA private key, 2048 bit long modulus
.....+++
...............................................+++
e is 65537 (0x10001)

该命含义如下:

·genrsa——使用RSA算法产生私钥。

·-out——输出文件的路径。

·2048——指定私钥长度。

5)通过如下命令生成CA证书签发申请文件(csr文件):


docker run --rm -v $(pwd):/key-and-certs frapsoft/openssl req -new -key /key-and-certs/ca-key.pem -out /key-and-certs/ca-cert.csr -config /key-and-certs/ca.cfg -batch -sha256

该命令含义如下:

·req——执行证书签发命令。

·-new——新证书签发请求。

·-key——指定私钥路径。

·-out——输出的csr文件的路径。

·-conf ig——使用的conf ig文件的名称。

·-batch——采用此选项生成证书请求时,不询问证书请求的各种信息。

·-sha256——指明签发的证书使用的哈希算法。

6)通过如下命令签发CA证书:


docker run --rm -v $(pwd):/key-and-certs frapsoft/openssl x509 -req -days 3650 -in /
key-and-certs/ca-cert.csr -sha256 -CA /key-and-certs/root-cert.pem -CAkey /key-and-certs/
root-key.pem -CAcreateserial -out /key-and-certs/ca-cert.pem -extensions v3_req -extfile 
/key-and-certs/ca.cfg

Signature ok
subject=/C=CN/ST=×××/L=×××/O=Istio/OU=Test/CN=Istio CA/emailAddress=caroot@istio.io
Getting CA Private Key

命令的含义如下:

·x509——生成x509格式证书。

·-req——输入csr文件。

·-days——证书的有效期(天)。

·-sha256——证书摘要采用的算法。

·-CA——指定CA证书的路径。

·-CAkey——指定CA证书的私钥路径。

·-CAcreateserial——表示创建证书序列号文件,名称为-CA指定的证书名称后加上.srl后缀。

·-extensions——使用的-extensions值为v3_req,v3_req中指定的basicConstraints的值为CA:TRUE,表示该证书是颁发给CA机构的。

·-in——要输入的csr文件。

·-out——输出的证书文件。

工作负载需要一个cert-chain.pem文件作为信任链,其中需要包含所有从根证书到工作负载证书之间的中间CA。在我们的例子中,它包含了Citadel的签署证书,所以cert-chain.pem和ca-cert.pem是一致的。

至此,我们已经创建了证书和密钥所需的文件:root-cert.pem、ca-key.pem、ca-cert.pem以及cert-chain.pem。