Grpcs TLS 自签证书
由于微服务通讯需要进行数据加密以保证内网通讯安全。故此记录一下自签证书的生成过程。
以下是在 Linux 或 MacOS 系统上使用 OpenSSL 命令行工具生成自签名证书的步骤。这个过程将创建一个新的根证书(CA),然后使用这个根证书签名一个新的服务器证书。
先简明说明整体流程:
根证书:
1、生成根私钥
2、通过根私钥生成根证书
服务证书
1、生成服务私钥
2、通过服务私钥生成服务CSR
3、通过服务.csr 文件 + 根证书 + 根证书 key 签名出服务证书.crt文件
生成根证书的私钥
openssl genrsa -out ca.key 2048
这个命令将生成一个新的 RSA 私钥,长度为 2048 位。这个私钥将被保存到名为 ca.key
的文件中。
生成根证书
openssl req -new -x509 -days 365 -key ca.key -out ca.crt
这个命令将生成一个新的 X.509 根证书,使用 SHA-256 算法进行签名,有效期为 365 天 (可自己调整日期)。这个证书将被保存到名为 ca.crt
的文件中。
在执行这个命令时,OpenSSL 会提示你输入一些信息,这些信息将被包含在证书中。在大多数情况下,你可以直接按 Enter 键接受默认值。
但 Subject Name 或 Common Name 需要填写微服务端的名称。
生成服务器证书的私钥
openssl genrsa -out [service-name].key 2048
这个命令与第一个命令类似,生成的私钥将被保存到名为 [service-name].key
的文件中。[service-name] 为你自己的服务名称。
生成服务器证书的证书签名请求(CSR)
openssl req -new -key [service-name].key -out [service-name].csr
这个命令将生成一个新的证书签名请求(CSR),这个请求包含了服务器证书的公钥和一些附加信息。这个请求将被保存到名为 server.csr
的文件中。
同样,在执行这个命令时,OpenSSL 会提示你输入一些信息,这些信息将被包含在 CSR 中。
使用根证书签名服务器证书
openssl x509 -req -in [service-name].csr -CA ca.crt -CAkey ca.key -CAcreateserial -out [service-name].crt -days 365
这个命令将使用根证书对服务器证书进行签名,生成的证书将被保存到名为 server.crt
的文件中。
以上步骤生成的 rootCA.crt
、server.crt
和 server.key
就可以用于 GRPC 加密通讯了,配置到对应的服务器端以及客户端。
部分自定义内容
由于在GO更高的版本中,对证书内部分字段的值验证与获取有调整。(Go 1.15版本之后会获取证书alt_names字段信息进行服务名称验证)所以我们需要在生成证书时,指定部分自定义字段信息。
创建一个 san.cnf 文件内容如下:
[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn
[dn]
C = CN
ST = Beijing
L = Beijing
O = 'lynx'
OU = 'lynx'
emailAddress = 'lynx'
CN = [service-name]
[req_ext]
subjectAltName = @alt_names
[alt_names]
DNS.1 = [service-name]
[v3_ext]
authorityKeyIdentifier=keyid,issuer:always
basicConstraints=CA:FALSE
keyUsage=keyEncipherment,dataEncipherment,digitalSignature
extendedKeyUsage=serverAuth,clientAuth
subjectAltName=@alt_names
然后在上面的生成证书文件的步骤中带上
在生成服务csr文件时添加 -extensions req_ext -config san.cnf 命令
openssl req -new -key [service-name].key -out [service-name].csr -extensions req_ext -config san.cnf
在生成服务证书时,也需要添加 -extensions v3_ext -extfile san.cnf 命令
openssl x509 -req -in [service-name].csr -CA ca.crt -CAkey ca.key -CAcreateserial -out [service-name].crt -days 365 -extensions v3_ext -extfile san.cnf
这样生成出来的证书文件就包含了我们指定字段的内容,以及部分证书描述信息。
证书内容验证
可通过命令,查看生成出来的证书是否确实包含字段信息
openssl x509 -in [service-name].crt -text -noout