早就要求https了,毕竟加密后更安全。网上是有一些免费的证书申请。之前虽然也做过,不过没有系统的做过整理,总是有点糊。趁这次做一些整理,争取一篇文章把相关东西都搞明白。文章严格来说不算原创,严格来说很多知识都是前人的结晶,原创极少。 :)
一、一些概念
https双方是怎么吹牛的,看下图
-
HTTPS 就是 HTTP + SSL 或者 HTTP + TLS 。其它的协议也类似,如FTPS=FTP+TLS。也就是说,HTTPS在传输层TCP和应用层HTTP之间,多走了一层SSL/TLS。SSL/TLS协议作用在传输层和应用层之间,对应用层数据进行加密传输。
-
SSL和TLS都是加密协议。SSL,全称Secure Socket Layer。TLS,全称Transport Layer Security,是1999年基于SSL3.0版本上改进而来
-
HTTPS被公认的三大优势有:数据加密,防窃听身份验证,防冒充完整性校验,防篡改
-
CA,CA机构:Certificate Authority 机构/组织概念
-
数字证书,(CA)证书,HTTPS证书,SSL/TLS证书:CA签发的数字证书。
-
数字签名,(证书)指纹:CA签发的证书的内容之一,一段加密的密文。
-
一张完整的数字证书包括:
主体的必要信息:版本(version)、序列号(serialNumber)、签名算法(signatureAlgorithm)、颁发者(issuer)、有效期(validity)、使用者(subject)、公钥信息(subjectPublicKeyInfo) 主体的扩展信息(extension):如密钥标识符、证书策略等数字签名(signature),也称指纹
- 数字证书的格式普遍采用的是X.509国际标准。X.509标准的证书文件具有不同的编码格式:PEM和DER。
二、安全验证
单向验证
单向验证是指通信双方中一方验证另一方是否合法。通常是指客户端验证服务器。
客户端需要:ca.crt
服务器需要:server.crt,server.key
我们平时使用 PC 上网时使用的就是单向验证的方式。即,我们验证我们要访问的网站的合法性。PC 中的浏览器(火狐、IE、chrome等)已经包含了很多 CA 的根证书(ca.crt)。当我们访问某个网站(比如:https://www.baidu.com)时,网站会将其证书(server.crt)发送给浏览器,浏览器会使用 ca.crt 验证 server.crt 是否合法。如果发现访问的是不合法网站,浏览器会给出提示。
现实中,有的公司会使用自签发证书,即公司自己生成根证书(ca.crt)。如果我们信任此网站,那么需要手动将其证书添加到系统中。
双向验证
双向验证是指通信双方需要互相验证对方是否合法。服务器验证客户端,客户端验证服务器。
客户端需要:ca.crt,client.crt,client.key
服务器需要:ca.crt,server.crt,server.key
双向验证通常用于支付系统中,比如支付宝。我们在使用支付宝时必须下载数字证书,该证书就是支付宝颁发给针对我们这台机器的证书,我们只能使用这台机器访问支付宝。如果换了机器,那么要重新申请证书。
HTTPS为什么同时要有对称加密和非对称加密两种加密方式?
(1) 对称加密加密与解密使用的是同样的密钥,所以速度快,但由于需要将密钥在网络传输,所以安全性不高。
(2) 非对称加密使用了一对密钥,公钥与私钥,所以安全性高,但加密与解密速度慢。
(3) 解决的办法是将对称加密的密钥使用非对称加密的公钥进行加密,然后发送出去,接收方使用私钥进行解密得到对称加密的密钥,然后双方可以使用对称加密来进行沟通。
通过以上问题,我们知道了HTTPS分为2个过程:
- 协商对称加密密钥SK的非对称加密阶段,称为TLS握手阶段。
- 使用SK对数据(对话内容)进行对称加密的阶段,称为数据通信阶段。
基于非对称加密算法
基于专用密钥交换算法
三、相关文件
扩展名 | 功能 | 说明 |
---|---|---|
.key | 私钥文件 | |
.cer | 证书文件 | |
.crt | 证书文件 | 可以是二进制,也可以是文本格式 |
.req | 请求文件 | |
.csr | 请求文件 | 证书私钥和证书请求文件(Certificate Signing Request,简称 CSR)。CSR文件是您的公钥证书原始文件,包含了您的服务器信息和您的单位信息,需要提交给CA认证中心进行审核。 |
.der | 证书文件der格式 | 全称Distinguished Encoding Rules,以二进制存储 |
.pem | 证书文件pem格式 | 全称Privacy Enhanced Mail,以文本格式存储。存放证书或私钥,或者两者都包含。如果只包含私钥,一般用.key文件代替。chain.pem 证书链文件,public.pem 证书公钥文件,有些已将两个文件合并。 |
key+crt 常用于Apache,Nginx等
** PEM **
查看PEM格式证书的信息一般采用如下命令:openssl x509 -in xxx.pem -text -noout
Apache和Nginx服务器偏向于使用这种编码格式.
** DER **
文件结构无法直接预览,只能通过如下命令查看:openssl x509 -in xxx.der -inform der -text -noout
DER格式也可以存储公钥、私钥、证书签名请求等数据。Java和Windows应用偏向于使用这种编码格式。
同一X.509证书的不同编码之间可以互相转换:
PEM 转为 DER:
openssl x509 -in xxx.pem -outform der -out xxx.der
DER 转为 PEM:
openssl x509 -in xxx.der -inform der -outform pem -out xxx.pem
证书文件内容样式:
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
私钥文件内容样式:
-----BEGIN RSA PRIVATE KEY-----
-----END RSA PRIVATE KEY-----
请求文件内容样式:
-----BEGIN CERTIFICATE REQUEST-----
-----END CERTIFICATE REQUEST-----
四、生成私人证书
测试程序时如果没有证书,我们可以使用openssl来生成私人的证书。
(1)首先我们先生成证书私钥 openssl genrsa -out server.key 2048 (2)根据私钥生成公钥 openssl rsa -in server.key -out server.key.public (3)根据私钥生成证书 openssl req -new -x509 -key server.key -outserver.crt -days 365
五、免费申请
六、Go的https
- Beego
只需要在配置文件中添加,确实比较简单
EnableHTTPS = true
HTTPSCertFile = "a.pem"
HTTPSKeyFile = "a.key"
- 自己动手
抄一个网上的代码吧,比较简单
package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hi, This is an example of https service in golang!")
#fmt.Println(r.Proto) //打印http协议版本
#w.Write([]byte("<h1>hello world!</h1>"))
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServeTLS(":8081", "server.crt", "server.key", nil)
}
- Nginx+Beego+Mr2 内网服务
nginx在于我主要还是作多域名跳转
server {
listen 80;
listen 443 ssl;
server_name x.scwy.net;
ssl_certificate /data/ddns/x_scwy_net.pem;
ssl_certificate_key /data/ddns/x_scwy_net.key;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:9900/;
proxy_redirect off;
}
}
我理解它是http80和https443都转向9900
服务端: mr2 server -l :12345 -p password
客户端: mr2 client -s 120.15.40.148:12345 -p password -P 9900 -c 127.0.0.1:7373
mr2使用12345端口进行通讯,将本地的7373端口映射到服务器上的9900端口。本地端口http为7373,https为10443。
不过以上实现的结果是,所有http和https://x.scwy.net都走了本地的http协议(7373)。将mr2 7373改为10443,却不能访问到本地。
这样,即使我关闭了beego的https也没区别。这个问题留到以后再研究。
七、其它
根据需求不同,网上对认证有不同的价格。
后缀名cer和crt的不同之处:
.CRT = 扩展名CRT用于证书bai。证书可以du是DER编码,也可以是PEM编码。扩展名CER和zhiCRT几乎是同义词。这种dao情况在各种unix/linux系统中很常见。
CER = CRT证书的微软型式。可以用微软的工具把CRT文件转换为CER文件(CRT和CER必须是相同编码的,DER或者PEM)。扩展名为CER的文件可以被IE识别并作为命令调用微软的cryptoAPI
最简单的说法就是,cer是Windows系统使用的证书,crt是Linux和Unix上使用的证书。大部分服务器都是Linux或者Unix的,所以才会需要转化。