3

深入理解SSL协议:从理论到实践

 1 month ago
source link: https://www.51cto.com/article/784814.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

这是一篇关于SSL协议的技术文章,有理论知识,但又兼具一定的实战性,文章的主要内容分享了SSL协议的核心概念、工作原理、常见的应用场景,以及就https这种实际应用场景,又着重分享具体的工作原理以及如何实现https访问网站。无论你是信息安全技术的初学者,还是专业人士,相信这篇文章都能给你带来一些帮助或启示。如果有失误之处,烦请在评论区指出,以便共同成长和进步。

什么是SSL

SSL(Secure Sockets Layer)是一种用于在网络上保护信息安全的标准安全技术。它通过对网络连接进行加密来确保数据在客户端和服务器之间的安全传输。SSL协议使用了非对称加密和对称加密技术,可以防止数据在传输过程中被窃取或篡改。SSL主要用于保护网站上的敏感信息,如个人信息、信用卡信息等。在现代网络通信中,SSL已经被其后继标准TLS(Transport Layer Security)所取代,但是通常情况下人们仍然称之为SSL。

SSL的工作原理

上面的概念性描述中提到了两个关键:第一个:SSL是一种保护信息安全的技术标准;第二个:SSL使用了对称加密技术和非对称加密的技术;具体来讲SSL的工作原理涉及下面三个关键步骤:

  1. 握手阶段:客户端发起与服务器的连接请求,服务器会返回其SSL证书。客户端验证证书的有效性,并生成一个预主密钥,再用服务器的公钥加密后发送给服务器。
  2. 密钥协商阶段:服务器接收到客户端发送的预主密钥后,使用自己的私钥解密得到预主密钥,然后双方基于预主密钥生成会话密钥(对称密钥),用于加密通信数据。
  3. 数据传输阶段:客户端和服务器使用会话密钥进行加密和解密通信数据,确保数据在传输过程中的机密性和完整性。

通过以上步骤,SSL协议实现了对数据的加密传输,防止了中间人攻击和窃听等安全威胁,从而保障了网络通信的安全性。

关于SSL工作原理的几个疑问

客户端是如何验证服务器返回的SSL证书的有效性的?

通常客户端具体是指浏览器,客户端浏览器从从以下几个方面来验证服务器返回的SSL证书的有效性:

  1. 证书链验证

客户端首先会检查服务器返回的SSL证书是否由受信任的证书颁发机构(CA)签发,即验证证书的颁发者是否在客户端的信任列表中。这一过程称为证书链验证,确保服务器证书的可信任性。

  1. 证书有效期检查

客户端会验证证书的有效期,确保证书尚未过期。如果证书已经过期,客户端将不予信任。

  1. 主机名匹配

客户端会检查证书中的主机名与客户端正在连接的服务器主机名是否匹配。这一步骤可以防止针对恶意伪造证书的中间人攻击。

  1. 证书吊销检查

客户端还会检查证书颁发机构是否已经吊销了服务器证书。这可以通过查询证书颁发机构的证书吊销清单(CRL)或者在线证书状态协议(OCSP)来进行检查。

  1. 可选的附加验证

某些情况下,客户端还可能进行其他附加的验证,如检查证书中的扩展字段等。

通过以上多个方面的验证,客户端就可以确保服务器返回的SSL证书的有效性和可信任性,从而建立起安全的通信连接。如果证书验证失败,客户端将会发出警告或者拒绝连接,以保护数据通信的安全性。

预主密钥是什么?会话密钥是什么?

预主密钥(Pre-Master Secret):

预主密钥是在 SSL 握手的初始阶段由客户端生成的随机值,用于协商后续通信中使用的对称加密算法的密钥。客户端在握手开始时生成预主密钥,并将其发送给服务器。预主密钥不会直接用于加密数据,而是通过协商生成最终的会话密钥。

会话密钥(Session Key):

会话密钥是在 SSL 握手过程中双方根据预主密钥和其他信息协商生成的对称密钥,用于加密和解密通信数据。会话密钥只在当前会话期间有效,通常保存在客户端和服务器端,用于加密数据传输。一旦会话结束,会话密钥通常会被丢弃,以确保下次通信时使用一个新的会话密钥。

总体来说,预主密钥用于安全地协商生成会话密钥,而会话密钥则用于实际的数据加密和解密过程。通过这种方式,SSL 协议确保了通信双方之间的数据传输是加密的、安全的。

非对称加密技术和对称加密技术的特点

非对称加密技术有以下几个主要特点:

  • 公钥和私钥

非对称加密使用一对密钥,即公钥和私钥。公钥用于加密数据,私钥用于解密数据。公钥可以公开给他人使用,而私钥则保密。

  • 加密和解密

公钥加密的数据只能用对应的私钥解密,私钥加密的数据只能用对应的公钥解密。这种特性确保了数据在传输过程中的安全性。

非对称加密还可用于生成和验证数字签名。发送者可以使用自己的私钥对消息进行签名,接收者可以使用发送者的公钥验证签名,从而确保消息的完整性和真实性。

非对称加密算法的安全性基于数学难题,如大数分解问题或椭圆曲线离散对数问题等。合适的密钥长度可以提高加密算法的安全性。

非对称加密也用于安全地交换对称加密算法所需的密钥,如在TLS握手过程中使用非对称加密来交换对称密钥。

相较对称加密算法,非对称加密算法通常计算量较大,因此在传输大量数据时效率可能较低。因此,通常会结合对称加密和非对称加密来达到安全和效率的平衡。

对称加密技术具有以下几个特点:

对称加密算法通常比非对称加密算法更快速,因为在加密和解密过程中使用的是相同的密钥,不需要复杂的数学运算。

相对于非对称加密算法,对称加密算法的实现更为简单,计算量小,适合对大量数据进行加密。

  • 密钥管理:

对称加密算法需要确保密钥的安全传输和存储,否则密钥可能被窃取导致数据泄露。这对密钥管理提出了挑战。

对称加密算法适用于大部分数据加密场景,如数据传输、文件加密等。然而,在密钥协商和分发方面存在一些限制,尤其在对数据进行安全传输时可能需要结合其他技术来解决密钥交换的问题。

对称加密算法中加密和解密所使用的密钥是相同的,这种对称性也是其命名的来源。因此,双方在通信前需要协商并共享同一个密钥。

总体来说,对称加密技术在速度和效率上具有优势,而非对称加密技术在密钥管理和密钥交换方面更具有优势,所以在很多场景下,是两种技术结合在一起使用,以达到取长补短的效果。

Md5属于非对称加密技术实现的一种吗

答案是否。MD5和非对称加密是两种不同的加密技术,它们之间是有一些联系,但也有区别:

  • 作用和用途

MD5(Message Digest Algorithm 5)是一种哈希算法,主要用于生成数据的摘要(digest),以保证数据的完整性和验证数据的一致性。

非对称加密算法(如RSA、ECC等)则是一种加密算法,使用一对密钥(公钥和私钥)来实现加密和解密,同时也可以用于数字签名和密钥交换等功能。

MD5是单向哈希算法,即可以将数据生成摘要,但无法从摘要还原出原始数据。

非对称加密算法是双向的,可以使用公钥加密数据,私钥解密数据,或者使用私钥签名数据,公钥验证签名。

MD5算法存在一些安全性缺陷,如易受碰撞攻击等,不适合用于安全性要求较高的场景。

非对称加密算法基于数学难题,相对更安全可靠,常用于加密通信、数字签名等场景。

在实际应用中,MD5摘要通常会与非对称加密算法结合使用。例如,在数字签名中,可以使用非对称加密算法生成数字签名,然后再使用MD5对签名进行摘要,以确保签名的完整性和真实性。

SSL的应用场景

SSL协议的常见应用场景还是挺多的,比如下面这些。当然,除了下面这些,还有其他很多场景,这里就不过多赘述了。

  • 网站加密通信:通过HTTPS协议来保护网站上的数据传输,确保用户和网站之间的通信安全。
  • 电子邮件加密:例如使用SMTPS、IMAPS和POP3S等协议来保护电子邮件的传输过程,确保邮件内容的机密性。
  • 虚拟专用网络(VPN):通过SSL VPN技术来建立安全的远程访问连接,使远程用户可以安全地访问公司内部网络资源。
  • 远程管理和访问:例如通过SSH(Secure Shell)来进行远程服务器管理,以及通过HTTPS访问远程管理界面等。
  • 安全聊天和即时通讯:许多即时通讯应用程序使用SSL/TLS来加密用户之间的通信内容,确保聊天内容的机密性。

实现https访问的一般步骤

在SSL协议的应用场景中,有一项是使用https协议来实现网站的加密通信。可能有的小伙伴会有疑问,https与ssl都是协议,有什么区别或联系吗?可以这么理解:HTTPS实际上就是HTTP协议的安全版本,它在HTTP的基础上加入了SSL/TLS协议的加密机制,通过在传输层加密数据来保护通信的安全。

目前大多数网站都使用了HTTPS,想要在网站上实现HTTPS,通常需要以下几个步骤:

  1. 获取SSL证书

一般获取 SSL 证书的途径也就那么几个,以下是一些常见的途径:

  • 商业证书颁发机构(CA):你可以选择购买商业 CA(如 Comodo、DigiCert、GlobalSign、Symantec 等)颁发的 SSL 证书。这些证书通常提供更多的功能和保障,适用于各种企业级需求。
  • 托管服务提供商:如果你使用云托管服务(国外如 AWS、Azure、Google Cloud 等,国内,如阿里云、腾讯云等),这些平台通常提供集成的 SSL 证书管理服务,可以方便地获取和配置 SSL 证书。
  • Let's Encrypt:Let's Encrypt 是一个免费的证书颁发机构,通过他们的服务可以获取免费的 SSL 证书,支持自动化签发和更新。
  • 第三方证书市场:有一些第三方的证书市场(如 SSLs.com、Namecheap 等)也提供各种类型的 SSL 证书选择,你可以在这些市场上购买并获取证书。
  • 自签名证书:如果你只是在内部环境或测试目的下使用 SSL 加密,你也可以生成自签名证书来使用。不过需要注意的是,自签名证书在公共网络中可能会受到不信任。
  1. 安装SSL证书

一旦获得SSL证书,就需要将其安装到Web服务器上。这通常涉及将证书文件和密钥文件配置到服务器软件(如Apache、Nginx等)的相应位置。这个在后面会以nginx为例,安装一个自签名的证书。

  1. 配置服务器

需要修改Web服务器的配置,启用SSL/TLS协议,并配置加密套件、协议版本等安全参数。

  1. 更新网站链接

将网站上的所有链接都改为使用https:// 开头,确保网站上所有资源都通过加密连接进行访问。

  1. 强制重定向

为了确保所有访问都通过HTTPS,通常要对HTTP访问进行强制重定向到HTTPS。

  1. 测试和验证

最后,需要进行测试和验证,确保HTTPS的配置生效,并且网站在浏览器中显示安全的锁定标志。

至此,就可以以相对安全地访问目标网站了。

HTTPS的工作原理

对于如何实现普通网站的HTTPS的步骤,相信你已经了然。但是整个过程是如何工作的,你了解吗?且往下看。HTTPS(Hypertext Transfer Protocol Secure)的工作原理主要基于SSL/TLS协议,其关键步骤包括:

客户端发起与服务器的连接请求,服务器会返回其SSL证书,证书中包含公钥等信息。客户端验证证书的有效性,并生成一个随机的对称密钥,用服务器的公钥加密后发送给服务器。

  1. 密钥协商阶段

服务器接收到客户端发送的加密后的对称密钥后,使用自己的私钥解密得到对称密钥,然后双方基于该对称密钥生成会话密钥,用于加密通信数据。

  1. 数据传输阶段

客户端和服务器之间使用会话密钥进行对称加密和解密通信数据,确保数据在传输过程中的机密性和完整性。

通过以上步骤,HTTPS实现了对数据的加密传输,从而确保了数据在传输过程中的安全性。此外,HTTPS还使用数字证书来验证服务器的身份,防止中间人攻击,确保客户端和服务器之间通信的安全性和可靠性。

在Nginx中配置SSL证书,实现https访问网站

在Nginx中配置SSL证书,即可实现客户端的 HTTPS 访问,配置过程并不复杂,但前提是得有证书。

1、获取SSL证书:

在上面已经提到,可以从信任的证书颁发机构(CA),或者使用 Let's Encrypt 等免费证书服务,来获取 SSL 证书。需要注意的是自签名的证书,最好只用在内网中,在互联网中自签名的证书可能并不被信任。

2、配置SSL证书

在 Nginx 的配置中,指定 SSL 证书的位置、私钥以及其他相关配置。下面nginx.conf中的一段关键配置示例:

server {
        listen       443 ssl;
        server_name  192.168.35.106;
        root         /usr/share/nginx/html;
        ssl_certificate /etc/nginx/ssl/cert.crt;
        ssl_certificate_key /etc/nginx/ssl/key.pem;
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
        ssl_prefer_server_ciphers on;
        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;


        error_page 404 /404.html;
        location = /404.html {
        }


        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
    }
   server {
        listen 80;
      server_name 192.168.35.106;
    return 301 https://$host$request_uri;
   }
上面的配置示例内容中,需要重点关注几个地方:
  • ssl_certificate:指定 SSL 证书文件的路径,这里是 /etc/nginx/ssl/cert.crt,该证书文件包含了公钥、证书链和其他必要信息。
  • ssl_certificate_key :指定 SSL 证书的私钥文件路径,这里是 /etc/nginx/ssl/key.pem,该私钥用于解密客户端发来的加密数据。
  • ssl_protocols TLSv1.2 TLSv1.3;:指定 Nginx 支持的 SSL/TLS 协议版本,这里配置了支持 TLS 1.2 和 TLS 1.3 版本。
  • ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';:设置加密套件的优先顺序,这里指定了两个加密套件,分别为 ECDHE-ECDSA-AES256-GCM-SHA384 和 ECDHE-RSA-AES256-GCM-SHA384。
  • ssl_prefer_server_ciphers on;:启用服务器端的加密套件优先设置,表示服务器会优先选择自己支持的加密套件与客户端协商加密方式。
  • listen       443 ssl;:当使用 HTTPS 协议时,通常会使用 443 端口来提供加密的网站访问,因此需要确保443可以通过防火墙,并且启用 SSL 加密。
  • 第二个server中listen 80;:这个配置的作用是将所有通过 HTTP(端口 80)访问服务器的请求重定向到 HTTPS(端口 443)上,以确保网站访问是通过加密的安全连接进行;
  • return 301 https://$host$request_uri;:这是重定向指令,当收到 HTTP 请求时,会返回一个 HTTP 301 永久重定向响应,将请求重定向到相同的请求 URL,但使用 HTTPS 协议。其中 $host 表示原始请求的主机名,$request_uri 表示原始请求的 URI。

3、重启Nginx

完成 SSL 配置后,需要重新加载或重启 Nginx 以使更改生效。可以使用命令 nginx -s reload 或者 systemctl restart nginx来重新加载配置。

nginx -s reload
 systemctl restart nginx

使用浏览器访问你的网站,由原来http访问,改成https访问,如果可以通过 HTTPS 访问并且浏览器地址栏中显示安全连接的标识,那就说明配置已经成功。

非常感谢你能耐心看完我的这篇文章,希望我的分享对你有所帮助。当然,如果你觉得这篇文章对你有所帮助,不妨点击点赞按钮,让更多的人看到这篇优质的技术分享。同时,别忘了将这篇文章收藏起来,也方便日后再次查阅。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK