OpenSSL自签发配置有多域名或ip地址的证书

35 篇文章 1 订阅
35 篇文章 1 订阅

环境

翻译加实践

概述

HTTPS服务是工作在SSL/TLS上的HTTP。
首先简单区分一下HTTPS,SSL ,TLS ,OpenSSL这四者的关系:

  1. SSL:(Secure Socket Layer,安全套接字层)是在客户端和服务器之间建立一条SSL安全通道的安全协议;
  2. TLS:(Transport Layer Security,传输层安全协议),用于两个应用程序之间提供保密性和数据完整性;
  3. TLS的前身是SSL;
  4. OpenSSL是TLS/SSL协议的开源实现,提供开发库和命令行程序;
  5. HTTPS是HTTP的加密版,底层使用的加密协议是TLS。

结论:SSL/TLS 是协议,OpenSSL是协议的代码实现。

用OpenSSL配置带有SubjectAltName的ssl请求

对于多域名,只需要一个证书就可以保护非常多的域名。
SubjectAltNameX509 Version 3 (RFC 2459)的扩展,允许ssl证书指定多个可以匹配的名称。

SubjectAltName 可以包含email 地址,ip地址,正则匹配DNS主机名,等等。
ssl这样的一个特性叫做:SubjectAlternativeName(简称:san

生成证书请求文件

对于一个通用的ssl证书请求文件(CSR),openssl不需要很多操作。
因为我们可能需要添加一个或者两个SAN到我们CSR,我们需要在openssl配置文件中添加一些东西:你需要告诉openssl创建一个包含x509 V3扩展的CSR,并且你也需要告诉openssl在你的CSR中包含subject alternative names列表。

创建一个openssl配置文件(openssl.cnf),并启用subject alternative names

找到req段落。这段落的内容将会告诉openssl如何去处理证书请求(CSR)。
req段落中应该要包含一个以req_extensions开始的行。如下:

[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req

这个配置是告诉opensslCSR中要包含v3_req段落的部分。
现在我们来配置v3_req,如下:

[req_distinguished_name]
countryName = Country Name (2 letter code)
countryName_default = US
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = MN
localityName = Locality Name (eg, city)
localityName_default = Minneapolis
organizationalUnitName  = Organizational Unit Name (eg, section)
organizationalUnitName_default  = Domain Control Validated
commonName = Internet Widgits Ltd
commonName_max  = 64

[ v3_req ]
# Extensions to add to a certificate request
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = kb.example.com
DNS.2 = helpdesk.example.org
DNS.3 = systems.example.net
IP.1 = 192.168.1.1
IP.2 = 192.168.69.14

请注意:无论v3_req放哪里,都是可以的,都会在所有生成的CSR中。
要是之后,你又想生成一个不同的SANsCSR文件,你需要编辑这个配置文件,并改变DNS.x列表。

生成私钥

首先我们创建一个私钥:

openssl genrsa -out san_domain_com.key 2048
# 如果是生成ca的使用,建议这样
openssl genrsa -out ca.key 2048

这里的san_domain_com,是你正式使用的服务器的全称地址,这不是必须的,也就是说,你可以随便取名字;但是按照这个格式去,会更清晰点。

创建CSR文件

执行下面语句:

openssl req -new -out san_domain_com.csr -key san_domain_com.key -config openssl.cnf
# 注意这里指定了openssl.cnf,使用了上面我们创建的,因为默认是没有`san`。
# 如果之前创建的是ca.key
openssl req -new -out ca.csr -key c.key -confaig openssl.cnf

执行后,系统会提示你要你输入组织信息,并询问你是否想要包含密码(你可以不需要)。接着你将会看到san_domain_com.csr被创建。

检查我们是否创建好了,我们可以使用下面的命令来查看CSR包含的信息:

openssl req -text -noout -in san_domain_com.csr
# 如果是ca.csr
openssl req -text -noout -in ca.csr

你将会看到类似如下的信息:

Certificate Request:
Data:
Version: 0 (0x0)
Subject: C=US, ST=Texas, L=Fort Worth, O=My Company, OU=My Department, CN=server.example
Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public Key: (2048 bit)
Modulus (2048 bit): blahblahblah
Exponent: 65537 (0x10001)
Attributes:
Requested Extensions: X509v3
Basic Constraints: CA:FALSE
X509v3 Key Usage: Digital Signature, Non Repudiation, Key Encipherment
X509v3 Subject Alternative Name: DNS:kb.example.com, DNS:helpdesk.example.com
Signature Algorithm: sha1WithRSAEncryption
blahblahblah

好了现在我们有了一个新的CSR,接着我们需要对它进行签署。

自签名并创建证书

openssl x509 -req -days 3650 -in san_domain_com.csr -signkey san_domain_com.key
 -out san_domain_com.crt-extensions v3_req -extfile openssl.cnf

# 如果是ca.csr
openssl x509 -req -days 3650 -in ca.csr -signkey ca.key
 -out ca.crt-extensions v3_req -extfile openssl.cnf

说明下:上面的证书 有效期是3650天。

至此就创建完毕。


以下是我自己扩展:

上面只是把ca证书给生成出来了,但是如何利用生成的ca来签名客户端的证书呢?

创建客户端私钥

openssl genrsa -out client.key 1024

这和上面是一样的,就是名称改下;

创建证书请求文件CSR

openssl req -new -key client.key -out client.csr -config openssl.cnf -extensions v3_req

利用ca.crt来签署client.csr

openssl x509 -req -sha256 -extfile v3.ext -CA ca.crt -CAkey ca.key -CAcreateserial -in client.csr -out client.crt

# 或者 把v3.ext 改为 openssl.cnf
openssl x509 -req -sha256 -extfile openssl.cnf -CA ca.crt -CAkey ca.key -CAcreateserial -in client.csr -out client.crt

说明:
sha256是哈希算法
v3.ext是要自己创建的

v3.ext

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage=digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName=@alt_names

[alt_names]
DNS.1=www.test.com
IP.1 = 192.168.1.1

至此就生成出了,客户端的证书。

同理服务器端证书是一样的。

文件数量:
ca: ca.key、ca.csr、ca.crt
client: client.key、client.csr 、 client.crt

以下是我自己实际执行的语句:

# 生成ca
openssl genrsa -out ca.key 1024
openssl req -new -key ca.key -out ca.csr -config openssl.cnf -extensions v3_req
openssl x509 -req -in ca.csr -signkey ca.key -out ca.crt -extfile openssl.cnf -extensions v3_req
# 生成client
openssl genrsa -out client.key 1024
openssl req -new -key client.key -out client.csr -config openssl.cnf -extensions v3_req
openssl x509 -req -sha256 -extfile v3.ext -CA ca.crt -CAkey ca.key -CAcreateserial -in client.csr -out client.crt

可以用来查看签发的证书的详细信息
openssl x509 -text -noout -in client.crt

可以用来查看该 CA 下所有已撤消证书的 详细信息
openssl crl -in crl.pem -noout -text

参考地址:

Multiple Names on One Certificate

HTTPS自签发CA证书

OpenSSL SAN 证书

OpenSSL创建带SAN扩展的证书并进行CA自签

  • 10
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
配置一个支持多个域名OpenSSL 证书,可以按照以下步骤进行: 1. 编写一个 OpenSSL 配置文件(通常以 .cnf 结尾),可以参考以下示例: ``` [ req ] default_bits = 2048 distinguished_name = req_distinguished_name req_extensions = req_ext [ req_distinguished_name ] countryName = XX stateOrProvinceName = XXXX localityName = XXXX organizationName = XXXX commonName = example.com [ req_ext ] subjectAltName = @alt_names [ alt_names ] DNS.1 = example.com DNS.2 = www.example.com DNS.3 = subdomain.example.com ``` 2. 运行以下 OpenSSL 命令生成证书和私钥: ``` openssl req -new -newkey rsa:2048 -nodes -keyout example.com.key -out example.com.csr -config example.com.cnf openssl x509 -req -sha256 -days 365 -in example.com.csr -signkey example.com.key -out example.com.crt -extfile example.com.cnf -extensions req_ext ``` 其中 example.com.key 是私钥文件,example.com.csr 是证书请求文件,example.com.crt 是证书文件。 3. 将生成的证书和私钥文件配置到 Web 服务器上,具体操作可以参考不同 Web 服务器的文档。例如,在 Apache 上可以使用以下配置: ``` SSLEngine on SSLCertificateFile /path/to/example.com.crt SSLCertificateKeyFile /path/to/example.com.key ``` 4. 如果需要支持更多域名,只需要在 OpenSSL 配置文件的 alt_names 中添加更多 DNS 记录即可。例如: ``` [ alt_names ] DNS.1 = example.com DNS.2 = www.example.com DNS.3 = subdomain.example.com DNS.4 = example.net DNS.5 = www.example.net ``` 5. 生成新的证书和私钥文件,将其配置到 Web 服务器上即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山鬼谣me

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值