OpenSSL生成包含SAN的证书

正好需要生成包含SAN的证书

最近在学东西,发现 OpenSSL 生成的证书老是报错无法使用,到网上搜了一下,发现是 Golang 的原因,它需要用到包含 SAN 的证书而且还正好和我后面要学的 gRPC 有关
所以问题解决后就记录一下吧,可能到时候也会碰到这样的问题,刚好提前解决了

Wiki介绍

主题备用名称(Subject Alternative Name,缩写SAN)是一项对X.509的扩展,它允许在安全证书中使用subjectAltName字段将多种值与证书关联,这些值被称为主题备用名称
简单说就是可以一个证书签多个域名和IP了,减少了一个域名一个证书的开销
不过我现在只需要自签证书,也不存在需要花钱的问题

生成过程

修改配置文件

为了方便,可以把配置文件复制过来,修改复制过来的配置文件,这样以后别的什么问题需要修改配置文件的时候,不会影响到这边
Arch Linux 的配置文件在 /etc/ssl/openssl.cnf,直接复制过来

1
cp /etc/ssl/openssl.cnf openssl.cnf

然后根据如下修改 openssl.cnf 文件,修改要注意在谁的下面修改,别改错地方了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[ CA_default ]
...
copy_extensions = copy # 取消注释
...

[ req ]
...
req_extensions = v3_req # 取消注释
...

[ v3_req ]
...
subjectAltName = @alt_names # 增加这一行
...

[alt_names] # 增加这一区块
IP.1 = <IP address> # 服务端 IP 地址
DNS.1 = *.org.example.com # 1号域名
DNS.2 = *.example.com # 2号域名
  • 域名和IP按照实际情况修改,没有就不填

服务端(CA)生成密钥和CA证书

由于我是自签证书,所以我直接让服务器当CA了
生成服务端密钥

1
openssl genrsa -out server.key 2048
  • genrsa 生成的是RSA密钥
  • -out 输出的密钥
  • 2048 RSA密钥的长度为2048bit

服务端生成根CA证书

1
2
3
4
5
openssl req -nodes \
-new -x509 \
-days 3650 \
-key server.key \
-out ca.crt
  • req 请求
  • -nodes CA 的节点,因为 CA 认证是树形的,一个 CA 就是一个节点
  • -new 新建
  • -x509 使用X.509公钥证书格式标准
  • -days 证书有效期为10年
  • -key 使用的密钥,因为是自签CA证书,所以使用服务端的密钥
  • -out 输出的证书

在生成证书和后面生成请求的时候,会要求输入各种信息,如国家,地区等,如果不想用这个交互界面来输入的话,可以使用 -subj 参数

1
-subj "/C=CN/OU=myOrg/O=myComp/CN=myName"

这样就可以免去交互界面,直接填好信息

客户端生成密钥和证书请求

生成客户端密钥

1
openssl genrsa -out client.key 2048

和生成服务端密钥一样

生成证书请求

1
2
3
4
5
openssl req -new -nodes \
-key client.key \
-out req.csr \
-config openssl.cnf \
-extensions v3_req
  • req 请求
  • -new 新建
  • -nodes 节点
  • -key 客户端密钥
  • -out 请求文件
  • -config 配置文件,就是用刚才修改过的文件
  • -extensions 使用配置文件中的哪一项,我在配置文件中 [ req ] 设置为了使用 v3_req ,而 v3_req 所设置需要为谁签名在 alt_names 中,alt_names 就是设置的 IP 和域名

然后就会获得一个请求文件 req.csr,可以用命令查看生成的请求文件

1
openssl req -noout -text -in req.csr

服务端签发证书

把客户端的请求文件req.csr拿过来,然后就可以签发客户端的证书了

1
2
3
4
5
6
7
8
9
openssl x509 -req \
-days 3650 \
-in req.csr \
-out client.crt \
-CA ca.crt \
-CAkey server.key \
-CAcreateserial \
-extfile openssl.cnf \
-extensions v3_req
  • -in 传入的请求文件
  • -out 输出的客户端证书
  • -CA 使用的CA证书
  • -CAkey 使用的密钥
  • -CAcreateserial 和上面的nodes差不多,创建一个节点
  • -extfile 使用的配置文件,这里还是用了修改后的配置文件,两边用的配置文件是一样的(自签证书不就是在一台主机上完成的吗 ॱଳॱ)
  • -extensions 同客户端生成请求

查看证书

1
openssl x509 -noout -text -in client.crt

这样就获得了包含 SAN 的证书 client.crt,可以愉快的使用了 |•’-‘•) ✧


忙里偷闲,在学 Go 的过程中摸鱼去玩别的东西去了,还碰到了错误无法解决,到头来还是 Go 的问题
emmm…
学 Go 摸鱼 -> 碰到 Go 的问题 -> 解决 Go 的问题 -> 摸鱼摸回来了 (°⌓°)
弄完了这个继续当我的 GoGo人 (~ ̄▽ ̄)~