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.crtserver.crtserver.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

文章目录

随心笔记

技术无止境 创新不停驻