<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Soul Of Free Loop &#187; 证书</title>
	<atom:link href="https://zohead.com/archives/tag/certificate/feed/" rel="self" type="application/rss+xml" />
	<link>https://zohead.com</link>
	<description>Uranus Zhou&#039;s Blog</description>
	<lastBuildDate>Sat, 19 Jul 2025 15:42:46 +0000</lastBuildDate>
	<language>zh-CN</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.8</generator>
	<item>
		<title>Win10 Bash下使用KeePass KeeAgent插件</title>
		<link>https://zohead.com/archives/win10-bash-keeagent/</link>
		<comments>https://zohead.com/archives/win10-bash-keeagent/#comments</comments>
		<pubDate>Mon, 05 Dec 2016 16:40:32 +0000</pubDate>
		<dc:creator><![CDATA[Uranus Zhou]]></dc:creator>
				<category><![CDATA[Windows]]></category>
		<category><![CDATA[工具]]></category>
		<category><![CDATA[Bash]]></category>
		<category><![CDATA[KeeAgent]]></category>
		<category><![CDATA[KeePass]]></category>
		<category><![CDATA[MSYS]]></category>
		<category><![CDATA[msysGit]]></category>
		<category><![CDATA[SSH]]></category>
		<category><![CDATA[Win10]]></category>
		<category><![CDATA[WSL]]></category>
		<category><![CDATA[证书]]></category>

		<guid isPermaLink="false">https://zohead.com/?p=1315</guid>
		<description><![CDATA[Win10 Bash 使用 KeeAgent 问题 出于管理不同服务器以及自己几个 VPS 的需要，我都会把这些 SSH 密钥保存到自己的 KeePass 密码数据库中，KeePass 软件安装了 KeeAgent 插件之后，可以在用户需要登录服务器时方便地自动加载 SSH 密钥。KeeAgent 同时支持 PuTTY 和 OpenSSH 格式的私钥，而且支持 Windows / Linux / Mac 系统。我在平时使用中无论用 Windows 下的 PuTTY / SecureCRT / XShell 软件还是 Linux 下用 ssh 命令都能愉快的自动加载 KeeAgent 保存的 S [&#8230;]]]></description>
				<content:encoded><![CDATA[<h2 id="win10-bash-使用-keeagent-问题">Win10 Bash 使用 KeeAgent 问题</h2>
<p>出于管理不同服务器以及自己几个 VPS 的需要，我都会把这些 SSH 密钥保存到自己的 KeePass 密码数据库中，KeePass 软件安装了 <a href="http://lechnology.com/software/keeagent/">KeeAgent</a> 插件之后，可以在用户需要登录服务器时方便地自动加载 SSH 密钥。KeeAgent 同时支持 PuTTY 和 OpenSSH 格式的私钥，而且支持 Windows / Linux / Mac 系统。我在平时使用中无论用 Windows 下的 PuTTY / SecureCRT / XShell 软件还是 Linux 下用 ssh 命令都能愉快的自动加载 KeeAgent 保存的 SSH 证书，这里也强烈建议各位将 SSH 密钥用 KeeAgent 插件保存到 KeePass 密码库中。</p>
<p>不过自从将工作的电脑系统升级到 Windows 10 之后，虽然我使用 Win10 系统自带的 Bash shell 的场合也越来越多了（原来的 MSYS 和 Cygwin 环境基本很少开启了），但也发现 Win10 Bash 自带的 ssh 命令却不支持 KeeAgent 插件，仍然需要手工选择私钥文件或者输入密码登录服务器。</p>
<p>KeeAgent 在 Linux / Mac 系统下是支持原生的 SSH agent 的，SSH agent 使用的是基于 Unix socket 文件工作方式，也因此 Linux / Mac 系统下的 ssh 命令直接就能自动加载 KeeAgent 保存的密钥。</p>
<p>虽然 Win10 WSL（Windows Subsystem for Linux）子系统内部是支持 Unix socket 文件的，但 WSL 子系统外的 Windows 版本 KeeAgent 插件要想支持 WSL 内部的 socket 文件就不太容易了，还需要通过别的方法来绕过这个限制。</p>
<h2 id="msysgit-to-unix-socket-代理">msysGit to Unix socket 代理</h2>
<p>看了 KeePass 的 KeeAgent 插件选项可以看到该插件是支持 Cygwin 和 <a href="https://github.com/msysgit/msysgit">msysGit</a>（现在已更名为 <a href="https://git-for-windows.github.io/">Git for Windows</a>）兼容的 socket 文件的，这样原来的 Cygwin 和 MSYS 用户也可以自动加载 KeeAgent 中保存的密钥，例如我的 KeeAgent 配置如下：</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737371494/keeagent-socket.png" alt="KeeAgent 的 msysGit socket 选项" title="KeeAgent 的 msysGit socket 选项"></p>
<p>虽然 KeeAgent 不能直接支持 Win10 WSL 子系统内的 Unix socket 文件，但已经有人写了个 msysGit socket to Unix socket 的 Python 代理程序，借助此 <a href="https://gist.github.com/FlorinAsavoaie/8c2b6cb00f786c2caab65b1a51f4e847"><strong>msysgit2unix-socket.py</strong></a> 代理程序就可以让 Win10 Bash shell 通过 SSH agent 加载 KeeAgent 中的密钥咯。</p>
<p>该代理程序启动时会创建一个用于 SSH 认证的 Unix socket 文件，然后 TCP 连接到本地 KeeAgent 插件创建的 msysGit socket 文件，收到 ssh、scp 等命令的认证请求后将数据转发到 KeeAgent 插件，最后将结果返回到 Unix socket 文件。代理程序的工作机制大概如我粗画的这张图：</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442857/msysgit2unix-socket.png" alt="msysGit to Unix socket 代理工作机制" title="msysGit to Unix socket 代理工作机制"></p>
<p>不过我在使用中还是发现该代理程序存在一点小问题：</p>
<p>第一次 SSH 认证可以通过 KeeAgent 插件返回成功，后续再有新的认证请求时却会一直卡住。调试之后发现前面的认证请求完成之后，虽然 ssh 命令至 Unix socket 文件的连接关闭了，但是代理程序至 msysGit socket 文件的连接却一直保持着未关闭，这样新的认证请求将无法正常从 KeeAgent 插件获取有效的证书数据。</p>
<p>为了解决这个问题，我 fork 了这个 msysGit to Unix socket 代理程序，并做了小改动，也放到了 Gist 上：</p>
<p><a href="https://gist.github.com/zohead/b3cbb709fdfd2c0da31bff1b3f436af7">https://gist.github.com/zohead/b3cbb709fdfd2c0da31bff1b3f436af7</a></p>
<h2 id="使用-socket-代理程序">使用 socket 代理程序</h2>
<p>首先下载 <a href="https://gist.github.com/zohead/b3cbb709fdfd2c0da31bff1b3f436af7/raw/7afb94eeb531fc10f8168ad828e32103268d76b7/msysgit2unix-socket.py"><strong>msysgit2unix-socket.py</strong></a> 代理程序，可以直接放到 Win10 Bash shell 用户主目录中，然后编辑 <code>~/.bashrc</code> 文件增加下面这几行：</p>
<pre class="brush: bash; title: ; notranslate">
export SSH_AUTH_SOCK=&quot;/tmp/.ssh-auth-sock&quot;
if [ -s /mnt/d/msys/keeagent.sock ]; then
	~/msysgit2unix-socket.py /mnt/d/msys/keeagent.sock:$SSH_AUTH_SOCK 2&gt;/dev/null
	trap &quot;~/msysgit2unix-socket-exit.sh $$&quot; EXIT
fi
</pre>
<p>这样运行 bash 命令后会自动启动该程序，<strong>msysgit2unix-socket.py</strong> 程序启动之后会自动转为后台守护进程，并在 <code>/tmp</code> 目录（实际在 Windows 系统的 <code>C:\Users\user\AppData\Local\lxss\rootfs\tmp</code> 目录下）下生成兼容 ssh 命令的 socket 文件，而且如果开启多个 Bash 会话也不会影响，只会在后台保持运行一个 <strong>msysgit2unix-socket.py</strong> 代理程序。</p>
<p>上面内容第二行的 <code>/mnt/d/msys/keeagent.sock</code> 路径就是 KeeAgent 选项中的 <strong>Create msysGit compatible socket file</strong> 文件路径，请根据情况自行修改。</p>
<p>我增加的一行 trap 退出操作是为了能在最后一个 Win10 Bash 会话退出之时能执行自定义的清理脚本以删除 <strong>msysgit2unix-socket.py</strong> 程序产生的临时文件，不然下次再开启 Bash 运行 <strong>msysgit2unix-socket.py</strong> 程序时会因为已经存在临时的 socket 及 PID 文件导致程序退出。</p>
<p>我增加的 <strong>msysgit2unix-socket-exit.sh</strong> 脚本程序也非常简单：</p>
<pre class="brush: bash; title: ; notranslate">
#!/bin/sh
BASHPIDS=`pidof bash -o %PPID -o $1`
[ &quot;x$BASHPIDS&quot; != &quot;x&quot; ] &amp;&amp; exit 0
rm -f /tmp/msysgit2unix-socket.pid /tmp/.ssh-auth-sock
</pre>
<p>这里使用 pidof 命令判断当前退出的是不是最后一个 Win10 Bash 会话（通过参数忽略了父 bash 进程和脚本程序自身进程），如果是最后一个 Bash 会话则删除 <strong>msysgit2unix-socket.py</strong> 程序产生的临时文件。</p>
<p>当然你也可以去掉增加的清理脚本，直接在 <code>~/.bashrc</code> 文件中判断 <strong>msysgit2unix-socket.py</strong> 程序运行状态并删除之前产生的临时文件：</p>
<pre class="brush: bash; title: ; notranslate">
export SSH_AUTH_SOCK=&quot;/tmp/.ssh-auth-sock&quot;
if [ -s /mnt/d/msys/keeagent.sock ]; then
	pgrep -f msysgit2unix-socket.py &gt;/dev/null 2&gt;&amp;1
	if [ $? -ne 0 ]; then
		rm -f /tmp/msysgit2unix-socket.pid /tmp/.ssh-auth-sock
		~/msysgit2unix-socket.py /mnt/d/msys/keeagent.sock:$SSH_AUTH_SOCK 2&gt;/dev/null
	fi
fi
</pre>
<p>这样修改之后就能在 Win10 Bash 里畅快地使用 ssh、scp 等命令通过 KeeAgent 插件自动登录服务器进行管理咯，祝大家在这个看起来不太冷的 12 月玩得开心 ^_^。</p>
]]></content:encoded>
			<wfw:commentRss>https://zohead.com/archives/win10-bash-keeagent/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>考虑开启SRI防止七牛CDN HTTPS劫持</title>
		<link>https://zohead.com/archives/qiniu-https-tamper/</link>
		<comments>https://zohead.com/archives/qiniu-https-tamper/#comments</comments>
		<pubDate>Fri, 27 May 2016 14:48:28 +0000</pubDate>
		<dc:creator><![CDATA[Uranus Zhou]]></dc:creator>
				<category><![CDATA[HTTPS]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[CDN]]></category>
		<category><![CDATA[https]]></category>
		<category><![CDATA[SRI]]></category>
		<category><![CDATA[七牛]]></category>
		<category><![CDATA[云存储]]></category>
		<category><![CDATA[劫持]]></category>
		<category><![CDATA[证书]]></category>

		<guid isPermaLink="false">https://zohead.com/?p=1237</guid>
		<description><![CDATA[最近我在使用 Android 上的 Chrome 浏览器访问博客页面时发现一个奇怪的问题：博客页面底部有一个悬浮的叉，但又没有显示任何实际的内容。赶紧用 Chromebook 打开博客网页，将 User Agent 切换成 Android Chrome，这时可以看到网页里无端多了一个 iframe，该 iframe 地址为 http://dbcpm.com/locate_1/jiwei_MBpt.html，如下图所示： 由于我确定博客 VPS 后台并没有被入侵，因此初步估计是网页被万恶的运营商给劫持了，但又一想我的博客已经启用了全站 HTTPS，按说不会轻易遇到这种问题了。马上看看 Chrom [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>最近我在使用 Android 上的 Chrome 浏览器访问博客页面时发现一个奇怪的问题：博客页面底部有一个悬浮的叉，但又没有显示任何实际的内容。赶紧用 Chromebook 打开博客网页，将 User Agent 切换成 Android Chrome，这时可以看到网页里无端多了一个 iframe，该 iframe 地址为 <code>http://dbcpm.com/locate_1/jiwei_MBpt.html</code>，如下图所示：</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442960/tampered-page.png" alt="博客被劫持效果" title=""></p>
<p>由于我确定博客 VPS 后台并没有被入侵，因此初步估计是网页被万恶的运营商给劫持了，但又一想我的博客已经启用了全站 HTTPS，按说不会轻易遇到这种问题了。马上看看 Chrome 浏览器上的地址栏标志，果然没有小绿锁了，浏览器控制台里也有 Mixed Content 报错：</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442846/mixed-content-error.png" alt="Mixed Content 报错" title=""></p>
<p>可以看到浏览器拒绝加载 HTTP 的 JavaScript 文件，接着看看七牛 HTTPS 地址返回的数据是否正确：</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442957/tampered-js.png" alt="七牛 CDN HTTPS 错误数据" title=""></p>
<p>这下立马发现返回的 JavaScript 代码不对了，开头是插入了 HTTP 形式的 JavaScript 文件地址，后面则看起来明显是广告一类的程序代码了。</p>
<p>难道是运营商做了 DNS 劫持导致我使用的七牛 CDN HTTPS 域名 <code>dn-zohead.qbox.me</code> 解析到了不正确的地址？如果是这样按说应该会出现 SSL 证书错误的，而且运营商只是为了插入广告代码而去搞 TLS 中间人攻击之类的感觉也不太合理。</p>
<p>考虑到另一种可能就是七牛 CDN 在从我的博客 VPS 地址回源的时候由于 DNS 污染之类的问题请求到了错误的数据，导致 HTTPS CDN 返回的数据也不对，这样还是登录到七牛后台管理，查看被劫持的 main.js 文件内容是否正确，下载下来对比却发现和我的博客源站内容是一致的，并没有被污染。</p>
<p>多次测试之后我发现如果再刷新页面七牛 HTTPS 劫持的问题可能又没了，而且在新标签页中打开被劫持的 HTTPS JavaScript 路径又能返回正确的数据了，这个时候通过 Chrome 调试工具看到的 HTTP 请求响应结果是这样的：</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442862/normal-https-reponse.png" alt="正常七牛 CDN HTTPS 请求" title=""></p>
<p>而被劫持的 HTTP 请求响应结果则是：</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442957/tampered-https-response.png" alt="被劫持的七牛 CDN HTTPS 请求" title=""></p>
<p>可以看到返回的 HTTP 头信息完全不同，而且多次刷新之后发现被劫持的 HTTPS 数据基本都来自 <code>211.142.22.13</code> 这台七牛的 CDN 服务器。查询之后发现这个 IP 地址是山西移动的（刚好我使用的是移动宽带），看起来只要浏览器是从 <code>211.142.22.13</code> 这台 CDN 服务器请求数据很可能得到的是被劫持的 JavaScript 代码，而如果七牛的 qbox.me 域名解析到的是其它 CDN 服务器地址则数据可能是正常的。</p>
<p>为了更好的重现这个问题，我们可以在 Linux 下先修改系统 hosts 文件使七牛的 qbox.me HTTPS 域名使用进行劫持操作的服务器，然后使用 wget 命令伪装 Android 移动设备以 HTTPS 地址从这台服务器请求 JavaScript 数据：</p>
<pre class="brush: bash; title: ; notranslate">
(trusty)zzm@localhost:~$ wget --referer=&quot;https://zohead.com/&quot; --user-agent=&quot;Mozilla/5.0 (Linux; Android 4.4.2; Nexus 4 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36&quot; https://dn-zohead.qbox.me/test.js
--2016-05-27 00:30:37--  https://dn-zohead.qbox.me/test.js
Resolving dn-zohead.qbox.me (dn-zohead.qbox.me)... 211.142.22.13
Connecting to dn-zohead.qbox.me (dn-zohead.qbox.me)|211.142.22.13|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2391 (2.3K) 1
Saving to: ‘test.js’

100%[===========================================================================================================&gt;] 2,391       --.-K/s   in 0.002s  

2016-05-27 00:30:38 (1.18 MB/s) - ‘test.js’ saved [2391/2391]
</pre>
<p>上面使用 wget 的 <code>--user-agent</code> 参数伪装 Android Chrome 浏览器，使用 <code>--referer</code> 参数伪装从我的博客源站发起请求，而 <code>test.js</code> 同样是一个实际不存在的 JavaScript 地址，我们可以看看返回的数据：</p>
<pre class="brush: bash; title: ; notranslate">
(trusty)zzm@localhost:~$ head test.js 
var osrc =&quot;http://dn-zohead.qbox.me/test.js&quot;;osrc+=(osrc.indexOf('?')&gt;0?'&amp;':'?')+'_t='+(new Date().getTime());document.write('&lt;script type=&quot;text/javascript&quot; src=&quot;'+osrc+'&quot;&gt;&lt;/'+'script&gt;');function withjQuery(callback){if(typeof(jQuery)==&quot;undefined&quot;){var script=document.createElement(&quot;script&quot;);scrip ......
</pre>
<p>很明显这下又得到了被篡改的数据，我们可以试试把 HTTPS 地址改成一个实际存在的 JavaScript 文件并多次运行，你会发现会有一定的概率返回被篡改的数据，有的时候也能返回正确的数据。</p>
<p>另外如果你去掉 <code>--user-agent</code> 参数或者 <code>--referer</code> 参数可能也能得到正确的数据或者正确的 404 报错（对于不存在的 JavaScript 地址），因此我想到可能是劫持方为了不让自己这种龌龊的行径被很容易的发现，而对劫持做了一些限制，如果是直接请求地址（不通过源站 referer 请求）或者通过 PC 端浏览器请求地址则基本上都返回正确的数据。</p>
<p>这下我就可以单独确认 <code>211.142.22.13</code> 这个地址到底是不是真正的七牛服务器了，我们可以修改系统 hosts 文件，例如将我的七牛 HTTPS 域名 <code>dn-zohead.qbox.me</code> 直接改为 <code>211.142.22.13</code> ，然后通过 Chrome 浏览器访问一个七牛服务器上不存在的 JavaScript 地址，确认 HTTPS 证书是否正确。</p>
<blockquote>
<p><strong>提示</strong></p>
<p>从上面 wget 命令的测试结果来看，劫持方可能做了 User Agent 和 Referer 的限制，因此直接访问地址可能并不能看到劫持效果。 <br />
  这就需要将 Chrome 浏览器 User Agent 改为 Android Chrome，另外可以考虑在控制台中输入命令在网页上创建一个链接，并点击链接实现 Referer 跳转的效果，例如：</p>
<pre class="brush: jscript; title: ; notranslate">
var aaa = document.createElement('a');
aaa.innerHTML = 'testlink';
aaa.href = 'https://dn-zohead.qbox.me/ccc8.js'; document.body.appendChild(aaa);
</pre>
</blockquote>
<p>先看看进行劫持操作的 <code>211.142.22.13</code> CDN 服务器的 HTTPS 证书：</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442931/qiniu-tampered-https.png" alt="被劫持的七牛 CDN HTTPS 证书" title=""></p>
<p>看起来 SSL 服务器证书是正确的，而且从截图的内容也可以看到返回的 JavaScript 代码也明显是被篡改过的。</p>
<p>然后再修改 hosts 文件去掉添加的域名地址条目，重新访问同样不存在的 JavaScript 地址，以确认正确的七牛 CDN 服务器的 HTTPS 证书：</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442931/qiniu-normal-https.png" alt="正常的七牛 CDN HTTPS 证书" title=""></p>
<p>可以发现正常的七牛 CDN 服务器对于不存在的文件是可以正确返回 Document not found 错误的，而进行劫持操作的 CDN 服务器则可能会返回篡改过的 JavaScript 代码，而最要命的是这两个服务器的 HTTPS 证书是完全一致的。</p>
<p>而我使用 HTTPS 访问博客时由于 Mixed Content 问题会导致博客页面时有些功能不正常，而且本该被篡改插入的广告反倒没显示出来，用 Android Chrome 浏览器以 HTTP 方式访问博客多次刷新之后可以看到被劫持插入页面的广告，按说也可以根据 CNZZ 统计代码追踪看看，不过这个就没太大兴趣了：</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442931/qiniu-cdn-https-ad.png" alt="被劫持插入的广告" title=""></p>
<p>至此七牛 CDN HTTPS 劫持的问题基本可以明确了：</p>
<ul>
<li>重点针对 JavaScript 文件；</li>
<li>并不是七牛 CDN 上 DNS 污染而回源数据不正确导致；</li>
<li>并不是所有七牛 CDN 地址都会返回篡改的数据；</li>
<li>重点针对移动浏览器，移动网络环境下更加明显；</li>
<li>对劫持做了一定的限制，防止被轻易发现；</li>
<li>进行劫持操作的服务器使用的是正确的七牛 HTTPS 证书。</li>
</ul>
<p>至于这种恶意 CDN HTTPS 劫持到底是七牛内部人士所为，还是七牛的 HTTPS 证书泄漏被运营商利用，还需要进一步的确认。提交工单之后七牛客服人员的初步解释是：</p>
<ul>
<li>qbox.me 域名被大量客户使用比较不稳定，建议迁移到 HTTPS 自定义域名，而 HTTPS 自定义域名是收费的；</li>
<li>使用 qnssl.com HTTPS 自定义域名的话则有做回源的验证，并且节点相对较多，应该不会有劫持情况的发生。</li>
</ul>
<p>然而我查看了七牛 CDN 后台数据之后还是基本可以确认并没有回源数据被污染的情况，因此七牛给的答复并不能让我满意。</p>
<p>由此也可以看出在这片神奇的土地上，我们的网络环境除了要面临 GFW 这个几乎众所周知的阻碍在其它方面又到底是如何的恶劣，网站主们即使是开启了全站 HTTPS 也难以幸免。就算是七牛所有 CDN 服务器数据都是干净的，也不能保证网络运营商不在中间干点 DNS 污染、TLS 攻击之类的坏事。</p>
<p>如果要解决这种问题我初步想到的就是为博客开启 Subresource Integrity（SRI）安全检查功能，虽然目前支持 SRI 功能的浏览器（目前主要是 Chrome 和 Firefox）并不多，但其还是可以帮助 Web 开发者尽量避免各种网站数据可能被第三方篡改的情况。</p>
<p>SRI 的相关介绍可以参考（第二篇中文文章介绍的比较详细）：</p>
<ul>
<li><a href="https://www.srihash.org/">https://www.srihash.org/</a></li>
<li><a href="https://imququ.com/post/subresource-integrity.html">https://imququ.com/post/subresource-integrity.html</a></li>
</ul>
<p>由于 SRI 需要对网页中所有请求外部资源的地方进行修改，一个个手工通过 openssl 命令和修改网页来做实在比较麻烦。</p>
<p>对于 WordPress 博客已经有人实现了 SRI 资源管理的插件 <a href="https://wordpress.org/plugins/wp-sri/">Subresource Integrity (SRI) Manager</a>，该插件可以自动为 WordPress 博客中引用的资源添加 SRI SHA-256 校验值，这样可以减少博客被各种 HTTP、HTTPS 中间人劫持攻击的机率。不过目前还是准备先测试看看此插件稳定性如何，后续再考虑为博客整体开启 SRI 功能咯。</p>
]]></content:encoded>
			<wfw:commentRss>https://zohead.com/archives/qiniu-https-tamper/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>博客正式启用Let&#8217;s Encrypt HTTPS证书</title>
		<link>https://zohead.com/archives/lets-encrypt-https/</link>
		<comments>https://zohead.com/archives/lets-encrypt-https/#comments</comments>
		<pubDate>Wed, 13 Jan 2016 17:18:26 +0000</pubDate>
		<dc:creator><![CDATA[Uranus Zhou]]></dc:creator>
				<category><![CDATA[网络]]></category>
		<category><![CDATA[https]]></category>
		<category><![CDATA[Let's Encrypt]]></category>
		<category><![CDATA[证书]]></category>

		<guid isPermaLink="false">https://zohead.com/?p=1125</guid>
		<description><![CDATA[之前几个月我关注过目前网上几个免费为个人网站提供 HTTPS 证书的服务，开始了解到的是有一些站长用到的免费一年的沃通证书，后来看到 Let&#39;s Encrypt 这个专门提供免费 HTTPS 证书的公益组织。 前段时间发现 Let&#39;s Encrypt 终于开始正式提供服务了，看到 Let&#39;s Encrypt twitter 里提到 mozilla、Google 这些公司也开始赞助他们，观望了一阵之后看到不少博客主们也启用了他们的证书，虽然 Let&#39;s Encrypt 现在只提供 90 天的 HTTPS 证书，但好在有自动部署的工具可以自动更新证书。 这下必须心痒 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>之前几个月我关注过目前网上几个免费为个人网站提供 HTTPS 证书的服务，开始了解到的是有一些站长用到的免费一年的沃通证书，后来看到 <a href="https://letsencrypt.org/">Let&#39;s Encrypt</a> 这个专门提供免费 HTTPS 证书的公益组织。</p>
<p>前段时间发现 Let&#39;s Encrypt 终于开始正式提供服务了，看到 Let&#39;s Encrypt twitter 里提到 mozilla、Google 这些公司也开始赞助他们，观望了一阵之后看到不少博客主们也启用了他们的证书，虽然 Let&#39;s Encrypt 现在只提供 90 天的 HTTPS 证书，但好在有自动部署的工具可以自动更新证书。</p>
<p>这下必须心痒了，启用 HTTPS 的好处无需多说：不仅可以避免目前国内非常常见的运营商网站劫持问题，而且启用了 HTTPS 的网站在 Google 搜索结果中权重也更高。我先参考了来自 360 的大牛 <a href="https://imququ.com/post/letsencrypt-certificate.html">Jerry Qu</a> 的博客文章，看起来步骤还是比较简单清晰的，后来看到有国人写的自动部署 Let&#39;s Encrypt 证书的 shell 脚本：</p>
<p><a href="https://github.com/xdtianyu/scripts/tree/master/lets-encrypt">https://github.com/xdtianyu/scripts/tree/master/lets-encrypt</a></p>
<p>于是就按照上面 shell 脚本的说明步骤修改配置文件在我的 VPS 上开始部署，一般只要配置文件中域名、Web 目录正确的话很快就能得到需要的两个证书文件，例如我的：zohead.chained.crt 和 zohead.com.key，接着修改 Nginx 的 vhost 配置文件，直接在原来 <code>listen 80;</code> 后面直接加上这几句（把证书文件替换为实际路径）然后 reload Nginx 服务即可看到效果：</p>
<pre class="brush: bash; title: Nginx vhost配置; notranslate">
listen 443 ssl;
ssl_certificate /xxx/certs/zohead.chained.crt;
ssl_certificate_key /xxx/certs/zohead.com.key;
</pre>
<p>然后用 <a href="https://zohead.com/">https://zohead.com/</a> 访问发现有点问题，由于博客里用到了 CDN 之类的非 HTTPS 资源（也就是 HTTPS mixed content 问题），Chrome 等浏览器会在地址栏中显示警告锁，下面一一解决：</p>
<ul>
<li>之前使用的七牛云存储 CDN 加速直接用的测试 HTTP 子域名，进七牛后台发现其也是支持 HTTPS 的，只要重新申请 HTTPS 子域名通过之后修改 WordPress WP Super Cache 插件中的 CDN 地址即可，这样博客 CDN 方式引用的 JavaScript、CSS 等资源不会被浏览器阻断；</li>
<li>Gravatar 头像之前改成了 http://cn.gravatar.com/，现在直接换为 https://cn.gravatar.com/ 这样即可以支持 HTTPS 而且国内用户访问博客不会出现头像不能显示导致访问速度慢的问题；</li>
<li>之前用的虾米二维码服务地址竟然不支持 HTTPS，不过还好找到了一个支持 HTTPS 的 <a href="http://goqr.me/api/">goQR.me 免费二维码 API</a>，不知道是否稳定，如果后面有问题就直接在 VPS 里集成算了。</li>
</ul>
<p>这样小做修改之后，重新用 HTTPS 方式访问博客，Chrome 浏览器的地址栏里就能看到标志安全私密连接的小绿锁咯 ^_^。接下来就是在 crontab 里再增加一个每个月重新部署 HTTPS 证书的任务，如此后面就基本不用人工干预了，最后还是希望有条件的博主们能尽快启用 HTTPS 保平安哦。</p>
]]></content:encoded>
			<wfw:commentRss>https://zohead.com/archives/lets-encrypt-https/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
