生成https license 以及握手过程

 

方法一:

1.key的生成 

1
openssl genrsa -des3 -out server.key 2048

这样是生成rsa私钥,des3算法,openssl格式,2048位强度。server.key是密钥文件名。为了生成这样的密钥,需要一个至少四位的密码。

 

2. 生成CA的crt

1
openssl req -new -x509 -key server.key -out ca.crt -days 3650

生成的ca.crt文件是用来签署下面的server.csr文件。 

3. csr的生成方法

1
openssl req -new -key server.key -out server.csr

需要依次输入国家,地区,组织,email。最重要的是有一个common name,可以写你的名字或者域名。如果为了https申请,这个必须和域名吻合,否则会引发浏览器警报。生成的csr文件交给CA签名后形成服务端自己的证书。 

4. crt生成方法

CSR文件必须有CA的签名才可形成证书,可将此文件发送到verisign等地方由它验证,要交一大笔钱,何不自己做CA呢。

1
openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey server.key -CAcreateserial -out server.crt

输入key的密钥后,完成证书生成。-CA选项指明用于被签名的csr证书,-CAkey选项指明用于签名的密钥,-CAserial指明序列号文件,而-CAcreateserial指明文件不存在时自动生成。

最后生成了私用密钥:server.key和自己认证的SSL证书:server.crt

证书合并:

1
cat server.key server.crt > server.pem

 

 

 

 

 

 

方法二:

 

/确定是否安装openssl

which openssl

//如果没有安装,通过apt-get或者yum等方式安装即可

sudo apt-get install openssl

//生成一个名为“ssl.key”的 RSA key文件:执行结果:生成ssl.pass.key 和 ssl.key

openssl genrsa -des3 -passout pass:1234 -out ssl.pass.key 2048
openssl rsa -passin pass:1234 -in ssl.pass.key -out ssl.key

//删除中间文件

rm ssl.pass.key

接着,利用已经生成的 ssl.key 文件,进一步生成 ssl.csr 文件:

openssl req -new -key ssl.key -out ssl.csr

执行此行命令会提示输入密码,按回车即可,因为前面我们在生成 ssl.key 时选择了密码留空。 最后我们利用前面生成的 ssl.key 和 ssl.csr 文件来生成 ssl.crt 文件,也就是自签名的 SSL 证书文件:

openssl x509 -req -days 365 -in ssl.csr -signkey ssl.key -out ssl.crt

这一步之后,我们得到一个自签名的 SSL 证书文件 ssl.crt,有效期为 365 天。此时,ssl.csr 文件也已经不再被需要,可以删除掉了:

rm ssl.csr




123123




将crt和key合并成pfx

openssl pkcs12 -export -out server.pfx -inkey server.key -in server.crt

pfx:PKCS #12,是公钥加密标准(Public Key Cryptography Standards)系列的一种。简单理解就是将私钥和数字证书打包在一起了。

wireshark 需要 pkcs#12

2、扩展名

pem:采用pem编码的数字证书。

der:采用der编码的数字证书。

crt:可能是pem编码,也可能是der编码。但大多数情况下为pem编码的数字证书。

cer:可能是pem编码,也可能是der编码。但大多数情况下为der编码的数字证书。

key:用来存放公钥或私钥。

csr:证书请求文件。

 

==============================================以下来自http://t.zoukankan.com/cangqinglang-p-15078813.html======

HTTPS通信原理-证书交换

 

TLS握手过程

握手简述(以RSA为例):

  • client hello:客户端给出TLS协议版本号,支持的加密算法、随机数Client random、扩展字段
  • server hello:服务端确认双方可支持的加密算法,并把数字证书下发给客户端。同时也会生成一个随机数Server random
  • 客户端验证证书的有效性,并重新生成一个随机数Pre-main secret,使用证书中的公钥加密随机数,发送给服务端
  • 服务端使用私钥获取随机数
  • 客户端与服务端根据约定的加密算法,使用前面的三个随机数,生成对话密钥Session key,用来加密后续会话。

TLS需要知道的名词

1.会话密钥(Session key)

这是握手的最终结果。它是对称密码的密钥,并允许客户端和服务器相互加密消息。

2.客户端随机(Client random)

这是由客户端创建的32个字节的序列。它对于每个连接都是唯一的,并且应该包含四个字节的时间戳,后跟28个随机字节。最近,谷歌浏览器切换为使用32个字节的随机数,以防止客户端指纹。这些随机值通常称为随机数(nonce)。

3.服务器随机数(Server random)

服务器随机数与客户端随机数相同,只是服务器生成的随机数相同。

4.Pre-main密钥(Pre-main secret)

这是一个48字节的数据块。它可以与客户端随机变量和服务器随机变量结合使用,以使用“伪随机函数”(PRF)创建会话密钥(Session key)。

5.密码套件(Cipher suite)

CipherSpecs 用于认证加密算法和信息摘要算法的组合,通信双方必须同意这个密码规范才能进行通信。而 CipherSuites 则定义了 SSL / TLS 安全连接中所使用的加密算法的组合,该组合包含三种不同的算法:

  • 握手期间所使用的的密钥交换和认证算法 (最常用的是 RSA 算法)
  • 加密算法 (用于握手完成后的对称加密,常用的有 AES、3DES等)
  • 信息摘要算法 (常用的有 SHA-256、SHA-1 和 MD5 等)

CipherSuites是用于组合构成TLS连接的算法的唯一标识符。它为以下列出的每个功能定义一种算法:

  • 密钥建立(通常是Diffie-Hellman变体或RSA)
  • 认证(证书类型)
  • 机密性(对称密码)
  • 完整性(哈希函数)

例如,密码套件是“ ECDHE-ECDSA-AES256-GCM-SHA384”,它定义了一个使用以下内容的会话:

  • Elliptic Curve Diffie-Hellman Ephemeral(ECDHE)密钥交换以建立密钥
  • Elliptic Curve Digital Signature Algorithms(ECDSA)进行身份验证
  • 256-bit Advanced Encryption Standard in Galois/Counter mode (GCM) 用于确保机密性
  • 384位的SHA(安全哈希算法)确保完整性

RSA握手

 

 

消息1:Client Hello

client hello包含客户端要使用的协议版本,以及一些开始握手的其他信息,包括客户端随机数(client random)和密码套件(cipher suites)列表。现行浏览器还包括他们要查找的主机名,称为服务器名称指示(SNI)。SNI使Web服务器可以在同一IP地址上托管多个域。

消息2:Server Hello

收到client hello后,服务器将选择进行握手的参数。密码套件的选择确定执行哪种类型的握手。服务器“ hello”消息包含服务器随机数,服务器选择的密码套件以及服务器的证书。证书包含服务器的公钥和域名。

消息3:Client Key Exchange

在验证证书是受信任的并且属于他们尝试访问的站点之后,客户端将创建一个随机的pre-main secret。此密钥使用证书中的公钥加密,然后发送到服务器。

收到此消息后,服务器将使用其私钥来解密此密钥。既然双方都有pre-main secret,并且客户端和服务器都具有随机性,那么他们都可以导出相同的会话密钥。然后,他们交换一条短消息以指示他们发送的下一条消息将被加密。

当客户端和服务器交换“完成”消息时,握手正式完成。正式的文本描述是:使用session key加密“client finished” or “server finished” 。双方之间的任何后续通信都使用session key加密。

这种握手优点是,在一个步骤中将密钥交换和身份验证结合在一起。理论上如果服务器可以正确导出会话密钥,则它们必须有权访问私钥,因此必须是证书的所有者。

这种握手的缺点是,它所保护的消息仅与私钥一样安全。假设第三方已记录了握手和随后的通信。如果该方将来可以访问私钥,则他们将能够解密主密码并导出会话密钥。这样他们就可以解密整个消息。即使证书已过期或吊销,也是如此。这将导致我们采用另一种形式的握手,即使私钥遭到破坏,该握手也可以提供机密性。

Ephemeral Diffie-Hellman 握手

 

 

它使用两种不同的机制:一种用于建立shared pre-main secret,另一种用于认证服务器。这依赖的关键功能是Diffie-Hellman密钥协商算法。

算法工作原理类似如下:

  • a有密钥a,将g^a发送给b
  • b有密钥b,将g^b发送给a
  • a计算(gb)a
  • b计算(ga)b
  • a和b都以gab结尾,这是他们的共同密钥

消息1:Client Hello

就像在RSA中一样,client hello包含协议版本,客户端随机值,密码套件列表以及SNI扩展(可选)。

消息2:Server Hello

收到client hello后,服务器将选择进行握手的参数,包括ECDHE的曲线。服务器“ hello”消息包含服务器随机数,服务器选择的密码套件以及服务器的证书。

RSA和Diffie-Hellman握手在这一点上因新的消息类型而开始不同。

消息3:Server Key Exchange

为了启动Diffie-Hellman密钥交换,服务器需要选择一些启动参数并将其发送给客户端-这与我们上面描述的g^a相对应。服务器还需要一种方法来证明它具有对私钥的控制权,因此服务器会计算到目前为止所有消息的数字签名。Diffie-Hellman参数和签名都在此消息中发送。

消息4:Client Key Exchange

在验证证书是受信任的并且属于他们尝试访问的站点之后,客户端将验证从服务器发送的数字签名。他们还向客户端发送Diffie-Hellman握手的一半(对应于上面的g^b)。

此时,双方都可以根据Diffie-Hellman参数(对应于上面的gab)计算出pre-main secret。使用pre-main secret以及客户端和服务器的随机密钥,它们可以派生相同的会话密钥。然后,他们交换一条短消息以指示他们发送的下一条消息将被加密。

就像在RSA握手中一样,当客户端和服务器交换“Finished”消息时,此握手已正式完成。双方之间的任何后续通信都使用会话密钥加密。

Tips:与RSA相比采用DH算法后,Premaster secret不需要传递,双方只要交换各自的参数,就可以算出这个随机数。

Abbreviated handshake

TLS提供了一项好的机制,称为“会话恢复(session resumption)”。如果客户端先前已经与服务器建立了会话,并尝试再次连接,则可以使用Abbreviated handshake。有两种机制可以实现:会话ID和会话票证(session IDs and session tickets)

会话ID要求服务器保持会话状态(即会话密钥)就绪,以防需要恢复先前的会话。对于会话票证,服务器在初始握手期间将会话票证(由用票证密钥加密的会话密钥组成)发送给客户端。在恢复会话时,客户端将加密的密钥发送回服务器,由服务器解密并恢复会话。无需使用私钥来恢复会话。

Firefox和Chrome是支持会话票证的主要浏览器。所有其他现行浏览器都通过会话ID支持恢复。大规模使用这些技术时面临的挑战之一是负载平衡。为了使服务器恢复连接,它需要具有先前建立的会话密钥。如果访问者尝试恢复与新服务器的连接,则该服务器需要以某种方式获取原始会话密钥(original session key )。

会话恢复的主要问题在于,这并不意味着可以扩展到负载平衡的服务器。如果客户端在一个服务器上启动会话,则无法在另一台服务器上恢复该会话。这不是协议的失败,只是开源Web服务器中缺少的功能。

通过Keyless SSL,我们引入了高级会话恢复功能来解决此问题。这包括通过会话票证在全球范围内恢复会话,以及通过会话ID在数据中心内恢复会话。会话恢复使重复访问者的连接时间很快,因为无需返回到密钥服务器即可恢复连接。

补充知识

SNI:

在TLS握手阶段,客户端发送的信息之中不包括服务器的域名。也就是说,理论上服务器只能包含一个网站,否则会分不清应该向客户端提供哪一个网站的数字证书。这就是为什么通常一台服务器只能有一张数字证书的原因。

对于虚拟主机的用户来说,这当然很不方便。2006年,TLS协议加入了一个Server Name Indication扩展,允许客户端向服务器提供它所请求的域名。SNI使Web服务器可以在同一IP地址上托管多个域。

Keyless服务

放到CDN上的网站,可以不用提供自己的私钥,也能使用SSL加密链接。

如何做到:将密钥放到密钥服务器上

数字证书(digital certificate)

在非对称加密通信过程中,服务器需要将公钥发送给客户端,在这一过程中,公钥很可能会被第三方拦截并替换,然后这个第三方就可以冒充服务器与客户端进行通信,这就是传说中的“中间人攻击”(man in the middle attack)。解决此问题的方法是通过受信任的第三方交换公钥,具体做法就是服务器不直接向客户端发送公钥,而是要求受信任的第三方,也就是证书认证机构 (Certificate Authority, 简称 CA)将公钥合并到数字证书中,然后服务器会把公钥连同证书一起发送给客户端,私钥则由服务器自己保存以确保安全。

证书验证过程

  • 服务端生成公钥和私钥
  • 服务端发送公钥给CA
  • CA生成证书给服务端
  • 服务端再客户端请求时发送证书给客户端
  • 客户端接收到证书之后发送给CA验证证书有效性
  • 确认证书有效之后,才可以进行后续https通信

验证什么

  • 检查数字签名
  • 验证证书链
  • 验证证书有效期
  • 验证证书撤回状态
  • 证书中有什么
  • 证书所有者的公钥
  • 证书所有者的专有名称
  • 证书颁发机构的专有名称
  • 证书的有效起始日期
  • 证书的过期日期
  • 证书数据格式的版本号
  • 序列号,这是证书颁发机构为该证书分配的唯一标识符

流量解密

工具:wireshark

法一:使用私钥解密
条件:拥有私钥证书

缺点:无法解密 ECDHE 进行密钥交换的加密流量。

步骤

配置wireshark

编辑–>首选项–>protocols–>TLS

按照下图中填写IP地址、端口、协议、以及私钥文件。

 

 

保存配置,重新打开wireshark捕获流量,然后访问私钥对应的网站就可以解密流量了。


法二:SSLKEYLOGFILE
此方法对使用ECDHE 密钥交换方式的流量也可以,不需要私钥

步骤

添加环境变量:SSLKEYLOGFILE

 

 

Firefox 和 Chrome 会将每个 HTTPS 连接产生的 Premaster Secret 或 Master Secret 存储在环境变量SSLKEYLOGFILE对应的文件路径中。

Wireshark配置:

 

 

TLS debug file : 解密过程中的日志会记录到这里,可选配置

(Pre)-Master-Secret log filename 选项中选择环境变量SSLKEYLOGFILE配置的文件路径。

配置完成后,再访问 HTTPS 网站,sslkeylog.log 文件中将会有浏览器写入的数据。
确认之后就可以重新打开Wireshark进行抓包,可以看到解密流量了

版权声明:本文为CSDN博主「BlackFee」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u013315560/article/details/108286278

 

========================一下来自https://zhuanlan.zhihu.com/p/392432613====================

使用golang https客户端保存TLS密钥

自己定http.Client中的Transport的TLSClientConfig,并给KeyLogWriter指定可读写文件即可,transport示例如下:

f, err := os.Open("/xxx/hello/httsdecrypt/ssl.key")
if !os.IsExist(err) {
        f, err = os.Create("/xxx/hello/httsdecrypt/ssl.key")
        if err != nil {
              panic(err)
        }
} else {
        panic(err)
}
t := &http.Transport{
        Proxy: http.ProxyFromEnvironment,
        DialContext: (&net.Dialer{
            Timeout:   30 * time.Second,
            KeepAlive: 30 * time.Second,
            DualStack: true,
        }).DialContext,
        ForceAttemptHTTP2:     true,
        MaxIdleConns:          100,
        IdleConnTimeout:       90 * time.Second,
        TLSHandshakeTimeout:   10 * time.Second,
        ExpectContinueTimeout: 1 * time.Second,
        TLSClientConfig: &tls.Config{
            InsecureSkipVerify: true,
            KeyLogWriter:       f,
        },
}
client := &http.Client{
    Transport: t,
}

 

 

 

 

 

 

 

 

 

 

 


参考:
http://t.zoukankan.com/elijahxb-p-14454210.html
http://www.manongjc.com/detail/25-viatcytpzhxrcvb.html
https://blog.csdn.net/justlpf/article/details/125155754
http://t.zoukankan.com/cangqinglang-p-15078813.html
https://zhuanlan.zhihu.com/p/392432613
posted @   redrobot  阅读(187)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示