Site Overlay

用OpenSSL签署自签名的SSL证书

前言

由于学习的需要,配置了一台服务器,服务器通过BMC和ESXi进行管理。这两个系统都是使用了Web方式进行管理的,在看着地址栏里面的“不安全”提示时,总是很扎眼,因此不如自己给服务器签发一个SSL证书,实现“安全”的访问。

What screams I'm insecure?

在之前配置SoftEther的时候,我曾经生成了一个自己的根CA证书,并且我的所有设备上都已经信任了这个证书,因此这次就使用这个证书来为服务器的SSL证书进行签名,这样就不需要重新调整证书信任设置。

转换证书格式

当初SoftEther生成的CA根证书我储存为了p12格式,需要先转换为标准的PEM格式:

openssl pkcs12 -in "Minaduki SSL CA.p12" -out "Minaduki SSL CA.key.pem" -nocerts -nodes
openssl pkcs12 -in "Minaduki SSL CA.p12" -out "Minaduki SSL CA.crt.pem" -clcerts -nokeys

转换完成后,获得了两个PEM文件,分别为证书和私钥的PEM。为p12文件设置的密码需要在转换时输入,转换完成后,私钥不再受到密码的保护

为需要SSL的服务生成私钥和证书

签发证书的大致流程是:

  1. 生成一个私钥文件。
  2. 编写一个配置文件,配置文件包含了证书的基本信息。
  3. 根据私钥和配置文件,生成证书签名请求文件。
  4. 使用CA密钥对对CSR进行签名,生成证书文件。

生成私钥

生成私钥非常简单:

openssl genrsa -out bmc.key 4096

其中-out参数指定输出文件,4096为RSA密钥的长度。

撰写配置文件

撰写的配置文件用于生成证书签名请求,其中req_distinguished_name中的项目会在生成CSR时交互式询问并记录在CSR中,而对应的default项目则会成为默认的输入。alt_names则是为了能够使用IP地址直连时必须使用的拓展,在这里可以指定服务器可选的域名或者IP地址。

由于工位的路由器是一个非常古老的网件R6300v2,DHCP服务器不支持给客户端下发主机名(我也懒得另外去配置),因此主要时间都是使用IP进行访问的。

另外,似乎一些浏览器会要求证书的Common Name必须是一个FQDN的域名(看起来是也是),所以不能使用IP地址作为Common Name。

[ req ]
default_md         = sha256
default_bits       = 4096
distinguished_name = req_distinguished_name
req_extensions     = req_ext

[ req_distinguished_name ]
countryName                 = Country Name (2 letter code)
countryName_default         = CN
stateOrProvinceName         = State or Province Name
stateOrProvinceName_default = Jiangsu
localityName                = Locality Name (eg, city)
localityName_default        = Nanjing
organizationName            = Organization Name (eg, company)
organizationName_default    = Minaduki Technologies
commonName                  = Common Name (e.g. server FQDN or YOUR name)
commonName_max              = 64
commonName_default          = direct.bmc.gpu.minaduki.cn

[ req_ext ]
subjectAltName = @alt_names

[alt_names]
DNS     = direct.bmc.gpu.minaduki.cn
IP      = 192.168.3.114

根据配置文件生成证书签名请求

openssl req -new -key bmc.key -config bmc.conf -out bmc.csr

由于在配置文件里面已经写好了默认值,直接一路回车就行。

根据CSR签发证书

openssl x509 -req -days 1850 -CA Minaduki\ SSL\ CA.crt.pem -CAkey Minaduki\ SSL\ CA.key.pem -CAcreateserial -in bmc.csr -out bmc.cert -extensions req_ext -extfile bmc.conf

这样就成功签发了一个SSL证书。

将私钥和证书改下拓展名上传到BMC上,刷新网页,就可以看见新证书生效了。

根据已有的CSR生成证书

和BMC不同,ESXi不能自行上传私钥,只能先由ESXi生成CSR,然后再上传CSR对应的证书。

ESXi支持根据FQDN或者IP地址生成CSR,但是IP地址作为Common Name不可行,因此只能生成FQDN的CSR。

那么FQDN是什么呢——localhost.localdomain

因此在签发证书的时候,需要通过配置文件指定alt_names,复制一份配置文件,仅修改其中alt_names段如下:

[alt_names]
DNS     = direct.esxi.gpu.minaduki.cn
IP      = 192.168.3.115

其他未修改的字段是用于生成CSR的,因此不会影响证书的正常签发。

修改完成后再使用配置文件签发证书即可。

openssl x509 -req -days 1850 -CA Minaduki\ SSL\ CA.crt.pem -CAkey Minaduki\ SSL\ CA.key.pem -CAcreateserial -in esxi.csr -out esxi.cert -extensions req_ext -extfile esxi.conf

将证书复制到ESXi的对话框中,刷新页面,新证书就能正常生效了。

参考:

  1. command – Converting PKCS#12 certificate into PEM using OpenSSL – Stack Overflow
  2. 使用openssl创建自签名证书 – 知乎

2 thoughts on “用OpenSSL签署自签名的SSL证书

  1. good
    还有一个思路是给所有服务器配置域名,然后签LE或者ZeroSSL(误)就是需要在内网部署服务自动更新服务器上的证书

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据