深入浅出 SSL 管理配置实战(ssl配置实验)
我们生活在一个信息大爆炸的时代,几乎每天都在和互联网打交道,购物、网银转账、支付宝付款、搜索信息、查看邮件、观看视频、微信聊天、上网冲浪、阅读新闻等,无不时时刻刻在和网络打交道。那如何保护网络安全就相当重要了,其方法有很多,其中应用最为广泛的就是使用 SSL 来保护 C/S 或者 B/S 的通信安全。
SSL 能够帮助系统在客户端和服务器之间建立一条安全通信通道。SSL 安全协议是由 Netscape Communication 公司在 1994 年设计开发,SSL 依赖于加密算法、极难窃听、有较高的安全性,因此 SSL 协议已经成为网络上最常用的安全保密通信协议,该安全协议主要用来提供对用户和服务器的认证;对传送的数据进行加密和隐藏;确保数据在传送中不被改变,即数据的完整性,现已成为该领域中全球化的标准。
很多时候,我们并不知道如何管理和配置 SSL 证书。本课程作者将用实际的例子,手把手一步一步教大家如何使用工具生成、管理、配置 SSL 证书,该课程是一系列基础教程,涉及面广,先以一个 Tomcat 的 SSL 的配置实战为例子,然后一步步分享 SSL 的基础必备知识和管理工具。
认真学完这个系列内容,并按照提供的例子进行实战,将会深入理解 SSL 的概念、目的、证书的申请、管理、配置,基本上覆盖行业的大部分典型的应用场景,从而可以轻松超越 80% 的人,快速成为一个配置、管理、创建 SSL 证书的高手。
注意: 为了描述和表达方便,本达人课内容把 SSL 和 TLS 作为一个整体(SSL/TLS)来对待,沿用了大家熟悉的称呼 SSL。所有后面提到的有关 SSL 的关键字,其实指的都是 SSL 和 TLS。
朱清云,架构师、CSDN 博客专家,从事架构设计 8 年有余,曾先后就职于世界 500 强国企和美资外企。目前感兴趣的研究方向:企业应用集成、物联网、区块链、DevOps 自动化运维、大数据及人工智能。即将出版《MQTT 权威指南》一书,希望通过这个平台认识更多的朋友。
我们生活在一个信息大爆炸的时代,几乎每天都在和互联网打交道,购物、网银转账、支付宝付款、搜索信息、查看邮件、观看视频、微信聊天、上网冲浪、阅读新闻,无不时时刻刻在和网络打交道。如果说互联网是一个江湖,江湖险恶,江湖人心难测,难免有一些不怀好意的人对你的个人信息感兴趣,比如信用卡信息、身份证信息、网银的账号密码、特殊癖好等,那么如何保障当私人的隐秘信息从电脑手机上发送到远端的服务器上的时候,能把我们的隐私数据加密起来,即使别人得到了加密的数据,也很难解开,相当于给我们的信息加上了一把锁,方法有很多,但是目前流行和使用最广的技术手段就是 SSL(Security Socket Layer,安全套接层协议)。
enter image description here
SSL(Secure Socket Layer)翻译成中文就是“安全套接层”,SSL 能够帮助系统在客户端和服务器之间建立一条安全通信通道。SSL 安全协议是由 Netscape Communication 公司在 1994 年设计开发,SSL 依赖于加密算法(在后面的章节中会提到)、极难窃听、有较高的安全性,因此 SSL 协议已经成为网络上最常用的安全保密通信协议,该安全协议主要用来提供对用户和服务器的认证;对传送的数据进行加密和隐藏;确保数据在传送中不被改变,即数据的完整性,现已成为该领域中全球化的标准。
举一个日常生活中的简单例子,当我们用电脑打开一些常用的网站时,比如京东、淘宝、百度等,如果心细的读者会发现,不管是用微软的浏览器,还是谷歌浏览器,其浏览器的地址栏上方有一把锁,这把锁其实代表的就是 SSL 协议,是 SSL 在 HTTP 协议上的应用,用锁锁住我们的私密信息,防止私密信息在访问网站的过程中被第三方程序或者不怀好意的人监听到,如果没有这把保护我们通信安全的 SSL 锁的话,我们的信息则非常容易被第三方监听到。
enter image description here
君不见微信的小程序,服务器的 API 访问必须是支持 SSL 的 HTTPS 协议;谷歌也宣布对其所有的网站支持 HTTPS(Http Over SSL)协议;通过激活 SSL 协议,实现数据信息在客户端和服务器之间的加密传输,可以防止数据信息的泄露,保证了双方传递信息的安全性,而且用户可以通过服务器证书验证他所访问的网站是否是真实可靠。
值的一提的是,SSL 有很多的版本,SSL 于 1995 年发布了 3.0 的版本,但是后来,在 1999 年,IEFT(The Internet Engineering Task Force,互联网工程任务组)在 SSL 3.0 的基础上发布了 TLS 1.0(Transport Layer Security,安全套接层)协议,其标准名称编号为 RFC 2246,实际上相当于 SSL 3.1。
2006 年 TLS 1.1 以标准编号为 RFC 4346 形式发布,该版本增加了对 CBC 攻击的对策并把 AES 加入对称密码算法集中,进一步增强了其安全性,此外在 TLS 1.1 中把 AES 也加入到对称加密算法中。
2008 年 TLS 1.2 以标准标号为 RFC 5246 形式发布,该版本主要的变更就是:伪随机函数(PRF)中的 MD5-SHA-1 组合被 SHA-256 取代,可以使用密码套件指定的 PRF。
目前所有的正在使用的 SSL/TLS 的版本信息如下:
值得一提的是 TLS 1.3 将在今年,也就是2018年3月21日已经被批准成为正式的 TLS 标准。
在本达人课后面的课程里,会有章节来分享如何让你知道在和服务器进行 SSL 通信时,SSL 的具体版本到底是什么?敬请期待。
注意: 为了描述和表达方便,本达人课内容把 SSL 和 TLS 作为一个整体(SSL/TLS)来对待,沿用了大家熟悉的称呼 SSL。所有后面提到的有关 SSL 的关键字,其实指的都是 SSL 和 TLS。
下面通过一个实际的实验,给大家分享一下,为什么 SSL 能够保护我们在通信过程中的安全,为了简单起见,咱们以 SSL 应用于 HTTP 协议为例,通过快速搭建一个简单的 Web 服务器,来观察在使用 SSL 和不使用 SSL 时,我们的数据是如何传输的。
读者可以先到 Tomcat 的网站下载一个 Window 的安装包,下载完成后,解压缩到指定的文件夹下, 比如,D:\apache-tomcat-9.0.1,然后在 D:\apache-tomcat-9.0.1\webapps\examples\ 目录下加入一个 ssldemo.html 的文件,其内容如下:
然后启动 Tomcat 9,在打开浏览器之前,请先下载一个名字叫 Fiddler 的软件,百度百科对 Fiddler 的介绍如下:
Fiddler 是一个 HTTP 协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的 HTTP 通讯,设置断点,查看所有的“进出” Fiddler 的数据(指 Cookie、HTML、JS、CSS 等文件,这些都可以让你胡乱修改的意思)。Fiddler 要比其他的网络调试器要更加简单,因为它不仅仅暴露 HTTP 通讯还提供了一个用户友好的格式。
我们可以单击这里,下载免费的工具并安装。
假设已经安装并打开了 Fiddler,在浏览器中输入下面的地址,将看到下面的内容: 生成一个自签名证书的命令。
假设我们在 Windows 操作系统上面,打开 cmd(在 Linux 操作系统上面打开 Shell),输入下面的命令:
输入上面的命令后,其会让我们输入描述证书的信息,比如国家、组织、城市、省份等,输入对应的信息即可,如下图说示意。
enter image description here
注意:因为上面一个命令同时生成了自签名证书的公钥和私钥并存在在 KeyStore 文件中,所以需要一个保护这个 KeyStore 的密码,比如当前的这个例子,为了简单起见,我输入的是“123456”,这对于测试环境和开发环境已经足够,但是如果是正式的生成环境,建议用一个强度高的密码进行保护。
我们可以通过下面的命令查看 keystore.jks(比如路径在 c:\keystore.jks)里面生成的自签名证书的详细细节。
注意,最后的参数 -v 不能省略,其代表 Verbose,否则其就得不到详细的信息,而且其会提示让我们输入密码,密码就是上面步骤提到的保护。
下面是其具体的输出信息详情。
enter image description here
从上图的详细情况来看,的的确确,证书的所有者(在图中显示的是 Owner)和证书的颁发者(在图中显示的是 Issuer)是一样的,这就代表其是自签名的证书。如果用浏览器访问自签名的证书的时候,浏览器会弹出一个警告的提示。
其实生成自签名证书的方法很多,除了使用 JDK 外,后面提及到 OpenSSL、XCA、PowerShell、IIS 都自带了生成自签名证书的功能。如果你想进一步了解他们的使用或者配置方法,不仅仅局限于自签名,请继续关注后续的系列文章内容。
证书签名请求(CSR,Certificate Signing Request)就是一段经过编码的字符文本,其会发送给 CA,CA 签名之后,其就变成了一个 SSL 证书,所以发送给 CA 之前,其是一个 CSR 的文件,CA 签名之后,其就变成了一张真正意义上的 SSL 证书,可以用于服务器的 SSL 配置了。
在理解证书签名请求的时候,一定要记住,你生成证明签名请求的私钥一定不要发送给 CA,因为 CA 只需要你的 CSR 文件即可,不需要你提供生成证书签名申请的私钥,这个是初学者最容易犯的一个错误。
根据 PCKS #10 的规范,CSR 一般使用 ASN.1 的编码标准对 CSR 文件进行编码。CSR 文件中一般会包含下面的一些信息:
名称解释例子通用名 Common Name必须是你域的全名*.51talkdocter.com 或者mail.51talkdocter.com组织名 Organization组织的合法名称,最好带有下面类似的后缀, Inc、Corp or LLC51 talk Docter Inc.组织部门 Organizational Unit组织下面申请这个证书的部门比如 IT 部门城市 City/Locality公司所在的城市比如上海(Shanghai)省份或者州 State/County/Region公司所在的省份或者州比如California, 广东省(Guangdong)国家 Country公司注册地所在的国家,2位的 ISO码,比如 cn、us中国的2位码就是 cn,美国是us邮箱地址 Email address联系你组织的邮箱地址比如 webmaster@google.com公钥 Public Key生成的证书签名请求 CSR 中里面一定包含了公钥,但是没有私钥生成证书请求的时候,由第三方工具自动生成的
使用 OpenSSL,下面的一条命令就能生成。
如果你还不会安装和使用 OpenSSL,没有关系,后面会有文章深入浅出的详细介绍使用 OpenSSL 来生成和管理证书。
假设我们是一个 Java 程序员,则也可以借助 JDK 自带的 Keytool 生成证书请求,其一般经过两个步骤:
(1)生成私钥,并在生成 CSR 的过程中输入 SSL 证书的相关描述信息,比如通用名称、国家、城市、省份、组织、部门等:
其中,-validity 3650 参数代表证书的生存周期是 10 年。
enter image description here
(2)利用私钥生成 CSR:
生成的证书请求文件,用文本编辑器打开,其就是类似于下面的样子。
enter image description here
需要注意的是 CSR 和私钥的长度决定了其是否能被破解的难易程度,截止 2018 年,私钥长度小于 2048 位的都可以被认为是有潜在安全风险的,因为根据现有的计算机的计算能力,小于 2048 的私钥在几个月内就能根据公钥成功碰撞私钥,如果一旦私钥被破解出来,初始化 SSL 连接其对称加密的秘钥就可能被破解者获取,从而无法保证 SSL 在通信图中的信息安全。建议在生成 CSR 的时候,使用的秘钥的长度强烈推荐为 2048 位。
本章主要介绍了和 SSL 相关的几个核心概念,比如什么是 SSL 证书、对称加密和非对称加密、商业 CA 和私有 CA 的区别、证书签名请求是什么以及其需要注意的事项。
限于篇幅有限,不可能把所有的概念面面俱到,这可能要写好几本书了,所以只列出了这些对后续的阅读和理解非常有帮助的核心概念。作为读者的一个引子,如果你对其中的一部分感兴趣的话,也可以继续深挖下去。
限于作者水平,如果有任何疏漏之处,敬请在读者圈留言,我将尽我最大的能力在读者圈里回答你的问题。最后,祝大家学习愉快。
工欲善其事必先利其器,在查看、生成、转换、导入、导出等 SSL 证书的管理方面,OpenSSL 有着得天独厚的功能是支撑。OpenSSL 采用 C 语言作为开发语言,这使得 OpenSSL 具有非常优秀的跨平台性能;它支持 Linux、Windows、Mac、VMS 等多个平台,这使得 OpenSSL 具有非常广泛的适用性,如 Apache 使用它加密 HTTPS 协议,OpenSSH 使用它加密 SSH。
本节是后面一些文章的基础,建议读者按照本文列出的实战步骤,动手自己安装并执行,肯定会有意想不到的收获。
enter image description here
OpenSSL 是一个稳定的、商用等级的、功能全面的、免费开源的,专为 SSL/TLS 而生一款工具,其命令功能主要分为下面三大类。
enter image description here
下面一些命令可能比较常用:
其也提供了下面的生成信息摘要的命令函数和工具:
其中不得不提的就是 MD(Message Digest)和 SHA,MD4 是 Rivest 于 1990 年设计的单向散列函数,能够产生 128 比特的散列值,不过随着 Dobbertin 提出寻找 MD4 散列的碰撞的方法,因此现在它已经不安全了。MD5 是也是由 Rivest 于 1991 年设计的单向散列函数,也能够产生 128 位的散列值,不过 MD5 的强抗碰撞性已经被攻破,换句话就是说,现在已经能够产生具备相同散列值的两条不同的消息,因此 MD4/MD5 的算法都已经不安全了。
再来看看 SHA 相关的算法,SHA-1 是由 NIST(美国国家标准技术研究所)设计的一种能够产生 160 比特的散列值的单向散列函数,1993 年被美国联邦信息处理标准规格发布的时候 SHA,1995 年又发布了一个修订版,称之为 SHA-1,不过 SHA-1 的强抗碰撞性已于 2005 年被攻破。SHA224、SHA256、 SHA384、SHA512 也都是有 NIST 设计的单向散列函数,他们的散列值长度分别为 224 比特、256 比特、384 比特、512 比特,四种单向散列函数合起来称为 SHA-2,SHA-2 目前还尚未被攻破。
那么在实际应用中,是不是强度越高越好?笔者认为不一定,毕竟生成的信息摘要的位数越多,其需要的计算能力越多,需要存储生成的信息摘要的空间要求越大,如果是一个自己的小型的、临时的应用,MD4/MD5 生成的安全摘要已完全够用,但是如果是需要暴露于公网,且牵涉到一些财产生命安全相关的领域,当然肯定是选用安全级别更高的 SHA-2 生成的信息摘要。
OpenSSL 不但有和管理生成 SSL 证书相关的命令,更令人惊艳的是其还是一个密码学方面的专家工具箱,其提供了非常多的密码学相关的工具函数,如下。
enter image description here
大家比较常见的就是 RC(是一种对称加密,加密的密钥流和明文一样长,同样的密钥和同样的长度能确定同一个密钥流),DES(一种将 64 比特的明文加密成 64 比特的密文的对称加密算法),AES(Advanced Encryption Standard,在密码学中又称 Rijndael 加密法,是美国联邦政府采用的一种区块加密标准),BASE64(一种把二进制加密成为 ASCII 字符),CBC(CBC 模式由 IBM 发明与 1976 年,在 CBC 模式中,每个明文块先与前一个密文块进行异或后,再进行加密)等算法。感兴趣的读者可以自行百度或者 Google,网上的资料比较多,这里就不再赘述了。
如果读者用的是 Linux 操作系统,恭喜你,一般的 Linux 操作系统都会自带 OpenSSL 工具,你所需要确认的就是其当前是否安装的是最新版本,如果你用的是 Windows 操作系统,也不用担心,OpenSSL 也提供了 Windows 版本的安装程序,本文就以 Windows 操作系统为例子,和大家分享一下如何安装 OpenSSL。
下载地址详见这里。
enter image description here
OpenSSL 支持 32 位和 64 位,这个需要根据自己系统的实际情况选择,这里我下载的是 Win64 OpenSSL v1.1.0g 进行安装。
enter image description here
下载完成之后就可以进行安装了。
enter image description here
安装完成后进行环境变量配置,例如 OpenSSL 安装在 C:\OpenSSL-Win64 目录下,则将 C:\OpenSSL-Win64\bin; 复制到 path 中(注意:下图为 Windows10 系统下环境变量配置的配图)。
enter image description here
打开 cmd 命令窗口,输入 openssl version,如果显示版本号,那么恭喜你安装成功,否则安装失败。
enter image description here
因为在后面的章节,比如《如何用 OpenSSL 搭建企业内部 CA 认证中心的根证书?》、《如何用 OpenSSL 搭建 CA 认证中心的中级 CA 证书?》、《三种方法从 HTTPS 网站导出 SSL 证书链》等文章(但不局限于这些文章)都能看到 OpenSSL 的高级用法的身影,所以本部分的 OpenSSL 实战操作将只和大家分享一些基本的 OpenSSL 的操作技能,让大家找到感觉,而不至于在学习后面的课程时,感到一头雾水。请注意,本文的所有例子都在 Windows 操作系统上进行,对于非 Windows 操作系统,其操作命令大同小异。
有的时候,我们想知道当前安装的 OpenSSL 版本、安装的目录等信息,此时,可以执行下面的命令:openssl version -a。
enter image description here
如上图所示,其显示当前的安装版本是 1.1.0g,安装的目录是 “C:\Program Files\OpenSSL”。
当学习一门新技术时,很多人首先会想它有没有提供一些 help,那 OpenSSL 有没有为我们提供呢? OpenSS 作为一个强大的工具库,答案肯定是有。OpenSSL 为我们提供了 OpenSSL help 这个强大的命令,可以概览 OpenSSL 的所有命令,我们只需要在 cmd 控制台输入 openssl help 即可:
enter image description here
使用 OpenSSL xxx -help 可以查看具体一条命令的用法以及它的参数(注意:xxx 为具体命令),如 OpenSSL md5 -help(下面的截图只显示了部分内容)。
enter image description here
通过 openssl help 命令,我们可以知道通过 genrsa 可以生成一个高强度的私钥,如果直接在 openSSL 的控制台输入 genrsa,则其会默认生成一个 2048 位的私钥。
enter image description here
当然,我们也可以指定一些参数,让其输入到指定的文件,比如事先已经创建了一个 c:\openssldemo 的文件夹,然后在 OpenSSL 的环境下执行下面的命令:
enter image description here
则其会生成一个 fd.key 的私钥,用记事本打开,其内容如下:
其是一个可以用文本编辑器打开的普通文本文件,其开头的内容显示其是基于 AES 方式进行加密的。中间的私钥的内容是基于 BaseCode 64 编码格式的字符串。
上面我们用 genrsa 生成了一个私钥,因为 OpenSSL 也提供了一些密码学的工具,我们可以借助其提供的 RSA 的密码工具,来查看其私钥的相关的信息。
执行上面的命令后,其会把 fd.key 的具体信息全部列出来,比如模的信息、共有组件、私有组件等,具体信息如下:
绝对是研究 RSA 算法的一个非常得力的工具。
我们在配置网站的时候,可能需要为网站创建一个 SSL 的证书请求,那么用 OpenSSL 应该如何做呢?其实很简单,因为 OpenSSL 就有一个 req 的命令,专门用来创建证书请求。需要注意的是,在创建一个 SSL 的证书请求前,先要创建一个私钥来,我们可以直接使用上面的私钥,通过 -key 的参数 c:\openSSLDemo\fd.key 来指定,然后通过 -out 的参数指定其输出的文件路径。
中途需要输入你的包含私钥 c:\openSSLDemo\fd.key 的密码,然后再需要你输入证书的基本信息,比如国家、地区、城市、组织、通用名、邮箱地址等,比如下面我的申请。
证书请求生成后,可以通过下面的命令查看生成的证书请求。
其中,-text 表示已文本的方式查看,-in 后面需要知道待查看的证书的请求的路径,-noout 表示不输出其已经被编码的证书文本本身,下面为命令执行结果的输出。
如果你只是安装一个 SSL/TLS 服务器,比如在 IIS 或者 Tomcat 上面部署一个 Web 站点,而且这个站点只是供你自己开发测试使用,这个时候,就没有必要把证书请求发送给第三方的权威的商业 CA 去签名我们的证书请求,最快最方便的方式就是自己签署自己,从而生成一个自签名的 SSL 证书。OpenSSL 已经为我们考虑好了,其命令如下:
其中,x509 -req 表示要进行 SSL 证书的自签名了,-days 365 表示自签名的证书的有效期限为 1 年,从刚刚算起;-signkey 表示用的是生成证书请求的私钥,也就是自己给自己签名;-in 表示证书请求的路径,-out 表示生成的自签名证书输出的路径。
运行上面的命令后,生成的 fd.crt 自签名的证书如下:
enter image description here
证书生成后,我们需要测试或者查看证书,这个时候,就可以使用下面的类似命令了。
其中,-in 参数表示的是需要查看的证书的路径,-noout 表示不输出其已经被编码的证书文本本身,命令的执行结果如下:
本篇文章首先阐述了 OpenSSL 工具的作用,其主要是用来管理 SSL 证书的,但是也提供了非常有用的密码学工具箱,用于密码学测试验证。紧接着,和大家分享了如何安装 OpenSSL,特别是在 Windows 操作系统上,并以 Windows 操作系统为平台,在上面根据不同的假设场景,实战演练了一把。
知易行难,如果读者能够仿照上面的实战步骤,一一执行一下,我想不仅能够加深印象,而且能够对其基本的命令操作方式找到一种感觉,从而能够举一反三。限于笔者水平,如果有错误或者理解不当之处,请与我联系改正,最后祝大家学习愉快,收获良多。
免责声明:本文内容由互联网用户贡献,不作为任何投资建议。投资决策需建立在独立思考之上,本文内容仅供参考,风险自担!如有侵权请联系我们删除,本文链接:http://www.panmou.com/web3/4155.html。