(原) 一文搞懂Https以及相关文件

原创文章,请后转载,并注明出处。

早就要求https了,毕竟加密后更安全。网上是有一些免费的证书申请。之前虽然也做过,不过没有系统的做过整理,总是有点糊。趁这次做一些整理,争取一篇文章把相关东西都搞明白。文章严格来说不算原创,严格来说很多知识都是前人的结晶,原创极少。 :)

一、一些概念

https双方是怎么吹牛的,看下图

  1. HTTPS 就是 HTTP + SSL 或者 HTTP + TLS 。其它的协议也类似,如FTPS=FTP+TLS。也就是说,HTTPS在传输层TCP和应用层HTTP之间,多走了一层SSL/TLS。SSL/TLS协议作用在传输层和应用层之间,对应用层数据进行加密传输。

  2. SSL和TLS都是加密协议。SSL,全称Secure Socket Layer。TLS,全称Transport Layer Security,是1999年基于SSL3.0版本上改进而来

  3. HTTPS被公认的三大优势有:数据加密,防窃听身份验证,防冒充完整性校验,防篡改

  4. CA,CA机构:Certificate Authority 机构/组织概念

  5. 数字证书,(CA)证书,HTTPS证书,SSL/TLS证书:CA签发的数字证书。

  6. 数字签名,(证书)指纹:CA签发的证书的内容之一,一段加密的密文。

  7. 一张完整的数字证书包括:

    主体的必要信息:版本(version)、序列号(serialNumber)、签名算法(signatureAlgorithm)、颁发者(issuer)、有效期(validity)、使用者(subject)、公钥信息(subjectPublicKeyInfo) 主体的扩展信息(extension):如密钥标识符、证书策略等数字签名(signature),也称指纹

  1. 数字证书的格式普遍采用的是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个过程

  1. 协商对称加密密钥SK的非对称加密阶段,称为TLS握手阶段。
  2. 使用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

  1. Beego

只需要在配置文件中添加,确实比较简单

EnableHTTPS = true
HTTPSCertFile = "a.pem"
HTTPSKeyFile = "a.key"
  1. 自己动手

抄一个网上的代码吧,比较简单

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)
}
  1. 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的,所以才会需要转化。

相关文章