使用openssl签发ssl证书

如果想给自己的服务用上ssl,需要证书服务,一般都需要购买才行,但是其实主要是信任的问题,所以完全可以用自己的自签名的证书(只要自己想办法确认私钥不会泄露)

步骤

openssl生成rsa秘钥

1
openssl genrsa -out root.rsa.key 2048

使用秘钥生成证书申请

1
openssl req -new -key root.rsa.key -out root.rsa.csr

再用生成的秘钥自己给自己签名

1
openssl x509 -req -in root.rsa.csr -out root.crt -signkey root.rsa.key -days 365

如此生成了一个有效期一年的自签名证书。

如果要在不同的域名(或者IP)上使用ssl,还需要针对每一个主机各自签发证书。步骤类似的

note:按照接下来这几步生成的证书现在浏览器已经不认了,建议直接跳转到后两小节Subject Alternatice Name

note2:由于安卓手机对安装的CA证书有限制,所以需要在生成root证书时,加上CA:TRUE的扩展字段,生成这类证书的过程参考这里[9]

生成秘钥

1
openssl genrsa -out server.rsa.key 2048

使用秘钥生成证书申请

1
openssl req -new -key server.rsa.key -out server.rsa.csr

再用刚刚的根证书对这个证书申请签名

1
openssl x509 -req -in server.rsa.csr -out server.crt -days 365 -CA root.crt -CAkey root.rsa.key -CAcreateserial -sha256

如此签发了一个有效期一年的证书。

but

但是目前测试在客户端(Edge on Windows11)上试了一下还是会报错,虽然windows已经把root.crt安装到可信的根证书颁发机构。Chrome报错是net::ERR_CERT_COMMON_NAME_INVALID

Subject Alternative Name

根据IdeaWand[7]的说法,现在的浏览器基本上都放弃了CommonName。转而使用Subject Alternative Name,所以需要生成带有SAN的证书。

所以在生成服务器的证书的时候需要指定这些extension。根据zmc[8]的教程

首先生成根证书的过程是不变的

1
2
3
openssl genrsa -out root.rsa.key 2048
openssl req -new -key root.rsa.key -out root.rsa.csr
openssl x509 -req -in root.rsa.csr -out root.crt -signkey root.rsa.key -days 365

然后生成服务器证书的秘钥也是不变的

1
openssl genrsa -out server.rsa.key 2048

然后需要编写配置文件,在配置文件中指定一些extension字段,server.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[ req ]
default_bits = 2048
prompt = no
default_md = sha256
req_extensions = v3_ext
distinguished_name = dn

[ dn ]
C = CN
ST = Province Name
L = City
O = Organization Name
OU = Organization Unit Name
CN = Common Name

[ req_ext ]
subjectAltName = @alt_names

[ alt_names ]
DNS.1 = DNS name 1 # 域名
DNS.2 = DNS name 2 # 另一个域名
IP.1 = IP 1 # IP地址
IP.2 = IP 2 # 另一个IP地址

[ v3_ext ]
basicConstraints=CA:FALSE
# keyUsage=keyEncipherment,dataEncipherment
# extendedKeyUsage=serverAuth,clientAuth
subjectAltName=@alt_names

注释掉的行大概是一些控制证书的用途的字段,不知道是哪一行导致的不能用于https,所以就都注释掉了。

然后依赖这个配置文件,生成服务器证书的申请

1
openssl req -new -key server.rsa.key -out server.rsa.csr -config server.conf

然后使用自签名的根证书,签发服务器证书。

1
openssl x509 -req -in server.rsa.csr -out server.crt -days 365 -CA root.crt -CAkey root.rsa.key -CAcreateserial -sha256 -extensions v3_ext -extfile server.conf

然后得到的server.crt就是有效的证书,然后就[6]可以用于https了。

image-20241207215657035

References


使用openssl签发ssl证书
http://zr4in.github.io/2024/12/07/使用openssl签发ssl证书/
作者
zr4in
发布于
2024年12月7日
许可协议