先从一个需求案例说起
给甲方的web服务需要使用https,是部署在内网的,连域名也没有用ip访问,大家又不想花钱,于是自己生成一个https证书,参考【HTTPS】自签CA证书 && nginx配置https服务
数字证书系列–将证书绑定到多个URL以及IP,过程如下:
1、创建自签CA证书(根证书)
openssl genrsa -out CA_Key.key 2048 # 创建CA证书的私钥,用rsa加密,2048bit
openssl req -new -x509 -key CA_Key.key -out CA_Cert.crt # 利用CA_Key.key 创建CA证书. 生成的证书为CA_Cert.crt
2、制作生成网站的证书并用CA签名认证
openssl genrsa -out server.key 2048 # 服务端 创建网站私钥
openssl req -new -key server.key -out server.csr # 服务端 创建证书签名申请,是申请文件不是证书
openssl x509 -req -in server.csr -CA CA_Cert.crt -CAkey CA_Key.key -CAcreateserial -out server.crt #CA机构 创建crt(服务端公钥+申请者与颁发者信息+(用颁发者私钥进行的)签名)
流程梳理
上述案例对应的操作步骤,梳理后的流程如下图中“图A”所示,
其中对server端的两步操作也可以合并为一个命令,如上图中的“图B”所示,命令如下:
openssl req -newkey rsa:2048 -new -nodes -keyout my.key -out my.csr
也可以对整个流程合并为一个命令,如上图中的“图C”所示,命令如下:
openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout key.pem -out cert.pem
在https协议中是如何使用证书的
https建立连接到会话交互的过程如下所示
浏览器验证证书有效性,使用到了浏览器内置的CA证书,跟浏览器开发商有关,如下图所示:
概念梳理
SSL协议类
-
SSL - Secure Sockets Layer(安全套接字层),现在应该叫"TLS(传输层安全协议 Transport Layer Security)",但由于习惯问题,我们还是叫"SSL"比较多.http协议默认情况下是不加密内容的,这样就很可能在内容传播的时候被别人监听到,对于安全性要求较高的场合,必须要加密,https就是带加密的http协议,而https的加密是基于SSL的,它执行的是一个比较下层的加密,也就是说,在加密前,你的服务器程序在干嘛,加密后也一样在干嘛,不用动,这个加密对用户和开发者来说都是透明的.More:[维基百科]
-
OpenSSL - 简单地说,OpenSSL是SSL的一个实现,SSL只是一种规范.理论上来说,SSL这种规范是安全的,目前的技术水平很难破解,但SSL的实现就可能有些漏洞,如著名的"心脏出血".OpenSSL还提供了一大堆强大的工具软件,强大到90%我们都用不到.
证书标准和格式
-
X.509 - 这是一种证书标准,主要定义了证书中应该包含哪些内容.其详情可以参考RFC5280,SSL使用的就是这种证书标准.X.509证书,可能有不同的编码格式,有PEM和DER
- PEM - Privacy Enhanced Mail,打开看文本格式,以"-----BEGIN…"开头, "-----END…"结尾,内容是BASE64编码.查看PEM格式证书的信息:openssl x509 -in certificate.pem -text -noout
- DER Distinguished Encoding Rules,打开看是二进制格式,不可读
相关的文件扩展名
这是比较误导人的地方,虽然我们已经知道有PEM和DER这两种编码格式,但文件扩展名并不一定就叫"PEM"或者"DER",常见的扩展名除了PEM和DER还有以下这些,它们除了编码格式可能不同之外,内容也有差别,但大多数都能相互转换编码格式.
- CRT - CRT应该是certificate的三个字母,其实还是证书的意思,常见于*NIX系统
- CER - 还是certificate,还是证书,常见于Windows系统
- KEY - 通常用来存放一个公钥或者私钥,并非X.509证书,编码同样的,可能是PEM,也可能是DER.查看KEY的办法:
openssl rsa -in mykey.key -text -noout
- CSR - Certificate Signing Request,即证书签名请求,这个并不是证书,而是向权威证书颁发机构获得签名证书的申请,其核心内容是一个公钥(当然还附带了一些别的信息),在生成这个申请的时候,同时也会生成一个私钥,私钥要自己保管好.查看的办法:
openssl req -noout -text -in my.csr
- PFX/P12 - predecessor of PKCS#12,对*nix服务器来说,一般CRT和KEY是分开存放在不同文件中的,但Windows的IIS则将它们存在一个PFX文件中
- JKS - 即Java Key Storage,这是Java的专利,跟OpenSSL关系不大,利用Java的一个叫"keytool"的工具,可以将PFX转为JKS,当然了,keytool也能直接生成JKS,不过在此就不多表了.
其它常见名称
- 证书也叫“digital certificate”或“public key certificate”,好比公章
- CA是Certificate Authority的缩写,也叫“证书授权中心”,它是负责管理和签发证书的第三方机构,CA必须是所有行业和所有公众都信任的、认可的。
- CA证书,顾名思义,就是CA颁发的证书,证书=公钥+申请者与颁发者信息+签名;
- 浏览器中内置CA对应的证书称为根证书,颁发者和使用者相同,自己为自己签名,即自签名证书
openssl参数说明
openssl的参数有很多,我们只把用到的参数做下说明
- req
- newkey
- new
- nodes
- keyout key的输出文件
- out 输出文件
- days 授权有效期
参考:
- 【HTTPS】自签CA证书 && nginx配置https服务:例子不错,不过有些没讲明白,概念有点乱
- 数字证书系列–将证书绑定到多个URL以及IP : 实用技巧,例子不错
- HTTPS会话过程:https建立连接到会话的交互过程,比较详细,略繁琐
- HTTPS实现原理:讲解http到https的原因
- 浏览器如何验证SSL证书:如题
- How HTTPS Works (Actual Meaning of .key .csr and .crt): 老外的文章,需要翻墙,几张图挺专业
- CA证书与https讲解
- 那些证书相关的玩意儿(SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12等): 概念理得比非常清楚