我们生活在一个信息大爆炸的时代,几乎每天都在和互联网打交道,购物、网银转账、支付宝付款、搜索信息、查看邮件、观看视频、微信聊天、上网冲浪、阅读新闻等,无不时时刻刻在和网络打交道。那如何保护网络安全就相当重要了,其方法有很多,其中应用最为广泛的就是使用SSL来保护CS或者BS的通信安全。 SSL能够帮助系统在客户端和服务器之间建立一条安全通信通道。SSL安全协议是由NetscapeCommunication公司在1994年设计开发,SSL依赖于加密算法、极难窃听、有较高的安全性,因此SSL协议已经成为网络上最常用的安全保密通信协议,该安全协议主要用来提供对用户和服务器的认证;对传送的数据进行加密和隐藏;确保数据在传送中不被改变,即数据的完整性,现已成为该领域中全球化的标准。 很多时候,我们并不知道如何管理和配置SSL证书。本课程作者将用实际的例子,手把手一步一步教大家如何使用工具生成、管理、配置SSL证书,该课程是一系列基础教程,涉及面广,先以一个Tomcat的SSL的配置实战为例子,然后一步步分享SSL的基础必备知识和管理工具。 认真学完这个系列内容,并按照提供的例子进行实战,将会深入理解SSL的概念、目的、证书的申请、管理、配置,基本上覆盖行业的大部分典型的应用场景,从而可以轻松超越80的人,快速成为一个配置、管理、创建SSL证书的高手。 注意:为了描述和表达方便,本达人课内容把SSL和TLS作为一个整体(SSLTLS)来对待,沿用了大家熟悉的称呼SSL。所有后面提到的有关SSL的关键字,其实指的都是SSL和TLS。 朱清云,架构师、CSDN博客专家,从事架构设计8年有余,曾先后就职于世界500强国企和美资外企。目前感兴趣的研究方向:企业应用集成、物联网、区块链、DevOps自动化运维、大数据及人工智能。即将出版《MQTT权威指南》一书,希望通过这个平台认识更多的朋友。 我们生活在一个信息大爆炸的时代,几乎每天都在和互联网打交道,购物、网银转账、支付宝付款、搜索信息、查看邮件、观看视频、微信聊天、上网冲浪、阅读新闻,无不时时刻刻在和网络打交道。如果说互联网是一个江湖,江湖险恶,江湖人心难测,难免有一些不怀好意的人对你的个人信息感兴趣,比如信用卡信息、身份证信息、网银的账号密码、特殊癖好等,那么如何保障当私人的隐秘信息从电脑手机上发送到远端的服务器上的时候,能把我们的隐私数据加密起来,即使别人得到了加密的数据,也很难解开,相当于给我们的信息加上了一把锁,方法有很多,但是目前流行和使用最广的技术手段就是SSL(SecuritySocketLayer,安全套接层协议)。 enterimagedescriptionhere SSL(SecureSocketLayer)翻译成中文就是安全套接层,SSL能够帮助系统在客户端和服务器之间建立一条安全通信通道。SSL安全协议是由NetscapeCommunication公司在1994年设计开发,SSL依赖于加密算法(在后面的章节中会提到)、极难窃听、有较高的安全性,因此SSL协议已经成为网络上最常用的安全保密通信协议,该安全协议主要用来提供对用户和服务器的认证;对传送的数据进行加密和隐藏;确保数据在传送中不被改变,即数据的完整性,现已成为该领域中全球化的标准。 举一个日常生活中的简单例子,当我们用电脑打开一些常用的网站时,比如京东、淘宝、百度等,如果心细的读者会发现,不管是用微软的浏览器,还是谷歌浏览器,其浏览器的地址栏上方有一把锁,这把锁其实代表的就是SSL协议,是SSL在HTTP协议上的应用,用锁锁住我们的私密信息,防止私密信息在访问网站的过程中被第三方程序或者不怀好意的人监听到,如果没有这把保护我们通信安全的SSL锁的话,我们的信息则非常容易被第三方监听到。 enterimagedescriptionhere 君不见微信的小程序,服务器的API访问必须是支持SSL的HTTPS协议;谷歌也宣布对其所有的网站支持HTTPS(HttpOverSSL)协议;通过激活SSL协议,实现数据信息在客户端和服务器之间的加密传输,可以防止数据信息的泄露,保证了双方传递信息的安全性,而且用户可以通过服务器证书验证他所访问的网站是否是真实可靠。 值的一提的是,SSL有很多的版本,SSL于1995年发布了3。0的版本,但是后来,在1999年,IEFT(TheInternetEngineeringTaskForce,互联网工程任务组)在SSL3。0的基础上发布了TLS1。0(TransportLayerSecurity,安全套接层)协议,其标准名称编号为RFC2246,实际上相当于SSL3。1。 2006年TLS1。1以标准编号为RFC4346形式发布,该版本增加了对CBC攻击的对策并把AES加入对称密码算法集中,进一步增强了其安全性,此外在TLS1。1中把AES也加入到对称加密算法中。 2008年TLS1。2以标准标号为RFC5246形式发布,该版本主要的变更就是:伪随机函数(PRF)中的MD5SHA1组合被SHA256取代,可以使用密码套件指定的PRF。 目前所有的正在使用的SSLTLS的版本信息如下: 值得一提的是TLS1。3将在今年,也就是2018年3月21日已经被批准成为正式的TLS标准。 在本达人课后面的课程里,会有章节来分享如何让你知道在和服务器进行SSL通信时,SSL的具体版本到底是什么?敬请期待。 注意:为了描述和表达方便,本达人课内容把SSL和TLS作为一个整体(SSLTLS)来对待,沿用了大家熟悉的称呼SSL。所有后面提到的有关SSL的关键字,其实指的都是SSL和TLS。 下面通过一个实际的实验,给大家分享一下,为什么SSL能够保护我们在通信过程中的安全,为了简单起见,咱们以SSL应用于HTTP协议为例,通过快速搭建一个简单的Web服务器,来观察在使用SSL和不使用SSL时,我们的数据是如何传输的。 读者可以先到Tomcat的网站下载一个Window的安装包,下载完成后,解压缩到指定的文件夹下,比如,D:apachetomcat9。0。1,然后在D:apachetomcat9。0。1webappsexamples目录下加入一个ssldemo。html的文件,其内容如下: 然后启动Tomcat9,在打开浏览器之前,请先下载一个名字叫Fiddler的软件,百度百科对Fiddler的介绍如下: Fiddler是一个HTTP协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的HTTP通讯,设置断点,查看所有的进出Fiddler的数据(指Cookie、HTML、JS、CSS等文件,这些都可以让你胡乱修改的意思)。Fiddler要比其他的网络调试器要更加简单,因为它不仅仅暴露HTTP通讯还提供了一个用户友好的格式。 我们可以单击这里,下载免费的工具并安装。 假设已经安装并打开了Fiddler,在浏览器中输入下面的地址,将看到下面的内容:http:localhost:8080examplesssldemo。html: enterimagedescriptionhere 这个时候Fiddler监测到的内容如下: enterimagedescriptionhere 根据Fiddler截获的信息,我们知道在客户端和服务器传输的信息完全是明文,如果有不怀好意的人或者黑客,截取了浏览器和这个站点之间的所有HTTP请求的话,其上面传输的信息,所见即所得,被一览无余。在浏览器和Web服务器之间,如果传输只是一般的文本信息,比如CSDN的博客等,问题也不大。但是如果传输的是银行账号和密码呢?如果传输的是身份证信息或者信用卡信息呢?如果没有一种很好的机制去保护的话,如果被监听到了,后果将是灾难性的,那如何破这个局呢?其中一种很常见的方式,就是搭建一个基于SSL的Web服务器,让所有的信息通过HTTPS协议来传输。 下面笔者来配置一下Tomcat服务器,让其来支持HTTPS,下面列出了其具体步骤。 1。创建一个SSL的证书 假设我们机器上已经安装了JDK并配置了JavaHome,然后打开命令行,确保keytool命令能用,如果不用请到JDK的安装目录下bin子目录寻找,在命令行中输入下面的命令: 然后按照提示,输入firstnameandlastname等相关信息,这样就会生成一个证书对并存储到tomcat。jks文件中,另外在生成tomcat。jks文件的时候,其会让我们提示输入密码,假设输入的密码是:changeit。 2。保存好JKS文件 把tomcat。jks复制到Tomcat的安装目录下,笔者的安装目录是:D:apachetomcat9。0。1,所以这里将其复制到D:apachetomcat9。0。1conftomcat。jks,当然也可以不用复制,但是需要知道tomcat。jks文件的全路径,因为这个路径在后面需要用到。 3。配置Tomcat的Server。xml文件 在Tomcat的安装目录下打开server。xml文件,笔者的电脑上是,D:apachetomcat9。0。1confserver。xml文件,然后编辑这个文件,把已有的8080端口的Connector注释起来,然后加入下面新的8443端口的Connector。 enterimagedescriptionhere 文本形式的配置如下: 4。重启启动Tomcat服务器 在浏览器输入https:localhost:8443examplesssldemo。html网址,此时,我们发现其走的HTTPS协议,也就是用SSL保护了的HTTP协议,这个时候再回头来看Fiddler监听的信息的结果。 enterimagedescriptionhere 从上面的结果来看,我们的Fiddler监听到的已经是加过密的信息,看了这些信息,压根就不知道Web服务器向浏览器传输了什么信息,因为其是密文的,只有知道其秘钥的工具才能把其破解成明文,这样妈妈再也不同担心我们在网上传输个人的信息了。 在进行SSL实战之旅开始时,这里有必要给大家普及一些和SSL相关的核心概念,这样大家在阅读后面的文章时,如果遇到这些基本核心概念的时候,能够明白说的是什么;若已经对下面的这些核心概念已了解甚至精通了,可以跳过本节内容,直接进入后面的章节内容。 大家都有过出门住酒店或者买火车票飞机票的经历,当我们买飞机票和火车票的时候,取票点会让我们出示身份证证件,通过身份证就能证明我们的身份,因为身份证是有受信任的公安机关颁发的。同样的道理,当客户端连接到SSL服务器的时候,其也要SSL服务器告诉客户端一个类似于身份证的凭证文件,这个凭证就是SSL的证书。身份证上面有持有人的姓名、户口地址、唯一的身份证ID、颁发的公安局机关、身份的有效日期;类似的,SSL证书里面也有类似的信息,比如当前证书的通用名字(CommonName)、国家城市省份组织信息、联系人的邮箱、证书的指纹、颁发机构。下面以实际例子说明一下,打开百度的网站,找到地址栏上面的锁,点击锁,在弹出的窗体中点击查看证书(ViewCertificates),其会弹出一个SSL证书,如下图所示意。 enterimagedescriptionhere (1)先点击通用(General)页面,在通用(General)页面会显示其证书的名字,证书的颁发机构(也就是后面即将要解释的CA),以及证书的有效日期。 enterimagedescriptionhere (2)然后点击详细(Detail)页面,其列出了当前SSL证书的主要信息。 类似于身份证的名字、户口地址信息。 enterimagedescriptionhere SSL证书的指纹类似于身份证的ID,其本质就是SSL证书内容的一个信息摘要(MessageDigist)。 enterimagedescriptionhere SSL证书的颁发者(Issuer)类似于身份证里面的颁发身份证的公安局信息。 enterimagedescriptionhere enterimagedescriptionhere 在SSL证书的详情(Detail)页面还有其他的信息、签名的算法、签名的哈希算法、指纹算法、有效日期范围等等,感兴趣的读者可以自行找一个证书点击理解,如果有任何问题,可以在我的读者圈留言。 (3)最后点击证书路径(CertificationPath),我们会看到百度网站证书,总共有三个层级,这个就是证书的路径,其表明了颁发的归属关系。 还是拿身份证为例子,比如,一个北京海淀区居民的身份证,其颁发机构是北京市海淀区公安分局颁发的,那北京海淀区公安分局颁发是谁授权其颁发身份证的权利的?当然是其上级单位,比如北京市公安局,而北京市公安局又是中国公安部最终给授权的,也就是根授权。 现在拿我们的百度证书路径显示的信息来进行类比,baidu。com这张证书是SymantecClass3SecureServerCAG4这个中级证书授权的,这个中级证书就相当于北京海定区公安分局或者北京市公安局,而SymantecClass3SecureServerCAG4这个证书还没有到顶,其又是Versign授权的,但是Versign到顶了,这个Versign就相当于中国公安部,其本质就是一个层级的授权结构。 enterimagedescriptionhere 对称加密算法(SymmetricEncryption)是一种计算机加密技术,使用加密密钥来伪装信息,它的数据转换使用了一个数学算法和一个私有密钥,这导致无法从加密后的消息中推出原始消息。对称加密是一种双向算法,只要有相同的私钥,通过数学算法就能把以前用一把私钥加密的信息还原成最初的原始信息,对称加密算法的最大特点就是加密数据和解密数据使用的是同一个秘钥。 举个简单的例子,大家都喜欢看谍战剧,谍战剧里面经常会看到某一方截获了另外一方的密电,这个密电就是经过某一种方式加密过后的信息,那为什么要加密呢?因为电波是朝四面八方扩散的,只要能够接收电波,就能把电波里面附带的信息记录下来,如果不加密,特别是军事情报,那岂不是太容易被截取并泄密了吗?所以需要加密。加密的方式有多种多样,举个最简单的加密方式,比如如果准备用英文单词写电报的话,就按照字母表的顺序混淆一下,比如把a替换成d,b替换成e,c替换成f等,总之就是把当前的字母替换为后面第三位的字母,这种替换规则就是一个秘钥。当接受方接收到这个信息的时候,因为预先知道这个秘钥,所以,接到密文后,反向替换即可,即把密文中的d,还原成a,e还原成b,f还原成c。因为加密解密用的同一份秘钥,加密和解密通过秘钥是完全对称的,所以叫做对称加密。 目前比较通用和常见的对称加密算法主要有下面的种类: 千言万语抵不过一幅图,下面是笔者从网上找了张经典的图,大家一看图就应该明白了什么是对称加密算法。 enterimagedescriptionhere 既然对称加密算法这么强大,那为什么还要使用非对称加密算法呢?那什么又是非对称加密算法呢? 因为对称加密算法有一个最不安全的地方,就是秘钥的分发;如何保证秘钥能从A处共享给B的时候,特别是在复杂和万能的互联网上,如何保证在交换秘钥的时候不被窃听到?因为对于对称加密算法,只要秘钥被窃听到了,其被这个秘钥加密的任何密文几乎不费吹灰之力就被破解出来了,那如何避免这种风险呢?这个时候非对称加密算法就粉墨登场了。 非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey),公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。那为什么这种机制就能很好的解决秘钥传输的问题呢?举个例子,假设有通信的双方(A和B),需要交换一个秘密信息,A会生成一个秘钥对,公钥A和私钥A;B也会生成一个秘钥对,公钥B和私钥B,假设A和B都能把自己私钥保护的滴水不漏,只要A和B两个人自己知道自己各自的私钥,其他任何人都不知道,就能保证信息交换的安全,交换的过程如下: 是不是整个通信就非常安全了?因为任何第三方即使在公钥A和公钥B相互交换的过程中知道到了公钥A和公钥B,也没有用,因为私钥A和私钥B没有相互交换,只有各自自己知道,从而保证了通信双方通信的安全。 目前SSLTLS支持三种算法,但实际上只有RSA这一种被广泛使用;DSA已经被废弃,而ECDSA在未来几年内有望被广泛使用。 (1)RSA 需要说明的是,RSA算法是最常见的一种选择,基本上所有的SSLTLS部署都会支持RSA算法,但是,RSA在2048位(最小位数)的密钥下,比ECDSA密钥在安全性上更弱并且性能更差。更糟的是,增加RSA密钥长度是性能消耗的增加并不是线性的,如果你觉得2048位的加密强度不够,需要使用更高的位数(比如3072位)的RSA密钥时,在性能上就会有极大幅度的下降。 (2)DSA DSA算法现在被应用的比较少了:因为DSA的密钥长度最大只能到1024位(IE浏览器也不支持更高强度),这个位数根本无法确保安全性,所以没有人会在SSLTLS实际应用中使用DSA算法,与所有人背道而驰的结果是让你陷入兼容性问题中。 (3)ECDSA(椭圆曲线数字签名算法) ECDSA算法是未来的选择,256位的ECDSA密钥有128位用于安全加密上,相对而言,2048位的RSA密钥只有112位是真正用于安全加密的。不仅如此,在这个加密强度下,ECDSA比RSA算法快2倍;如果是与3072位的RSA密钥在相同加密强度下相比,ECDSA性能要快6倍以上。 因为椭圆曲线(EllipticCurve,EC)算法是最近才被加入到TLS的安全体系中,所以ECDSA的问题在于:不是所有用户端都支持这种算法。新的浏览器都支持ECDSA,但是一些老版本的浏览器是不支持这个算法的。你可以通过同时部署RSA和ECDSA的密钥来解决对新老浏览器的兼容,但并不是所有服务程序都能提供这种配置方式,另外这种方案也需要额外的工作来同时维护两套密钥和证书。因此,就现状而言,ECDSA的最佳使用场景是用于部署追求最高性能的TLS服务系统。未来,随着我们对安全的日益重视,ECDSA也会变得越来越重要。 千言万语抵不过一幅图,下面是笔者从网上找了张经典的图,大家一看图就应该明白了什么是非对称加密算法。 enterimagedescriptionhere 电子商务认证授权机构(CA,CertificateAuthority),也称为电子商务认证中心,是负责发放和管理数字证书的权威机构,并作为电子商务交易中受信任的第三方,承担公钥体系中公钥的合法性检验的责任。其就好比颁发身份证的公安局,当我们申请身份证的时候,我们必须要提供各种资料证明这个身份证是你的,比如你的户口本、家庭成员信息,那么CA也是类似,对于一些正规的商业的知名的CA,当公司或者个人申请SSL证书的时候,CA会验证申请人的信息是否可信任。 CA是证书的签发机构,它是PKI的核心,CA是负责签发证书、认证证书、管理已颁发证书的机关。它要制定政策和具体步骤来验证、识别用户身份,并对用户证书进行签名,以确保证书持有者的身份和公钥的拥有权。 CA也拥有一个证书(内含公钥)和私钥。网上的公众用户通过验证CA的签字从而信任CA,任何人都可以得到CA的证书(含公钥),用以验证它所签发的证书。 如果用户想得到一份属于自己的证书,他应先向CA提出申请。在CA判明申请者的身份后,便为他分配一个公钥,并且CA将该公钥与申请者的身份信息绑在一起,并为之签名,此后,便形成证书发给申请者。如果一个用户想鉴别另一个证书的真伪,他就用CA的公钥对那个证书上的签字进行验证,一旦验证通过,该证书就被认为是有效的。 下面的目前世界上最知名的8家SSL证书CA供应商。 签发SSL证书的CA供应商之间的区别主要有:机构品牌、证书加密方式、保险额度、服务与质量、浏览器支持率等。当然,CA机构也符合越大越好这个说法。 当然网上也有一些能申请免费SSL证书的CA供应商,比较知名的有: 上面介绍的免费SSL证书,要说最让人放心的当属LetsEncrypt、腾讯云和阿里云的DVSSL证书,其他免费的SSL证书,建议大家谨慎使用,对于一些重要的网站还是建议直接购买SSL证书。 为了区分不同的用户级别,服务端证书可以分成DV、OV和EV证书,他们之间具体有什么区别,请参考云栖社区的一篇博客《CA和证书那些事》,分析的很专业。 如果需要在实际公共互联网(Internet)部署的SSL服务器,强烈推荐到商业的知名的CA去申请SSL证书。 但是在一个企业的内部的私有网络里,比如,局域网(Intranet)内,其可能会有很多企业自己的基于Web的网站系统(比如工作流审批、考勤、办公等)或者消息中间件服务器或者其他企业级应用系统,这些应用系统只暴露在局域网内,不会暴露在公有网络中,但是又需要有SSL保护各个系统之间的通信,比如存储企业所有应用系统或者个人信息的密码的PMP服务器(PasswordManagementProfessional),在访问和调用其API的时候,就一定要基于HTTPS,因为密码可是机密信息啊。 但是出于成本考虑或者保密性要求,我们没有必要向第三方商业CA申请SSL证书,不但花钱,而且还要提供一些杂七杂八的企业证明信息,这个时候,就可以考虑在企业内部搭建一个私有的CA,搭建已给自己的局域网(Intranet)的一个私有CA。具体的搭建步骤,在后面的文章会有实战的例子和文章,比如如何生成CA的根证书,CA的中级代理证书,如何用中级CA代理证书来进行签名SSL的证书请求,敬请拭目以待吧。 自签名证书,就是自己给自己颁发证书,换句话就是说,证书的使用者和颁发者是同一个SSL服务器,自签名证明一般用在开发或者测试环境,在正式的生产或者商用环境,建议大家生成证书请求,然后发送给第三方的CA或者自己搭建的企业内部的CA去签名部署。下面就是用JDK自带的Keytool为www。51talkdocter。com生成一个自签名证书的命令。 假设我们在Windows操作系统上面,打开cmd(在Linux操作系统上面打开Shell),输入下面的命令: 输入上面的命令后,其会让我们输入描述证书的信息,比如国家、组织、城市、省份等,输入对应的信息即可,如下图说示意。 enterimagedescriptionhere 注意:因为上面一个命令同时生成了自签名证书的公钥和私钥并存在在KeyStore文件中,所以需要一个保护这个KeyStore的密码,比如当前的这个例子,为了简单起见,我输入的是123456,这对于测试环境和开发环境已经足够,但是如果是正式的生成环境,建议用一个强度高的密码进行保护。 我们可以通过下面的命令查看keystore。jks(比如路径在c:keystore。jks)里面生成的自签名证书的详细细节。 注意,最后的参数v不能省略,其代表Verbose,否则其就得不到详细的信息,而且其会提示让我们输入密码,密码就是上面步骤提到的保护。 下面是其具体的输出信息详情。 enterimagedescriptionhere 从上图的详细情况来看,的的确确,证书的所有者(在图中显示的是Owner)和证书的颁发者(在图中显示的是Issuer)是一样的,这就代表其是自签名的证书。如果用浏览器访问自签名的证书的时候,浏览器会弹出一个警告的提示。 其实生成自签名证书的方法很多,除了使用JDK外,后面提及到OpenSSL、XCA、PowerShell、IIS都自带了生成自签名证书的功能。如果你想进一步了解他们的使用或者配置方法,不仅仅局限于自签名,请继续关注后续的系列文章内容。 证书签名请求(CSR,CertificateSigningRequest)就是一段经过编码的字符文本,其会发送给CA,CA签名之后,其就变成了一个SSL证书,所以发送给CA之前,其是一个CSR的文件,CA签名之后,其就变成了一张真正意义上的SSL证书,可以用于服务器的SSL配置了。 在理解证书签名请求的时候,一定要记住,你生成证明签名请求的私钥一定不要发送给CA,因为CA只需要你的CSR文件即可,不需要你提供生成证书签名申请的私钥,这个是初学者最容易犯的一个错误。 根据PCKS10的规范,CSR一般使用ASN。1的编码标准对CSR文件进行编码。CSR文件中一般会包含下面的一些信息: 名称解释例子通用名CommonName必须是你域的全名。51talkdocter。com或者mail。51talkdocter。com组织名Organization组织的合法名称,最好带有下面类似的后缀,Inc、CorporLLC51talkDocterInc。组织部门OrganizationalUnit组织下面申请这个证书的部门比如IT部门城市CityLocality公司所在的城市比如上海(Shanghai)省份或者州StateCountyRegion公司所在的省份或者州比如California,广东省(Guangdong)国家Country公司注册地所在的国家,2位的ISO码,比如cn、us中国的2位码就是cn,美国是us邮箱地址Emailaddress联系你组织的邮箱地址比如webmastergoogle。com公钥PublicKey生成的证书签名请求CSR中里面一定包含了公钥,但是没有私钥生成证书请求的时候,由第三方工具自动生成的 使用OpenSSL,下面的一条命令就能生成。 如果你还不会安装和使用OpenSSL,没有关系,后面会有文章深入浅出的详细介绍使用OpenSSL来生成和管理证书。 假设我们是一个Java程序员,则也可以借助JDK自带的Keytool生成证书请求,其一般经过两个步骤: (1)生成私钥,并在生成CSR的过程中输入SSL证书的相关描述信息,比如通用名称、国家、城市、省份、组织、部门等: 其中,validity3650参数代表证书的生存周期是10年。 enterimagedescriptionhere (2)利用私钥生成CSR: 生成的证书请求文件,用文本编辑器打开,其就是类似于下面的样子。 enterimagedescriptionhere 需要注意的是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。 本节是后面一些文章的基础,建议读者按照本文列出的实战步骤,动手自己安装并执行,肯定会有意想不到的收获。 enterimagedescriptionhere OpenSSL是一个稳定的、商用等级的、功能全面的、免费开源的,专为SSLTLS而生一款工具,其命令功能主要分为下面三大类。 enterimagedescriptionhere 下面一些命令可能比较常用: 其也提供了下面的生成信息摘要的命令函数和工具: 其中不得不提的就是MD(MessageDigest)和SHA,MD4是Rivest于1990年设计的单向散列函数,能够产生128比特的散列值,不过随着Dobbertin提出寻找MD4散列的碰撞的方法,因此现在它已经不安全了。MD5是也是由Rivest于1991年设计的单向散列函数,也能够产生128位的散列值,不过MD5的强抗碰撞性已经被攻破,换句话就是说,现在已经能够产生具备相同散列值的两条不同的消息,因此MD4MD5的算法都已经不安全了。 再来看看SHA相关的算法,SHA1是由NIST(美国国家标准技术研究所)设计的一种能够产生160比特的散列值的单向散列函数,1993年被美国联邦信息处理标准规格发布的时候SHA,1995年又发布了一个修订版,称之为SHA1,不过SHA1的强抗碰撞性已于2005年被攻破。SHA224、SHA256、SHA384、SHA512也都是有NIST设计的单向散列函数,他们的散列值长度分别为224比特、256比特、384比特、512比特,四种单向散列函数合起来称为SHA2,SHA2目前还尚未被攻破。 那么在实际应用中,是不是强度越高越好?笔者认为不一定,毕竟生成的信息摘要的位数越多,其需要的计算能力越多,需要存储生成的信息摘要的空间要求越大,如果是一个自己的小型的、临时的应用,MD4MD5生成的安全摘要已完全够用,但是如果是需要暴露于公网,且牵涉到一些财产生命安全相关的领域,当然肯定是选用安全级别更高的SHA2生成的信息摘要。 OpenSSL不但有和管理生成SSL证书相关的命令,更令人惊艳的是其还是一个密码学方面的专家工具箱,其提供了非常多的密码学相关的工具函数,如下。 enterimagedescriptionhere 大家比较常见的就是RC(是一种对称加密,加密的密钥流和明文一样长,同样的密钥和同样的长度能确定同一个密钥流),DES(一种将64比特的明文加密成64比特的密文的对称加密算法),AES(AdvancedEncryptionStandard,在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准),BASE64(一种把二进制加密成为ASCII字符),CBC(CBC模式由IBM发明与1976年,在CBC模式中,每个明文块先与前一个密文块进行异或后,再进行加密)等算法。感兴趣的读者可以自行百度或者Google,网上的资料比较多,这里就不再赘述了。 如果读者用的是Linux操作系统,恭喜你,一般的Linux操作系统都会自带OpenSSL工具,你所需要确认的就是其当前是否安装的是最新版本,如果你用的是Windows操作系统,也不用担心,OpenSSL也提供了Windows版本的安装程序,本文就以Windows操作系统为例子,和大家分享一下如何安装OpenSSL。 下载地址详见这里。 enterimagedescriptionhere OpenSSL支持32位和64位,这个需要根据自己系统的实际情况选择,这里我下载的是Win64OpenSSLv1。1。0g进行安装。 enterimagedescriptionhere 下载完成之后就可以进行安装了。 enterimagedescriptionhere 安装完成后进行环境变量配置,例如OpenSSL安装在C:OpenSSLWin64目录下,则将C:OpenSSLWin64复制到path中(注意:下图为Windows10系统下环境变量配置的配图)。 enterimagedescriptionhere 打开cmd命令窗口,输入opensslversion,如果显示版本号,那么恭喜你安装成功,否则安装失败。 enterimagedescriptionhere 因为在后面的章节,比如《如何用OpenSSL搭建企业内部CA认证中心的根证书?》、《如何用OpenSSL搭建CA认证中心的中级CA证书?》、《三种方法从HTTPS网站导出SSL证书链》等文章(但不局限于这些文章)都能看到OpenSSL的高级用法的身影,所以本部分的OpenSSL实战操作将只和大家分享一些基本的OpenSSL的操作技能,让大家找到感觉,而不至于在学习后面的课程时,感到一头雾水。请注意,本文的所有例子都在Windows操作系统上进行,对于非Windows操作系统,其操作命令大同小异。 有的时候,我们想知道当前安装的OpenSSL版本、安装的目录等信息,此时,可以执行下面的命令:opensslversiona。 enterimagedescriptionhere 如上图所示,其显示当前的安装版本是1。1。0g,安装的目录是C:ProgramFilesOpenSSL。 当学习一门新技术时,很多人首先会想它有没有提供一些help,那OpenSSL有没有为我们提供呢?OpenSS作为一个强大的工具库,答案肯定是有。OpenSSL为我们提供了OpenSSLhelp这个强大的命令,可以概览OpenSSL的所有命令,我们只需要在cmd控制台输入opensslhelp即可: enterimagedescriptionhere 使用OpenSSLxxxhelp可以查看具体一条命令的用法以及它的参数(注意:xxx为具体命令),如OpenSSLmd5help(下面的截图只显示了部分内容)。 enterimagedescriptionhere 通过opensslhelp命令,我们可以知道通过genrsa可以生成一个高强度的私钥,如果直接在openSSL的控制台输入genrsa,则其会默认生成一个2048位的私钥。 enterimagedescriptionhere 当然,我们也可以指定一些参数,让其输入到指定的文件,比如事先已经创建了一个c:openssldemo的文件夹,然后在OpenSSL的环境下执行下面的命令: enterimagedescriptionhere 则其会生成一个fd。key的私钥,用记事本打开,其内容如下: 其是一个可以用文本编辑器打开的普通文本文件,其开头的内容显示其是基于AES方式进行加密的。中间的私钥的内容是基于BaseCode64编码格式的字符串。 上面我们用genrsa生成了一个私钥,因为OpenSSL也提供了一些密码学的工具,我们可以借助其提供的RSA的密码工具,来查看其私钥的相关的信息。 执行上面的命令后,其会把fd。key的具体信息全部列出来,比如模的信息、共有组件、私有组件等,具体信息如下: 绝对是研究RSA算法的一个非常得力的工具。 我们在配置网站的时候,可能需要为网站创建一个SSL的证书请求,那么用OpenSSL应该如何做呢?其实很简单,因为OpenSSL就有一个req的命令,专门用来创建证书请求。需要注意的是,在创建一个SSL的证书请求前,先要创建一个私钥来,我们可以直接使用上面的私钥,通过key的参数c:openSSLDemofd。key来指定,然后通过out的参数指定其输出的文件路径。 中途需要输入你的包含私钥c:openSSLDemofd。key的密码,然后再需要你输入证书的基本信息,比如国家、地区、城市、组织、通用名、邮箱地址等,比如下面我的申请。 证书请求生成后,可以通过下面的命令查看生成的证书请求。 其中,text表示已文本的方式查看,in后面需要知道待查看的证书的请求的路径,noout表示不输出其已经被编码的证书文本本身,下面为命令执行结果的输出。 如果你只是安装一个SSLTLS服务器,比如在IIS或者Tomcat上面部署一个Web站点,而且这个站点只是供你自己开发测试使用,这个时候,就没有必要把证书请求发送给第三方的权威的商业CA去签名我们的证书请求,最快最方便的方式就是自己签署自己,从而生成一个自签名的SSL证书。OpenSSL已经为我们考虑好了,其命令如下: 其中,x509req表示要进行SSL证书的自签名了,days365表示自签名的证书的有效期限为1年,从刚刚算起;signkey表示用的是生成证书请求的私钥,也就是自己给自己签名;in表示证书请求的路径,out表示生成的自签名证书输出的路径。 运行上面的命令后,生成的fd。crt自签名的证书如下: enterimagedescriptionhere 证书生成后,我们需要测试或者查看证书,这个时候,就可以使用下面的类似命令了。 其中,in参数表示的是需要查看的证书的路径,noout表示不输出其已经被编码的证书文本本身,命令的执行结果如下: 本篇文章首先阐述了OpenSSL工具的作用,其主要是用来管理SSL证书的,但是也提供了非常有用的密码学工具箱,用于密码学测试验证。紧接着,和大家分享了如何安装OpenSSL,特别是在Windows操作系统上,并以Windows操作系统为平台,在上面根据不同的假设场景,实战演练了一把。 知易行难,如果读者能够仿照上面的实战步骤,一一执行一下,我想不仅能够加深印象,而且能够对其基本的命令操作方式找到一种感觉,从而能够举一反三。限于笔者水平,如果有错误或者理解不当之处,请与我联系改正,最后祝大家学习愉快,收获良多。