Loading... <p style="text-indent: 2em"><strong>前言</strong></p> <p style="text-indent: 2em">随着互联网的迅猛发展,网络通信已经成为传递信息的主要途径。而通信时的数据传输大部分却是明文传输的,在网络这个不安全的环境下,如果没有一套数据加密机制,就会导致敏感信息和重要数据泄露,引起不可估量的损失。而OpenSSL正好弥补了这一缺憾,那什么是OpenSSL呢?OpenSSL是一套强大的具有加密功能的组件,它包含libcrypto(公共加密库)、libssl(SSL协议的实现)和openssl(多功能命令工具),因其开源思想,现已广泛应用于数据通信加密领域。OpenSSL还可在局域网内构建私有CA,实现局域网内的证书认证和授权,保证数据传输的安全性。如何构建私有CA呢?本文将详细讲述基于OpenSSL实现私有CA构建。</p> <p style="text-indent: 2em"><strong>数据加密解密过程</strong><br style="text-indent: 2em" /></p> <p style="text-indent: 2em">数据加密需要实现的功能:数据私密性,数据完整性,身份认证和秘钥交换。</p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703163626-4-1.jpg" title="1428250721103824.jpg" alt="1.jpg" /></p> <pre class="brush:bash;toolbar:false">加密类型及功能: 单向加密:提取数据特征码,实现数据完整性验证 对称加密:数据加密,实现数据私密性 公钥加密:使用对方公钥加密,实现秘钥交换 使用自己私钥加密,实现身份验证</pre> <p style="text-indent: 2em">公钥在网络传输过程中,无法保证可信度,容易被窃取或伪装,所以我们就需要一个受信任的第三方机构(CA)</p> <p style="text-indent: 2em"><strong>CA工作流程</strong><br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703163626-57.jpg" title="1428250752119683.jpg" alt="2.jpg" /></p> <pre class="brush:bash;toolbar:false">#A和B各自用CA的公钥解密对方证书,完成身份验证</pre> <p style="text-indent: 2em">由于CA支持在互联网上价格不菲,所以在企业内,不牵涉外网通信前提下,完全自行构建一个局域网内的私有CA.</p> <p style="text-indent: 2em"><strong>实现CA构建</strong></p> <p style="text-indent: 2em">OpenSSL可以构建适用于中小型企业的私有CA,如果需要在大型企业构建CA可以用OpenCA,有兴趣可以自行Google,这里就不做详解了,因为OpenSSL足以满足大多数需求。</p> <p style="text-indent: 2em"><strong>建立CA服务器</strong></p> <p style="text-indent: 2em">生成秘钥</p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703163627-59.jpg" title="1428250771565577.jpg" alt="3.jpg" /></p> <pre class="brush:bash;toolbar:false">命令详解: umask 077:保证秘钥文件其他人无读写权限,在()内执行,只对当前子shell有效 -out /path/to/somefile:指定生成秘钥位置 2048:秘钥长度,可自定义 #openssl rsa -in private/cakey.pem -pubout -text 可提取公钥</pre> <p style="text-indent: 2em">自签证书<br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703163627-31.jpg" title="1428250792666798.jpg" alt="4.jpg" /></p> <pre class="brush:bash;toolbar:false">命令详解: req: 生成证书签署请求 -news: 新请求 -key /path/to/keyfile: 指定私钥文件 -out /path/to/somefile: 指定生成证书位置 -x509: 生成自签署证书 -days n: 有效天数 #Country Name (2 letter code) [XX]:CN #国家(大写缩写) #State or Province Name (full name) []:Shandong #省份或洲 #Locality Name (eg, city) [Default City]:Qingdao #城市 #Organization Name (eg, company) [Default Company Ltd]:Scholar #公司 #Organizational Unit Name (eg, section) []:Tech #部门 #Common Name (eg, your name or your server's hostname) []:ca.scholar.com #必须与证书所有者能解析到的名字保持一致,否则将无法通过验证 #Email Address []:ca@scholar.com #邮箱 #以上操作默认选项可通过修改配置文件(/etc/pki/tls/openssl.cnf)修改</pre> <p style="text-indent: 2em">初始化工作环境</p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703163627-22.jpg" title="1428250810919732.jpg" alt="5.jpg" /></p> <pre class="brush:bash;toolbar:false">命令详解: index.txt:证书缩影数据库 serial:签署证书编号文件 echo 01 > serial #设定编号初始值</pre> <p style="text-indent: 2em"><strong>客户端申请证书</strong><br style="text-indent: 2em" /></p> <p style="text-indent: 2em">生成密钥</p> <pre class="brush:bash;toolbar:false">#我们给web服务生成请求用于https,在其配置文件目录创建用于保存私钥和证书的目录</pre> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703163627-85.jpg" title="1428250846106069.jpg" alt="6.jpg" /></p> <p style="text-indent: 2em">生成证书签署请求</p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703163627-35.jpg" title="1428250866468095.jpg" alt="7.jpg" /></p> <pre class="brush:bash;toolbar:false">#A challenge password []: #证书请求需要加密存放,如果添加密码,需要将密码一同给CA #An optional company name []:</pre> <p style="text-indent: 2em">将签署请求文件发送给CA服务器</p> <pre class="brush:bash;toolbar:false">#CA服务器工作目录下,手动创建了一个存放证书请求的目录(存放目录请随意)</pre> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703163627-7.jpg" title="1428250883259269.jpg" alt="8.jpg" /><br style="text-indent: 2em" /></p> <p style="text-indent: 2em"> CA签署证书</p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703163627-10.jpg" title="1428250904122966.jpg" alt="9.jpg" /></p> <p style="text-indent: 2em">将签署的证书发送给请求者</p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703163627-7-1.jpg" title="1428250921918809.jpg" alt="10.jpg" /></p> <p style="text-indent: 2em">这样客户端就可以配置使用CA签署的证书,进行加密通信了。如果客户端的私钥不慎丢失,或者证书过期了该怎么办呢?接下来我们看一下证书怎么吊销吧。</p> <p style="text-indent: 2em"><strong>证书吊销</strong></p> <p style="text-indent: 2em">客户端获取证书serial</p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703163627-19.jpg" title="1428250948529705.jpg" alt="11.jpg" /></p> <p style="text-indent: 2em">CA验证信息</p> <p style="text-indent: 2em">根据节点提交的serial和subject信息来验正与index.txt文件中的信息是否一致</p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703163627-82.jpg" title="1428250963232762.jpg" alt="12.jpg" /></p> <p style="text-indent: 2em">CA吊销证书<br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703163627-21.jpg" title="1428250980281418.jpg" alt="13.jpg" /></p> <p style="text-indent: 2em">CA生成吊销证书编号(第一次吊销)</p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703163627-67.jpg" title="1428250994114173.jpg" alt="14.jpg" /></p> <p style="text-indent: 2em">CA更新证书吊销列表</p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703163627-16.jpg" title="1428251010725641.jpg" alt="15.jpg" /></p> <pre class="brush:bash;toolbar:false">#如果有需要,可查看crl文件的内容 #openssl crl -in /path/to/crlfile.crl -noout -text</pre> <p style="text-indent: 2em">好了,证书成功吊销,可以重新申请了。</p> <p style="text-indent: 2em"><strong>The end</strong></p> <p style="text-indent: 2em">以上便是基于OpenSSL构建私有CA的步骤了,实际效果请自行测试,这里我就不做解析测试了。仅为个人学习整理,如有错漏,大神勿喷~~~</p> <p></p> 最后修改:2021 年 12 月 10 日 10 : 53 AM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 赞赏作者 支付宝微信