证书和密钥可以通过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。