SSL 认识

前2天碰到一个服务增加了SSL 认证后,另一个服务调用此SSL服务下载图片失败,查了查问题,说是需要进行公钥认证,把服务端 证书公钥放到客户端;(当时是把nginx 转发https的图片地址屏蔽了,不转https 解决了 ); 后面看elasticsearch 也提到了ssh 认证加密的问题,所以就决定把这块看一看

 

一:什么是openssl? 它的作用是?应用场景是什么?

即百度百科说:openssl是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,它可以避免信息被窃听到。

SSL是Secure Sockets Layer(安全套接层协议)的缩写,可以在Internet上提供秘密性传输。Netscape(网景)公司在推出第一个Web浏览器的同时,提出了SSL协议标准。其目标是保证两个应用间通信的保密性和可靠性,可在服务器端和用户端同时实现支持。

因为在网络传输的过程中,网络的数据肯定要经过wifi路由器对吧,那么我们通过路由器做些手脚我们就可以拿到数据,因此openssl的作用就是避免信息被窃听到。

那么openssl是如何保证信息不被窃听到呢?因此我们需要了解 非对称加密、数字签名、数字证书等一些基本概念的。

1.1 什么是非对称加密?

非对称加密是用密钥对数据进行加密,然后我们可以使用另一个不同的密钥对数据进行解密。这两个密钥就是公钥和私钥。

我们根据私钥可以计算出公钥,但是我们根据公钥计算不出来私钥的。私钥一般是有服务器掌握的,公钥则是在客户端使用的。

注意:非对称加密的具体算法我们这边不做研究。

1.2 什么是数字签名?

根据百度百科说:数字签名(又可以叫公钥数字签名)是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,它是用于鉴别数字信息的方法。数字签名有两种互补的运算,一个是用于签名,另一个是用于验证。

作用是:它会将报文使用一定的HASH算法算出一个固定位数的摘要信息,然后使用私钥将摘要加密,然后会将刚才的报文一起发送给接收者,接收者会通过公钥将摘要解出来。也通过hash算法算出报文摘要,如果两个摘要一致,说明数据未被篡改,说明数据是完整的。

1.3 什么是数字证书?

根据百度百科说:数字证书是互联网通讯中标志通讯各方身份信息一串数字。提供了一种在Internet上验证通信实体身份的方式。
它是由CA颁发给网站的一种身份的方式。它里面包含了该网站的公钥、有效时间、网站的地址、及 CA的数字签名等。

作用是:它是使用CA的私钥将网站的公钥等信息进行了签名,当客户端请求服务器端的时候,网站会把证书发给客户端,客户端先通过CA的数字签名校验CA的身份,来证明证书的真实完整性。

了解到上面的非对称加密、数字签名、数字证书的概念之后,我们来看看它是如何来保证数据没有被伪造的:

1.4SSL 实现认证用户和服务器

现在我们来想一个问题,如果我们现在访问我们的博客园网站,我们怎么知道访问的是真博客园还是假博客园呢?为了确定我们的博客园网站的服务器有没有被伪造,在SSL中有这么一个规则:假如我们向服务器发出请求后,服务器必须返回它的数字证书给接收者,当我们拿到数字证书之后,我们可以根据里面的ca数字签名,来检验数字证书的合法性。假如我们现在能够证明数字证书是博客园的,但是不代表发送给我们证书的服务器就是博客园的呢?为了解决这个问题,其实在我们拿到的证书里面会带有博客园的公钥,在之后的通信中,客户端会使用该公钥加密数据给博客园服务器,博客园服务器必须使用私钥才能够解出里面的数据。只要他能够解出数据出来,说明他是合法的,否则的话,是伪造的。如果是伪造的,那么就不能通讯。因此SSL就解决了服务器认证的问题了。

1.5加密数据在通讯过程中如何防止数据不被窃取呢?

客户端第一次给服务器发送请求的时候(拿到证书之前的那个请求),会在请求里面放一个随机数(比如叫A),服务器的返回证书的响应里也会带一个随机数(比如叫B), 客户端拿到证书后,会使用公钥加密一个随机数(比如叫C)发送给服务器,因此客户端,服务器就有三个随机数:A、B、C。双方使用这些随机数和一个相同的算法会生成一个密钥,以后所有的通信都使用这个对称密钥来进行的。

一般情况下,这三个密钥不可能同时被泄露的,因为它是由三个随机数随机生成的。并且其中一个随机数使用了公钥加密的。因此是通过这种方式来保证数据不被窃取的。

上面都是在网上看到的一些概念性问题,简单的理解下就好了,知道是这么个概念就行了,而我们的openssl是SSL的实现版。因此openssl的作用避免信息被窃取到,它是通过上面的知识点来做到的。

openssl的应用场景:

在使用http网站中,我们经常看到网站会有一些广告什么的,这些广告其实不是网站自己放上去的,而是中间的运营商在中间篡改了内容导致的。现在我们可以使用https技术(基于openssl)来对数据进行加密的。它能保证数据不被篡改。

1.6、什么是DV,OV,EV认证?(什么是认证级别?)
SSL服务器证书可根据身份验证级别分为三类:域身份验证(DV),企业身份验证(OV)和EV身份验证。
DV认证
DV身份验证仅验证域名使用权限。 在三种认证级别中,最简单的认证方法是DV认证。它是一种主要用于查询表单和活动应用程序以及内部网环境等各种形式的身份验证方法。
OV认证
除了域名使用权的认证外,EV认证还会对申请机构的存在进行认证。 高可靠性的代表是通过注册管理机构和第三方组织的数据库等在法律上和身体上确认组织的存在,并对其进行最严格的检查。 通常在公司主页和购物网站上找到的显示是“EV认证”SSL服务器证书。地址栏变为绿色,并显示操作员信息。它是一种身份验证方法,用于需要输入个人信息以及在线银行的基于成员资格的站点,EC站点和公司站点。

1.7、我可以在多个网站上使用SSL证书吗?
虽然有一个多域证书可以涵盖一个SSL证书的多个域。
如果要应用于子域,可以使用通配符证书。
请从SSL证书列表中查看目标证书以获取通配符证书。

1.8.什么是通配符?
通配符证书是一种证书,允许您使用一个SSL证书为同一域名下的所有子域设置证书。
通过将整个站点设置为子域,同时保持低成本,使整个站点成为HTTPS。 通过将公共名称的第一个标签设置为“*”(通配符),可以在该域名的任何子域中设置证书。
例如: www.secxa.com、bbs.secxa.com、blog.secxa.com、conslog.secxa.com
请从SSL证书列表中查看目标证书以获取通配符证书。

1.9.什么是CSR?
CSR是颁发SSL服务器证书的证书签名请求。
CSR包含公钥信息,组织名称和位置等信息,并且认证机构将提交的CSR作为认证机构签名并将其作为证书颁发。
在创建CSR时,始终会生成密钥作为集合。该密钥只能在CSR生成时存储。此外,请将其保存在安全的地方,因为它不是由证书颁发机构或证书分销商存储的。
生成CSR

1.10.部署SSL后,您的网站会是什么样子?
通常,地址栏将更改为表示它是带锁的加密安全站点。
展示公司名称和商标名称, 支持中文、英文或其他国家语言的名称。
您可以向访问您网站的访问者温馨提升,告知他们这是一个安全可靠的网站。
在这里浏览EV SSL证书

 

二、理论了解差不多了, 现在开始实际实验一下ssl ,

首先进行证书的生成, 使用 openssl

2.1、 生成密钥

openssl genrsa -out ca.key 1024

2.2、生成证书请求文件, 域名我瞎写的

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

  

 

 2.3、 生成CA根证书(公钥证书)

openssl x509 -req -days 3650 -in ca.csr -signkey ca.key -out ca_public.crt

 2.4、生成密钥(服务器密钥)

openssl genrsa -out server_private.key 1024

2.5、 根据服务器私钥生成公钥文件

openssl rsa -in server_private.key -pubout -out server_public.pem

2.6、 服务器向CA机构申请签名证书,申请前自己的证书签名请求文件

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

 2.7、 根据服务器端 server.csr 文件向CA 申请证书

    签名过程需要CA 公钥证书和私钥参与

    最终办法一个CA 签名证书服务器端

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

 

生成后的文件目录如下图, 有这些文件

 

 

 

三、上面为生成各种文件, 

springboot 项目需要使用keystore ,使用 keytool 直接生成 yyds.p12

keytool -genkey -alias yyds -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore yyds.p12 -validity 3650

 把 yyds.p12 放入resource 目录下, 然后 在 properties 文件配置如下

server.ssl.key-store=classpath:yyds.p12
server.ssl.key-store-password=123456
server.ssl.key-store-type=PKCS12

启动项目, 不能配置 port = 443, 否则会启动报错 java.net.SocketException: Permission denied; 

项目访问如果使用 http 则不能访问, 使用https 会提示不安全,但是可继续访问

 

 

关于当时遇到的问题, main 方法去下载 https 的图片,报错, 此链接回答 

https://blog.csdn.net/chaishen10000/article/details/82992291

 

 

 

参考链接:

https://www.cnblogs.com/tugenhua0707/p/10927722.html
https://blog.csdn.net/u013131716/article/details/103027714

https://www.cnblogs.com/zimug/p/12484437.html

https://www.jianshu.com/p/a1eb7de265fc

posted @ 2021-12-08 16:56  长弓射大狗  阅读(148)  评论(0)    收藏  举报