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自签
相关文章推荐
- CentOS6.5环境下OpenSSL实战:自己搭建CA中心,申请,签发,吊销,导入证书,SSL 握手详解
- 基于 OpenSSL 的 CA 建立及证书签发
- 基于 OpenSSL 的 CA 建立及证书签发
- Openssl生成CA及签发证书方法
- centos 配置Openssl并创建证书
- Openssl v3证书 配置文件。
- openssl建立证书,非常详细配置ssl+apache
- Openssl+Keytool自签发证书
- openssl建立证书,非常详细配置ssl+apache
- 基于Openssl的 CA建立 证书签发
- 使用openssl生成自签CA证书,并用其签发其他证书
- TOMCAT使用CA签发证书配置单向和双向SSL
- Puppet配置自动签发证书
- openssl 自签发https证书
- tomcat配置域名+https证书
- 利用OpenSSL签署多域名证书
- IIS 多域名多张证书配置
- 配置Nginx支持SSL SNI(一个IP绑定多个证书) 以及Haproxy实现多域名证书
- Nginx和openssl的配置以及秘钥和证书的生成
- salt reactor 自动完成Minion的证书签发和根据不同的业务完成不同states配置