2019年1月11日消息,谷歌加密研究人员称将发布一款工具,目的是让用户能够更安全的上网。本周一,谷歌密码学家Filippo Valsorda表示,他已经快完成一项名为mkcert的开源项目,该项目允许开发者在本地部署HTTPS测试环境。
现在,大多数网络流量通过HTTPS传输,且用户对浏览器功能安全性期望望越来越高,这就需要开发人员在HTTPS环境中创建和测试应用程序。而这样做就需要开发者在本地安装TLS/SSL证书,部署HTTPS环境,但实际操作起来并不那么简单,需要开发人员先生成自签名证书再进行安装,整个过较为程繁琐也容易出错。
mkcert则是一个让网站通过自动发布证书和安装来处理HTTPS流量的工具。Valsorda介绍称,通过不安全的HTTP环境测试Web应用程序,可能会掩盖HTTP 和HTTPS混合内容问题,而这些问题可能降低站点的安全性。
据称,mkcert是一个简单的设计工具,它隐藏了生成有效TLS证书所需的难懂知识,并且适用于包括本地主机在内的任何主机名或IP。mkcert并不是创建自签名证书,而是生成由用户的私有证书颁发机构(CA)签名的证书,并计算机在运行时会自动配置为证书可信任状态。因此,当您的浏览器加载由您的mkcert实例生成的证书时,它将显示绿色锁!
mkcert适用的系统包括Linux、macOS、 Windows,同时支持Firefox、 Chrome和Chromium。通过一些额外的步骤,该工具还可以支持Android和iOS系统。
mkcert地址: https://github.com/FiloSottile/mkcert
mkcert是由谷歌的Filippo Valsorda使用Golang开发的一个开源工具,使用非常简单,不需要进行任何配置,就可以生成任何你喜欢的域名的本地可信赖的开发证书。
这个开源库不仅展示了生成证书的用法,也展示了在各个平台上调用证书导入的办法。值得学习。
安装
MacOS
Mac上面我们可以使用Homebrew来进行安装:
1 | brew install mkcert |
Linux
在Linux上面,首先需要安装certutil。
1 | sudo apt install libnss3-tools |
然后你可以使用Linuxbrew来安装:
1 | brew install mkcert |
你也可以直接从源代码进行编译(依赖Go 1.10+)
1 | go get -u github.com/FiloSottile/mkcert |
你也可以直接使用编译好的二进制文件。
如果你使用的是Arch Linux:
1 | git clone https://aur.archlinux.org/mkcert.git |
Windows
在Windows上面,你可以使用Chocolatey来进行安装:
1 | choco install mkcert |
你也可以使用Scoop来进行安装:
1 | scoop bucket add extras |
使用
首先,我们要创建并安装一个本地的CA证书到本地信任库中。
1 | mkcert -install |
如果没有安装nss 会提示以上信息。安装好 nss后,再次执行mkcert -install。 执行mkcert -install需要管理员密码,安装到系统keychain中。

1 | mkcert -install |
再次执行mkcert -install会检测本地CA证书是否安装过了,安装过了就不会再安装;之前未安装的firefox证书会被安装。然后我们就可以直接生成我们自己的证书了。
完成后,您可以开始为您的域生成SSL证书。比如我们要生成example.com,*.example.com,example.test,localhost,127.0.0.1,::1这几个地址的证书,那么使用mkcert直接跟上这些地址就可以了。
1 | $ mkcert example.com "*.example.com" example.test localhost 127.0.0.1 ::1 |
剩下的,我们直接在nginx或者其他程序内配置使用这个生成的证书就可以了,比起自己手动添加证书的方式,真的是太简单,太好用了。
高级使用方法
高级参数
1 | -cert-file FILE, -key-file FILE, -p12-file FILE |
S/MIME
如果你想要生成一个S/MIME邮件证书,那么直接在生成证书的时候名字写成你的邮箱就可以了。
1 | mkcert [email protected] |
移动设备
如果你想让你的证书在移动设备上面受信任,那么就必须安装rootCA。你可以使用mkcert -CAROOT来生成一个rootCA.pem的文件。
在iOS设备上,你可以使用AirDrop、邮件将CA发送给自己,也可以放在http服务器上。安装后,你必须先设置信任该证书。
对于安卓设备,同样你必须安装这个rootCA,并启用它。
其他更多高级用法,可以直接在Github上面查看。
HTTPS最佳配置实践
HTTPS 证书选择
HTTPS 证书如果按照类型来分,可以分为域名验证证书(DV)、组织验证证书(OV)、扩展验证证书(EV),不同类型申请时需要验证的内容不同,花费的时间也不同。这里不做具体普及。
证书有免费和付费两种,这里主要说免费的,常用免费证书主要有:
- 与百度云、腾讯云、阿里云合作的赛门铁克签署的证书,一年免费,申请和使用都很简单,一年到期重新申请即可。
- 现在很火的 Let’s Encrypt,今年它还支持了通配符证书申请,可以说是非常亲民。但是缺点就是证书有效期只有90天,当然这个可以通过技术实现自动续期。对于我们这些小站,可以说是很不错的选择了。
OpenSSL版本
首先要了解自己服务器的OpenSSL版本号,如果你是用的nginx可以通过nginx -V查看版本号,也可以通过openssl version查看(适用于非自己通过openssl源码编译的)。
推荐的OpenSSL版本如下:
- OpenSSL 1.0.2用户需更新到1.0.2h 以上。
- OpenSSL 1.0.1用户需更新到1.0.1t 以上。
- OpenSSL官方已停止对 0.9.8和 1.0.0 两个版本的升级维护,请使用这两个版本的用户将其升级至1.0.2h版本以上。
OpenSSL 1.0.1以下不支持tls1.2 升级前请做好测试
使用安全的协议
SSL/TLS 系列中有五种协议:SSL v2,SSL v3,TLS v1.0,TLS v1.1和TLS v1.2。
- SSL v2 是不安全的,不能使用。此协议版本非常糟糕,即使它们位于完全不同的服务器(DROWN 攻击)上也可以用来攻击具有相同名称的RSA 密钥和站点。
- 当与 HTTP(POODLE 攻击)一起使用时,SSL v3 是不安全的,当与其他协议一起使用时,SSL v3 是弱的。它也是过时的,不应该被使用。
- TLS v1.0 也是不应该使用的传统协议,但在实践中通常仍然是必需的。其主要弱点(BEAST)在现代浏览器中得到缓解,但其他问题仍然存在。
- TLS v1.1 和 v1.2 都没有已知的安全问题,只有 v1.2 提供了现代的加密算法。
注意: 2017年6月30号PCI安全标准委员会官方发表博文将于2018年6月30号(最晚)禁用早期SSL/TLS,并实施更安全的加密协议(TLS v1.1或更高版本,强烈建议使用TLS v1.2)以满足PCI数据安全标准的要求,从而保护支付数据。
所以,目前来看TLS v1.2应该作为您的主要协议,现在TLS1.3已经出来了,未来主流应该是TLS v1.2 + TLS v1.3。
nginx配置代码如下:
1 | ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; |
使用 HSTS (HTTP Strict Transport Security)
指示浏览器只使用 HTTPS 连接到目标服务器。这可以防止一些潜在的中间人攻击,包括 SSL 剥离,会话 cookie 窃取(如果没有被 适当保护)。如果遇到任何与证书相关的错误,它还可以阻止浏览器连接到网站。当浏览器访问一个设置相应 HTTP header 的 HTTPS 网站时,HSTS 将被激活。
HSTS 有一个固定期限,由 max-age 字段值控制。这个值可以是静态的,也可以是相对于将来某个特定日期的,你可以设置成 SSL 证书的过期时间。
建议设置 HSTS header 长的生命周期,最好是半年及以上(即不能小于15552000)。
nginx配置如下:
1 | add_header Strict-Transport-Security "max-age=31536000"; |
选择安全的加密套件
为了安全通信,您必须首先确定您正在与所需方(而不是通过将窃听的其他人)直接沟通并安全地交换数据。在 SSL 和 TLS 中,密码套件定义了如何进行安全通信。
有几个过时的加密原语必须避免:
- 匿名 Diffie-Hellman(ADH)套件不提供身份验证。
- NULL 密码套件不提供加密。
- 导出密码套件在连接中协商时不安全,但也可以针对更喜欢更强大的套件(FREAK攻击)的服务器使用。
- 弱密码(通常为 40 和 56 位)的套件使用可以轻松破坏的加密。
- RC4 是不安全的。
- 3DES 缓慢而虚弱。
推荐的nginx配置:
1 | ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256::!MD5; |
更多安全加固策略
请参考文章HTTPS 安全最佳实践(二)之安全加固
nginx配置Demo
1 | server { |