我们生活在信息大爆炸的时代,几乎每天都在处理网络。购物、网上银行转账、支付宝支付、信息搜索、查看邮件、查看视频、上网聊天、上网冲浪、阅读新闻等总是涉及互联网。

那如何保护网络安全就相当重要了,其方法有很多,其中应用最为广泛的就是使用 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:a,然后在 D:awebappsexamples 目录下加入一个 的文件,其内容如下:

然后启动 Tomcat 9,在打开浏览器之前,请先下载一个名字叫 Fiddler 的软件,百度百科对 Fiddler 的介绍如下:

Fiddler 是一个 HTTP 协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的 HTTP 通讯,设置断点,查看所有的“进出” Fiddler 的数据(指 Cookie、HTML、JS、CSS 等文件,这些都可以让你胡乱修改的意思)。Fiddler 要比其他的网络调试器要更加简单,因为它不仅仅暴露 HTTP 通讯还提供了一个用户友好的格式。

我们可以单击这里,下载免费的工具并安装。

假设已经安装并打开了 Fiddler,在浏览器中输入下面的地址,将看到下面的内容:http://localhost:8080/examples/:

enter image description here

这个时候 Fiddler 监测到的内容如下:

enter image description here

根据 Fiddler 截获的信息,我们知道在客户端和服务器传输的信息完全是明文,如果有不怀好意的人或者黑客,截取了浏览器和这个站点之间的所有 HTTP 请求的话,其上面传输的信息,所见即所得,被一览无余。在浏览器和 Web 服务器之间,如果传输只是一般的文本信息,比如 CSDN 的博客等,问题也不大。但是如果传输的是银行账号和密码呢?如果传输的是身份证信息或者信用卡信息呢?如果没有一种很好的机制去保护的话,如果被监听到了,后果将是灾难性的,那如何破这个局呢?其中一种很常见的方式,就是搭建一个基于 SSL 的 Web 服务器,让所有的信息通过 HTTPS 协议来传输。

下面笔者来配置一下 Tomcat 服务器,让其来支持 HTTPS,下面列出了其具体步骤。

1.创建一个 SSL 的证书

假设我们机器上已经安装了 JDK 并配置了 Java Home,然后打开命令行,确保 keytool 命令能用,如果不用请到 JDK 的安装目录下 bin 子目录寻找,在命令行中输入下面的命令:

然后按照提示,输入 first name and last name 等相关信息,这样就会生成一个证书对并存储到 文件中,另外在生成 文件的时候,其会让我们提示输入密码,假设输入的密码是:changeit。

2.保存好 JKS 文件

把 复制到 Tomcat 的安装目录下,笔者的安装目录是:D:a,所以这里将其复制到 D:aconf,当然也可以不用复制,但是需要知道 文件的全路径,因为这个路径在后面需要用到。

3.配置 Tomcat 的 Server.xml 文件

在 Tomcat 的安装目录下打开 文件,笔者的电脑上是,D:aconf 文件,然后编辑这个文件,把已有的 8080 端口的 Connector 注释起来,然后加入下面新的 8443 端口的 Connector。

enter image description here

文本形式的配置如下:

4.重启启动 Tomcat 服务器

在浏览器输入 https://localhost:8443/examples/ 网址,此时,我们发现其走的 HTTPS 协议,也就是用 SSL 保护了的 HTTP 协议,这个时候再回头来看 Fiddler 监听的信息的结果。

enter image description here

从上面的结果来看,我们的 Fiddler 监听到的已经是加过密的信息,看了这些信息,压根就不知道 Web 服务器向浏览器传输了什么信息,因为其是密文的,只有知道其秘钥的工具才能把其破解成明文,这样妈妈再也不同担心我们在网上传输个人的信息了。

在进行 SSL 实战之旅开始时,这里有必要给大家普及一些和 SSL 相关的核心概念,这样大家在阅读后面的文章时,如果遇到这些基本核心概念的时候,能够明白说的是什么;若已经对下面的这些核心概念已了解甚至精通了,可以跳过本节内容,直接进入后面的章节内容。

大家都有过出门住酒店或者买火车票飞机票的经历,当我们买飞机票和火车票的时候,取票点会让我们出示身份证证件,通过身份证就能证明我们的身份,因为身份证是有受信任的公安机关颁发的。同样的道理,当客户端连接到 SSL 服务器的时候,其也要 SSL 服务器告诉客户端一个类似于身份证的凭证文件,这个凭证就是 SSL 的证书。身份证上面有持有人的姓名、户口地址、唯一的身份证 ID、颁发的公安局机关、身份的有效日期;类似的,SSL 证书里面也有类似的信息,比如当前证书的通用名字(Common Name)、国家城市省份组织信息、联系人的邮箱、证书的指纹、颁发机构。下面以实际例子说明一下, 打开百度的网站,找到地址栏上面的锁,点击锁,在弹出的窗体中点击查看证书(View Certificates),其会弹出一个 SSL 证书,如下图所示意。

enter image description here

(1)先点击通用(General)页面,在通用(General)页面会显示其证书的名字,证书的颁发机构(也就是后面即将要解释的 CA),以及证书的有效日期。

enter image description here

(2)然后点击详细(Detail)页面,其列出了当前 SSL 证书的主要信息。

类似于身份证的名字、户口地址信息.

enter image description here

SSL 证书的指纹类似于身份证的 ID,其本质就是 SSL 证书内容的一个信息摘要(Message Digist)。

enter image description here

SSL 证书的颁发者(Issuer)类似于身份证里面的颁发身份证的公安局信息。

enter image description here

enter image description here

在 SSL 证书的详情(Detail)页面还有其他的信息、签名的算法、签名的哈希算法、指纹算法、有效日期范围等等,感兴趣的读者可以自行找一个证书点击理解,如果有任何问题,可以在我的读者圈留言。

(3)最后点击证书路径(Certification Path),我们会看到百度网站证书,总共有三个层级,这个就是证书的路径,其表明了颁发的归属关系。

还是拿身份证为例子,比如,一个北京海淀区居民的身份证,其颁发机构是北京市海淀区公安分局颁发的,那北京海淀区公安分局颁发是谁授权其颁发身份证的权利的? 当然是其上级单位,比如北京市公安局,而北京市公安局又是中国公安部最终给授权的,也就是根授权。

现在拿我们的百度证书路径显示的信息来进行类比,baidu.com 这张证书是 Symantec Class 3 Secure Server CA -G4 这个中级证书授权的,这个中级证书就相当于北京海定区公安分局或者北京市公安局,而 Symantec Class 3 Secure Server CA -G4 这个证书还没有到顶,其又是 Versign 授权的,但是 Versign 到顶了,这个 Versign 就相当于中国公安部,其本质就是一个层级的授权结构。

enter image description here

对称加密算法(Symmetric Encryption)是一种计算机加密技术,使用加密密钥来伪装信息,它的数据转换使用了一个数学算法和一个私有密钥,这导致无法从加密后的消息中推出原始消息。对称加密是一种双向算法,只要有相同的私钥,通过数学算法就能把以前用一把私钥加密的信息还原成最初的原始信息,对称加密算法的最大特点就是加密数据和解密数据使用的是同一个秘钥。

举个简单的例子,大家都喜欢看谍战剧,谍战剧里面经常会看到某一方截获了另外一方的密电,这个密电就是经过某一种方式加密过后的信息,那为什么要加密呢?因为电波是朝四面八方扩散的,只要能够接收电波,就能把电波里面附带的信息记录下来,如果不加密,特别是军事情报,那岂不是太容易被截取并泄密了吗?所以需要加密。加密的方式有多种多样,举个最简单的加密方式,比如如果准备用英文单词写电报的话,就按照字母表的顺序混淆一下,比如把 a 替换成 d,b 替换成 e,c 替换成 f 等,总之就是把当前的字母替换为后面第三位的字母,这种替换规则就是一个秘钥。当接受方接收到这个信息的时候,因为预先知道这个秘钥,所以,接到密文后,反向替换即可,即把密文中的 d,还原成 a,e 还原成 b,f 还原成 c。因为加密解密用的同一份秘钥,加密和解密通过秘钥是完全对称的,所以叫做对称加密。

目前比较通用和常见的对称加密算法主要有下面的种类:

千言万语抵不过一幅图,下面是笔者从网上找了张经典的图,大家一看图就应该明白了什么是对称加密算法。

enter image description here

既然对称加密算法这么强大,那为什么还要使用非对称加密算法呢?那什么又是非对称加密算法呢?

因为对称加密算法有一个最不安全的地方,就是秘钥的分发;如何保证秘钥能从 A 处共享给 B 的时候,特别是在复杂和万能的互联网上,如何保证在交换秘钥的时候不被窃听到?因为对于对称加密算法,只要秘钥被窃听到了,其被这个秘钥加密的任何密文几乎不费吹灰之力就被破解出来了,那如何避免这种风险呢?这个时候非对称加密算法就粉墨登场了。

非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey),公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。那为什么这种机制就能很好的解决秘钥传输的问题呢? 举个例子,假设有通信的双方(A 和 B),需要交换一个秘密信息,A 会生成一个秘钥对,公钥 A 和私钥 A;B 也会生成一个秘钥对,公钥 B 和私钥 B,假设 A 和 B 都能把自己私钥保护的滴水不漏,只要 A 和 B 两个人自己知道自己各自的私钥,其他任何人都不知道,就能保证信息交换的安全,交换的过程如下:

是不是整个通信就非常安全了?因为任何第三方即使在公钥 A 和公钥 B 相互交换的过程中知道到了公钥 A 和公钥 B,也没有用,因为私钥 A 和私钥 B 没有相互交换,只有各自自己知道,从而保证了通信双方通信的安全。

目前 SSL/TLS 支持三种算法,但实际上只有 RSA 这一种被广泛使用;DSA 已经被废弃,而 ECDSA 在未来几年内有望被广泛使用。

(1)RSA

需要说明的是,RSA 算法是最常见的一种选择,基本上所有的 SSL/TLS 部署都会支持 RSA 算法,但是,RSA 在 2048 位(最小位数)的密钥下,比 ECDSA 密钥在安全性上更弱并且性能更差。更糟的是,增加 RSA 密钥长度是性能消耗的增加并不是线性的,如果你觉得 2048 位的加密强度不够,需要使用更高的位数(比如 3072 位)的 RSA 密钥时,在性能上就会有极大幅度的下降。

(2)DSA

DSA 算法现在被应用的比较少了:因为 DSA 的密钥长度最大只能到 1024 位(IE 浏览器也不支持更高强度),这个位数根本无法确保安全性,所以没有人会在 SSL/TLS 实际应用中使用 DSA 算法,与所有人背道而驰的结果是让你陷入兼容性问题中。

(3)ECDSA(椭圆曲线数字签名算法)

ECDSA 算法是未来的选择,256 位的 ECDSA 密钥有 128 位用于安全加密上,相对而言,2048 位的 RSA 密钥只有 112 位是真正用于安全加密的。不仅如此,在这个加密强度下,ECDSA 比 RSA 算法快 2 倍;如果是与 3072 位的 RSA 密钥在相同加密强度下相比,ECDSA 性能要快 6 倍以上。

因为椭圆曲线(Elliptic Curve,EC)算法是最近才被加入到 TLS 的安全体系中,所以 ECDSA 的问题在于:不是所有用户端都支持这种算法。新的浏览器都支持 ECDSA,但是一些老版本的浏览器是不支持这个算法的。你可以通过同时部署 RSA 和 ECDSA 的密钥来解决对新老浏览器的兼容,但并不是所有服务程序都能提供这种配置方式,另外这种方案也需要额外的工作来同时维护两套密钥和证书。因此,就现状而言,ECDSA 的最佳使用场景是用于部署追求最高性能的 TLS 服务系统。未来,随着我们对安全的日益重视,ECDSA 也会变得越来越重要。

千言万语抵不过一幅图,下面是笔者从网上找了张经典的图,大家一看图就应该明白了什么是非对称加密算法。

enter image description here

电子商务认证授权机构(CA,Certificate Authority),也称为电子商务认证中心,是负责发放和管理数字证书的权威机构,并作为电子商务交易中受信任的第三方,承担公钥体系中公钥的合法性检验的责任。其就好比颁发身份证的公安局,当我们申请身份证的时候,我们必须要提供各种资料证明这个身份证是你的,比如你的户口本、家庭成员信息,那么 CA 也是类似,对于一些正规的商业的知名的 CA,当公司或者个人申请 SSL 证书的时候,CA 会验证申请人的信息是否可信任。

CA 是证书的签发机构,它是 PKI 的核心,CA 是负责签发证书、认证证书、管理已颁发证书的机关。它要制定政策和具体步骤来验证、识别用户身份,并对用户证书进行签名,以确保证书持有者的身份和公钥的拥有权。

CA 也拥有一个证书(内含公钥)和私钥。网上的公众用户通过验证 CA 的签字从而信任 CA,任何人都可以得到 CA 的证书(含公钥),用以验证它所签发的证书。

如果用户想得到一份属于自己的证书,他应先向 CA 提出申请。在 CA 判明申请者的身份后,便为他分配一个公钥,并且 CA 将该公钥与申请者的身份信息绑在一起,并为之签名,此后,便形成证书发给申请者。如果一个用户想鉴别另一个证书的真伪,他就用 CA 的公钥对那个证书上的签字进行验证,一旦验证通过,该证书就被认为是有效的。

下面的目前世界上最知名的8家 SSL 证书 CA 供应商。

签发 SSL 证书的 CA 供应商之间的区别主要有:机构品牌、证书加密方式、保险额度、服务与质量、浏览器支持率等。当然,CA 机构也符合「越大越好」这个说法。

当然网上也有一些能申请免费 SSL 证书的 CA 供应商,比较知名的有:

上面介绍的免费 SSL 证书,要说最让人放心的当属 Let's Encrypt、腾讯云和阿里云的 DV SSL 证书,其他免费的 SSL 证书,建议大家谨慎使用,对于一些重要的网站还是建议直接购买 SSL 证书。

为了区分不同的用户级别,服务端证书可以分成 DV、OV 和 EV 证书,他们之间具体有什么区别,请参考云栖社区的一篇博客《CA 和证书那些事》,分析的很专业。

如果需要在实际公共互联网(Internet)部署的 SSL 服务器,强烈推荐到商业的知名的 CA 去申请 SSL 证书。

但是在一个企业的内部的私有网络里,比如,局域网(Intranet)内,其可能会有很多企业自己的基于 Web 的网站系统(比如工作流审批、考勤、办公等)或者消息中间件服务器或者其他企业级应用系统,这些应用系统只暴露在局域网内,不会暴露在公有网络中,但是又需要有 SSL 保护各个系统之间的通信,比如存储企业所有应用系统或者个人信息的密码的 PMP 服务器(Password Management Professional),在访问和调用其 API 的时候,就一定要基于 HTTPS,因为密码可是机密信息啊。

但是出于成本考虑或者保密性要求,我们没有必要向第三方商业 CA 申请 SSL 证书,不但花钱,而且还要提供一些杂七杂八的企业证明信息,这个时候,就可以考虑在企业内部搭建一个私有的 CA,搭建已给自己的局域网(Intranet)的一个私有 CA。具体的搭建步骤,在后面的文章会有实战的例子和文章,比如如何生成 CA 的根证书,CA 的中级代理证书,如何用中级 CA 代理证书来进行签名 SSL 的证书请求,敬请拭目以待吧。

自签名证书,就是自己给自己颁发证书,换句话就是说,证书的使用者和颁发者是同一个 SSL 服务器,自签名证明一般用在开发或者测试环境,在正式的生产或者商用环境,建议大家生成证书请求,然后发送给第三方的 CA 或者自己搭建的企业内部的 CA 去签名部署。下面就是用 JDK 自带的 Keytool 为 www.51 生成一个自签名证书的命令。

假设我们在 Windows 操作系统上面,打开 cmd(在 Linux 操作系统上面打开 Shell),输入下面的命令:

输入上面的命令后,其会让我们输入描述证书的信息,比如国家、组织、城市、省份等,输入对应的信息即可,如下图说示意。

enter image description here

注意:因为上面一个命令同时生成了自签名证书的公钥和私钥并存在在 KeyStore 文件中,所以需要一个保护这个 KeyStore 的密码,比如当前的这个例子,为了简单起见,我输入的是“123456”,这对于测试环境和开发环境已经足够,但是如果是正式的生成环境,建议用一个强度高的密码进行保护。

我们可以通过下面的命令查看 key(比如路径在 c:key)里面生成的自签名证书的详细细节。

注意,最后的参数 -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必须是你域的全名*.51 或者mail.51组织名 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-Win64bin; 复制到 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 FilesOpenSSL”。

当学习一门新技术时,很多人首先会想它有没有提供一些 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

则其会生成一个 的私钥,用记事本打开,其内容如下:

其是一个可以用文本编辑器打开的普通文本文件,其开头的内容显示其是基于 AES 方式进行加密的。中间的私钥的内容是基于 BaseCode 64 编码格式的字符串。

上面我们用 genrsa 生成了一个私钥,因为 OpenSSL 也提供了一些密码学的工具,我们可以借助其提供的 RSA 的密码工具,来查看其私钥的相关的信息。

执行上面的命令后,其会把 的具体信息全部列出来,比如模的信息、共有组件、私有组件等,具体信息如下:

绝对是研究 RSA 算法的一个非常得力的工具。

我们在配置网站的时候,可能需要为网站创建一个 SSL 的证书请求,那么用 OpenSSL 应该如何做呢?其实很简单,因为 OpenSSL 就有一个 req 的命令,专门用来创建证书请求。需要注意的是,在创建一个 SSL 的证书请求前,先要创建一个私钥来,我们可以直接使用上面的私钥,通过 -key 的参数 c:openSSLDemo 来指定,然后通过 -out 的参数指定其输出的文件路径。

中途需要输入你的包含私钥 c:openSSLDemo 的密码,然后再需要你输入证书的基本信息,比如国家、地区、城市、组织、通用名、邮箱地址等,比如下面我的申请。

证书请求生成后,可以通过下面的命令查看生成的证书请求。

其中,-text 表示已文本的方式查看,-in 后面需要知道待查看的证书的请求的路径,-noout 表示不输出其已经被编码的证书文本本身,下面为命令执行结果的输出。

如果你只是安装一个 SSL/TLS 服务器,比如在 IIS 或者 Tomcat 上面部署一个 Web 站点,而且这个站点只是供你自己开发测试使用,这个时候,就没有必要把证书请求发送给第三方的权威的商业 CA 去签名我们的证书请求,最快最方便的方式就是自己签署自己,从而生成一个自签名的 SSL 证书。OpenSSL 已经为我们考虑好了,其命令如下:

其中,x509 -req 表示要进行 SSL 证书的自签名了,-days 365 表示自签名的证书的有效期限为 1 年,从刚刚算起;-signkey 表示用的是生成证书请求的私钥,也就是自己给自己签名;-in 表示证书请求的路径,-out 表示生成的自签名证书输出的路径。

运行上面的命令后,生成的 自签名的证书如下:

enter image description here

证书生成后,我们需要测试或者查看证书,这个时候,就可以使用下面的类似命令了。

其中,-in 参数表示的是需要查看的证书的路径,-noout 表示不输出其已经被编码的证书文本本身,命令的执行结果如下:

本篇文章首先阐述了 OpenSSL 工具的作用,其主要是用来管理 SSL 证书的,但是也提供了非常有用的密码学工具箱,用于密码学测试验证。紧接着,和大家分享了如何安装 OpenSSL,特别是在 Windows 操作系统上,并以 Windows 操作系统为平台,在上面根据不同的假设场景,实战演练了一把。

知易行难,如果读者能够仿照上面的实战步骤,一一执行一下,我想不仅能够加深印象,而且能够对其基本的命令操作方式找到一种感觉,从而能够举一反三。限于笔者水平,如果有错误或者理解不当之处,请与我联系改正,最后祝大家学习愉快,收获良多。

相关推荐