您的位置:首页 > 运维架构

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

2017-12-12 22:38 579 查看

环境

翻译加实践

概述

HTTPS服务是工作在SSL/TLS上的HTTP。

首先简单区分一下HTTPS,SSL ,TLS ,OpenSSL这四者的关系:

SSL:(Secure Socket Layer,安全套接字层)是在客户端和服务器之间建立一条SSL安全通道的安全协议;

TLS:(Transport Layer Security,传输层安全协议),用于两个应用程序之间提供保密性和数据完整性;

TLS的前身是SSL;

OpenSSL是TLS/SSL协议的开源实现,提供开发库和命令行程序;

HTTPS是HTTP的加密版,底层使用的加密协议是TLS。

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

用OpenSSL配置带有SubjectAltName的ssl请求

对于多域名,只需要一个证书就可以保护非常多的域名。

SubjectAltName
X509 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


这个配置是告诉
openssl
CSR
中要包含
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
中。

要是之后,你又想生成一个不同的
SANs
CSR
文件,你需要编辑这个配置文件,并改变
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自签
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: