0%

本地HTTPS证书工具

​ 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
2
brew install mkcert
brew install nss # 如果你使用Firefox的话

Linux

在Linux上面,首先需要安装certutil

1
2
3
4
5
6
7
sudo apt install libnss3-tools
-or-
sudo yum install nss-tools
-or-
sudo pacman -S nss
-or-
sudo zypper install mozilla-nss-tools

然后你可以使用Linuxbrew来安装:

1
brew install mkcert

你也可以直接从源代码进行编译(依赖Go 1.10+)

1
2
go get -u github.com/FiloSottile/mkcert
$(go env GOPATH)/bin/mkcert

你也可以直接使用编译好的二进制文件

如果你使用的是Arch Linux:

1
2
3
git clone https://aur.archlinux.org/mkcert.git
cd mkcert
makepkg -si

Windows

在Windows上面,你可以使用Chocolatey来进行安装:

1
choco install mkcert

你也可以使用Scoop来进行安装:

1
2
scoop bucket add extras
scoop install mkcert

使用

首先,我们要创建并安装一个本地的CA证书到本地信任库中。

1
2
3
4
5
6
mkcert -install
Using the local CA at "/Users/alpha/Library/Application Support/mkcert"
Sudo password:
The local CA is now installed in the system trust store! ⚡️
Warning: "certutil" is not available, so the CA can't be automatically installed in Firefox! ⚠️
Install "certutil" with "brew install nss" and re-run "mkcert -install" 👈

如果没有安装nss 会提示以上信息。安装好 nss后,再次执行mkcert -install。 执行mkcert -install需要管理员密码,安装到系统keychain中。

keychain

1
2
3
4
5
6
mkcert -install
Using the local CA at "/Users/alpha/Library/Application Support/mkcert"
Sudo password:
The local CA is now installed in the system trust store! ⚡️
Warning: "certutil" is not available, so the CA can't be automatically installed in Firefox! ⚠️
Install "certutil" with "brew install nss" and re-run "mkcert -install" 👈

再次执行mkcert -install会检测本地CA证书是否安装过了,安装过了就不会再安装;之前未安装的firefox证书会被安装。然后我们就可以直接生成我们自己的证书了。

完成后,您可以开始为您的域生成SSL证书。比如我们要生成example.com,*.example.com,example.test,localhost,127.0.0.1,::1这几个地址的证书,那么使用mkcert直接跟上这些地址就可以了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ mkcert example.com "*.example.com" example.test localhost 127.0.0.1 ::1
Using the local CA at "/Users/wangjunfeng/Library/Application Support/mkcert"

Created a new certificate valid for the following names 📜
- "example.com"
- "*.example.com"
- "example.test"
- "localhost"
- "127.0.0.1"
- "::1"

Reminder: X.509 wildcards only go one level deep, so this won't match a.b.example.com ℹ️

The certificate is at "./example.com+5.pem" and the key at "./example.com+5-key.pem" ✅

剩下的,我们直接在nginx或者其他程序内配置使用这个生成的证书就可以了,比起自己手动添加证书的方式,真的是太简单,太好用了。

高级使用方法

高级参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-cert-file FILE, -key-file FILE, -p12-file FILE
Customize the output paths.

-client
Generate a certificate for client authentication.

-ecdsa
Generate a certificate with an ECDSA key.

-pkcs12
Generate a ".p12" PKCS #12 file, also know as a ".pfx" file,
containing certificate and key for legacy applications.

-csr CSR
Generate a certificate based on the supplied CSR. Conflicts with
all other flags and arguments except -install and -cert-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版本如下:

  1. OpenSSL 1.0.2用户需更新到1.0.2h 以上。
  2. OpenSSL 1.0.1用户需更新到1.0.1t 以上。
  3. 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
server {
listen 443 ssl http2; # 开启http2
server_name www.test.com; # 站点域名
root /path_to_webroot; # 网站目录
index index.html;

ssl on;
ssl_certificate "/path_tocert/server.crt";
ssl_certificate_key "/path_tocert/server.key";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256::!MD5;
ssl_protocols TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;

add_header Strict-Transport-Security "max-age=31536000";

error_page 404 /404.html;

}
server{
listen 80;
server_name www.test.com;
rewrite ^(.*)$ https://$server_name$1 permanent;
}

HTTPS 安全监测工具

参考资料