Linux下使用openssl自签发证书

前言

  一般,我们提供https网站服务需要购买 CA 机构签发的证书。但在某些情况下,例如:保护企业 Intranet 类网站的安全,我们就可以创建自己的 CA ,自签发免费的证书,往往比付费证书更有意义!

Linux 环境下我们可以利用 OpenSSL 来实现免费证书的签发。在签发免费证书之前我们需要了解一些公钥密码学的常识。


一、公钥密码学

1、公钥密码学



  PKI 是一个安全体系,它利用公钥密码学技术来管理和分发数字证书,以验证通信实体的身份。PKIXPKI 的一个具体实现标准,它定义了 PKI 体系结构的模型和操作协议。PKCS则为公钥密码学的应用提供了具体的标准和实现方式。它们相互协作,共同确保网络通信的安全性和可靠性。

  个人理解,就是 PKIXX.509 公钥证书标准的基础上,定义了PKI应该具备哪些基础组件、及组件间的操作协议,使得 PKI 系统的构建和管理更标准和规范。在各组件构建与管理中,PKCS 则为涉及到的密钥管理、加密算法、证书管理等提供了具体的标准和接口等。

2、平时最常见的各种文件拓展名:

PEMDER 编码的二进制数据再以 Base64 编码。
CRTcertificate 的缩写,linux 系统中比较常见,可能是PEM 编码,也可能是 DER 编码,但大多数应该是 PEM 编码。
CERcertificate 的缩写,常见于Windows 系统,同样的,可能是 PEM 编码,也可能是 DER 编码,但大多数应该是 DER 编码。
DER :以二进制编码格式保存证书,不包含私钥。这些证书也可以用 CER 或者 CRT 作为扩展名KEY – 通常用来存放一个公钥或者私钥,并非 X.509 证书,编码同样的,可能是 PEM ,也可能是 DER
JKSJava 的密钥存储文件,二进制格式,是一种 Java 特定的密钥文件格式, JKS 的密钥库和私钥可以用不同的密码进行保护。
CSRCertificate Signing Request ,即证书签名请求,不是证书,而是向 CA 获得签名证书的申请文件PFX/P12 PKCS#12 通过 DER 编码实现,以二进制格式保存证书,可以包含私钥,也可以不包含私钥。如果包含私钥那么通常会加密。

总结一下

  • 常见证书三种编码格式:DERPEMPKCS#12

  • 常见证书文件扩展名:CRTCERDER

  • 公钥和私钥文件扩展名:KEYJKS
  • 包含证书和私钥文件扩展名:PFX/P12
  • 证书签名请求文件扩展名:CSR

3、思考了几个傻傻的问题

梳理完上面一堆个概念还是一直懵懵懂懂,于是思考了几个傻傻的问题?

  • 数字证书是不是都是公钥证书,有私钥证书吗?

私钥证书并不是常见的表述,通常在公钥密码学中,我们谈及的是公钥证书,而不是私钥证书。私钥不应该被公开或包含在证书中,因为它是保持通信和交易安全性的关键。

  • 证书和密钥为什么要使用 ASN.1 描述?

ASN.1 提供了描述数据结构的能力,跨平台,统一的编解码,高效传输。

  • 证书和密钥为什么要使用ASN.1 的编码规则进行编码?

个人理解使用了ASN.1 定义了证书和密钥数据结构,使用 ASN.1 提供的编码规则进行编码,不需要考虑兼容性。而且通过 ASN.1 统一编码,通过定义的编码规则,变相约定了证书和秘钥的内容格式,使得证书和密钥更容易被管理。

二、浏览器的如何验证SSL/TLS证书SAN的

其他的不谈,我们只关心浏览器是如何匹配证书中的 Subject Alternative Name 字段的,有三种方法:

  1. 在地址栏中的主机名与证书主题 Subject中的 Common Name 完全匹配。
  2. 主机名与通配符 Common Name 相匹配。例如:www.example.com 匹配 * .example.com
  3. 主机名Subject Alternative Name 字段中列出

三、OpenSSL签发证书

使用 openssl req 工具时,不指定 -config 选项时,默认使用 /etc/pki/tls/openssl.cnf;

1、生成自签名的CA证书

一条命令生成CA的私钥文件 CA.key 和证书文件CA.crt

#nodes 私钥不加密
#days 证书有效期 10年是一个合理的时间
#v3_req v3_ca 参考openssl.cnf
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -subj "/C=CN/ST=HB/L=SJZ/O=lbaxe" -keyout CA.key -out CA.crt -reqexts v3_req -extensions v3_ca

当然也可以分步

#1.生成私钥 CA.key
openssl genrsa -out CA.key 2048

#2.生成csr请求文件 CA.csr
openssl req -new -key CA.key -subj "/C=CN/ST=HB/L=SJZ/O=lbaxe" -sha256 -out CA.csr

#3.生成CA自签名证书 CA.crt
openssl x509 -req -days 3650 -in CA.csr -signkey CA.key -out CA.crt

2、签发SSL证书

准备服务器 192.168.0.100 的私钥文件 server.key

openssl genrsa -out server.key 2048

生成证书请求文件 server.csr

# 公用名称 (Common Name) 简称CN SSL 证书,一般为网站域名或ip;而对于代码签名证书则为申请单位名称;而对于客户端证书则为证书申请者的姓名
# O 字段,SSL 证书,一般为网站域名;而对于代码签名证书则为申请单位名称;而对于客户端单位证书则为证书申请者所在单位名称
openssl req -new -key server.key -subj "/C=CN/ST=HB/L=SJZ/O=lbaxe/CN=192.168.0.100" -sha256 -out server.csr

准备服务器 192.168.0.100 的证书扩展文件 server.extsubjectAltName 填写多个ip(需包含证书请求CN),可以多个服务器共用扩展文件

[ req ]
default_bits        = 2048
default_md          = sha256
distinguished_name  = req_distinguished_name
x509_extensions     = SAN

[ req_distinguished_name ]
countryName         = CN
stateOrProvinceName     = Definesys
localityName            = Definesys
organizationName         = Definesys

[ SAN ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment,dataEncipherment
subjectAltName = @alt_names

[ alt_names ]
IP.1 = 192.168.0.100
IP.2 = 192.168.0.101

使用CA证书签发服务器证书 server.crt

openssl x509 -req -days 365 -in server.csr -CA CA.crt -CAkey CA.key -CAcreateserial -sha256 -out server.crt -extfile server.ext -extensions SAN

※参考数据与延伸阅读

  • https://www.digicert.com/faq/public-trust-and-certificates/what-is-a-multi-domain-san-certificate。
    • https://jamielinux.com/docs/openssl-certificate-authority/index.html。

Leave a Reply

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