OpenSSL生成包含SAN的证书
正好需要生成包含SAN的证书
最近在学东西,发现 OpenSSL 生成的证书老是报错无法使用,到网上搜了一下,发现是 Golang 的原因,它需要用到包含 SAN 的证书而且还正好和我后面要学的 gRPC 有关
所以问题解决后就记录一下吧,可能到时候也会碰到这样的问题,刚好提前解决了
Wiki介绍
主题备用名称(Subject Alternative Name,缩写SAN)是一项对X.509的扩展,它允许在安全证书中使用subjectAltName字段将多种值与证书关联,这些值被称为主题备用名称
简单说就是可以一个证书签多个域名和IP了,减少了一个域名一个证书的开销
不过我现在只需要自签证书,也不存在需要花钱的问题
生成过程
修改配置文件
为了方便,可以把配置文件复制过来,修改复制过来的配置文件,这样以后别的什么问题需要修改配置文件的时候,不会影响到这边
Arch Linux 的配置文件在 /etc/ssl/openssl.cnf,直接复制过来
1 |
|
然后根据如下修改 openssl.cnf 文件,修改要注意在谁的下面修改,别改错地方了
1 |
|
- 域名和IP按照实际情况修改,没有就不填
服务端(CA)生成密钥和CA证书
由于我是自签证书,所以我直接让服务器当CA了
生成服务端密钥
1 |
|
- genrsa 生成的是RSA密钥
- -out 输出的密钥
- 2048 RSA密钥的长度为2048bit
服务端生成根CA证书
1 |
|
- req 请求
- -nodes CA 的节点,因为 CA 认证是树形的,一个 CA 就是一个节点
- -new 新建
- -x509 使用X.509公钥证书格式标准
- -days 证书有效期为10年
- -key 使用的密钥,因为是自签CA证书,所以使用服务端的密钥
- -out 输出的证书
在生成证书和后面生成请求的时候,会要求输入各种信息,如国家,地区等,如果不想用这个交互界面来输入的话,可以使用 -subj 参数
1 |
|
这样就可以免去交互界面,直接填好信息
客户端生成密钥和证书请求
生成客户端密钥
1 |
|
和生成服务端密钥一样
生成证书请求
1 |
|
- req 请求
- -new 新建
- -nodes 节点
- -key 客户端密钥
- -out 请求文件
- -config 配置文件,就是用刚才修改过的文件
- -extensions 使用配置文件中的哪一项,我在配置文件中 [ req ] 设置为了使用 v3_req ,而 v3_req 所设置需要为谁签名在 alt_names 中,alt_names 就是设置的 IP 和域名
然后就会获得一个请求文件 req.csr,可以用命令查看生成的请求文件
1 |
|
服务端签发证书
把客户端的请求文件req.csr拿过来,然后就可以签发客户端的证书了
1 |
|
- -in 传入的请求文件
- -out 输出的客户端证书
- -CA 使用的CA证书
- -CAkey 使用的密钥
- -CAcreateserial 和上面的nodes差不多,创建一个节点
- -extfile 使用的配置文件,这里还是用了修改后的配置文件,两边用的配置文件是一样的(自签证书不就是在一台主机上完成的吗 ॱଳॱ)
- -extensions 同客户端生成请求
查看证书
1 |
|
这样就获得了包含 SAN 的证书 client.crt,可以愉快的使用了 |•’-‘•) ✧
忙里偷闲,在学 Go 的过程中摸鱼去玩别的东西去了,还碰到了错误无法解决,到头来还是 Go 的问题
emmm…
学 Go 摸鱼 -> 碰到 Go 的问题 -> 解决 Go 的问题 -> 摸鱼摸回来了 (°⌓°)
弄完了这个继续当我的 GoGo人 (~ ̄▽ ̄)~