谢良贵 發表於 2020-5-16 15:22:00

Ubuntu 18.04使用OpenSSL自签证书(证书支持多IP及多域名,谷歌浏览器无警告)

<p><span style="font-size: 18pt">前言</span></p>
<p>在HTTPS数据传输的过程中,需要用SSL/TLS对数据进行加密和解密,以保证网络传输过程中数据的机密性。HTTPS协议可以大致分为两个部分:其一是协商密钥,首先当Client向Web&nbsp;Server发起请求时,Web&nbsp;Server向Client返回一个包含Server端公钥的证书,然后Client验证该证书的合法性并生成一个随机密钥,接着使用该证书对生成的随机密钥进行非对称加密后发送回Web&nbsp;Server,最后Web&nbsp;Server使用私钥进行解密后获取Client生成的随机密钥;其二是加密通信,Web&nbsp;Server与Client端采用随机密钥进行对称加解密进行通信。HTTPS通信流程图如下,引用于Leon_hy的博客。证书一般由第三方CA进行签发,自签证书将不被浏览器信任,会弹出连接不安全的小窗。本文介绍了Ubuntu 18.04使用OpenSSL自建CA且签发证书的流程,并成功获取谷歌等浏览器的信任。</p>
<p><img src="https://img2020.cnblogs.com/blog/1263538/202005/1263538-20200516100535060-1924376205.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p style="text-align: left"><span style="font-size: 24px">环境准备</span></p>
<p style="text-align: left">1. OpenSSL依赖安装</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">$ sudo</span> apt-get <span style="color: rgba(0, 0, 255, 1)">install</span> -y openssl libssl-dev</pre>
</div>
<p>2.&nbsp;创建证书保存目录及相关文件</p>
<p>需要注意的是,以下除了certificate文件夹外,命名必须与/usr/local/ssl/openssl.cnf中的对应名称保持一致,以下均采用默认值</p>
<div class="cnblogs_code">
<pre>$ cd ~<span style="color: rgba(0, 0, 0, 1)">
$ </span><span style="color: rgba(0, 0, 255, 1)">mkdir</span> certificate &amp;&amp;<span style="color: rgba(0, 0, 0, 1)"> cd certificate
$ </span><span style="color: rgba(0, 0, 255, 1)">mkdir</span> demoCA &amp;&amp;<span style="color: rgba(0, 0, 0, 1)"> cd demoCA
$ </span><span style="color: rgba(0, 0, 255, 1)">mkdir</span><span style="color: rgba(0, 0, 0, 1)"> private newcerts
$ </span><span style="color: rgba(0, 0, 255, 1)">touch</span><span style="color: rgba(0, 0, 0, 1)"> index.txt
$ </span><span style="color: rgba(0, 0, 255, 1)">echo</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">01</span><span style="color: rgba(128, 0, 0, 1)">'</span> &gt; serial</pre>
</div>
<p style="text-align: left"><span style="font-size: 18pt">自建CA</span></p>
<p style="text-align: left">1.&nbsp;生成根密钥</p>
<p style="text-align: left">需要注意的是,此处的密钥名必须与/usr/local/ssl/openssl.cnf中的名称保持一致,默认为cakey.pem</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">$ cd private
$ openssl genrsa </span>-out cakey.pem <span style="color: rgba(128, 0, 128, 1)">2048</span></pre>
</div>
<p style="text-align: left">2.&nbsp;生成根CA证书</p>
<div class="cnblogs_code">
<pre>$ openssl req -new -x509 -days <span style="color: rgba(128, 0, 128, 1)">3650</span> -key cakey.pem -out cacert.pem</pre>
</div>
<p>随后按照指引填写根CA证书的相关信息,其中填写内容不做要求(特别指出Common&nbsp;Name此处为根证书颁发机构,命名建议为XX&nbsp;Root&nbsp;CA)</p>
<p>3.&nbsp;将根证书移动到demoCA文件夹下</p>
<div class="cnblogs_code">
<pre>$ cd .. &amp;&amp; <span style="color: rgba(0, 0, 255, 1)">mv</span> ./private/cacert.pem ./</pre>
</div>
<p><span style="font-size: 18pt">添加信任</span></p>
<p>下面介绍两种证书验证场景下,添加信任的方式</p>
<p>1.&nbsp;Google浏览器(火狐浏览器类似)</p>
<p>设置-&gt;隐私设置和安全性-&gt;管理证书-&gt;导入-&gt;下一步-&gt;浏览</p>
<p>注意此处谷歌浏览器默认导入证书后缀为crt,可以选择所有文件后导入cacert.pem文件到<strong>受信任的根证书颁发机构</strong>并确认</p>
<p style="text-align: left"><img src="https://img2020.cnblogs.com/blog/1263538/202005/1263538-20200516104815480-1693009235.png"></p>
<p style="text-align: left">2.&nbsp;OpenSSL默认证书验证文件(调用OpenSSL库验证证书合法性的应用将使用该文件如curl等,注意在Ubuntu其他版本中ca-certificates.crt文件可能又叫做ca-bundle.crt)</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">$ sudo</span> <span style="color: rgba(0, 0, 255, 1)">sh</span> -c <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">cat cacert.pem &gt;&gt; /etc/ssl/certs/ca-certificates.crt</span><span style="color: rgba(128, 0, 0, 1)">"</span></pre>
</div>
<p><span style="font-size: 18pt">颁发证书</span></p>
<p>1.&nbsp;切换出demoCA文件夹,到certificate文件夹</p>
<div class="cnblogs_code">
<pre>$ cd ~/certificate</pre>
</div>
<p>2.&nbsp;创建custom.ext文件,添加多IP配置,文件内容如下(如果需要配置多DNS域名解析,可以在[ SubjectAlternativeName ]下添加DNS.1 =&nbsp;www.XXX.com或者正则匹配式*.XXX.com)</p>
<p>&nbsp;<img src="https://img2020.cnblogs.com/blog/1263538/202005/1263538-20200516111440208-331129782.png"></p>
<p>&nbsp;3.&nbsp;创建私钥</p>
<div class="cnblogs_code">
<pre>$ openssl genrsa -out custom.key <span style="color: rgba(128, 0, 128, 1)">2048</span></pre>
</div>
<p>4.&nbsp;创建证书请求文件</p>
<div class="cnblogs_code">
<pre>$ openssl req -new -key custom.key -out custom.csr</pre>
</div>
<p>随后按照指引填写证书的相关信息,填写内容除了Common&nbsp;Name,其余部分尽量与根证书保持一致(Common&nbsp;Name内容不做要求)</p>
<p>5.&nbsp;签发证书</p>
<div class="cnblogs_code">
<pre>$ openssl ca -<span style="color: rgba(0, 0, 255, 1)">in</span> custom.csr -extfile custom.ext -days <span style="color: rgba(128, 0, 128, 1)">365</span> -out custom.crt</pre>
</div>
<p>签发后的证书连同私钥可以供Web&nbsp;Server使用</p>
<p><span style="font-size: 18pt">测试</span></p>
<p>1.&nbsp;google浏览器测试结果</p>
<p><img src="https://img2020.cnblogs.com/blog/1263538/202005/1263538-20200516150408862-1047675528.png"></p>
<p>&nbsp;</p>
<p>2.&nbsp;火狐浏览器测试结果</p>
<p><img src="https://img2020.cnblogs.com/blog/1263538/202005/1263538-20200516151424589-1881170253.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p></p>
<p></audio></p>

</div>
<div id="MySignature" role="contentinfo">
    -----------&gt;一个好看的小尾巴<br><br>
来源:https://www.cnblogs.com/pcxie/p/12900666.html
頁: [1]
查看完整版本: Ubuntu 18.04使用OpenSSL自签证书(证书支持多IP及多域名,谷歌浏览器无警告)