1 | mkcert
|
2 | ===
|
3 |
|
4 | 用来生成自签证书的工具
|
5 |
|
6 | ## 示例
|
7 |
|
8 | `mkcert` 是 GO 编写的,一个简单的**零配置**的用来生成自签证书的工具。
|
9 |
|
10 | 下面给一个简单的示例,在本地生成自签证书,并使用让 nc 使用生成的证书。
|
11 |
|
12 | ```zsh
|
13 | ~ ········································································································································· 10:46:25
|
14 | ❯ mkcert -install
|
15 | The local CA is already installed in the system trust store! 👍The local CA is already installed in the Firefox and/or Chrome/Chromium trust store! 👍
|
16 | ~ ········································································································································· 10:46:34
|
17 | ❯ mkcert example.com "*.example.com" example.test localhost 127.0.0.1 ::1
|
18 |
|
19 | Created a new certificate valid for the following names 📜 - "example.com"
|
20 | - "*.example.com"
|
21 | - "example.test"
|
22 | - "localhost"
|
23 | - "127.0.0.1"
|
24 | - "::1"
|
25 |
|
26 | Reminder: X.509 wildcards only go one level deep, so this won't match a.b.example.com ℹ️
|
27 |
|
28 | The certificate is at "./example.com+5.pem" and the key at "./example.com+5-key.pem" ✅
|
29 | It will expire on 30 January 2025 🗓
|
30 |
|
31 | ~ ········································································································································· 10:47:37
|
32 | ❯ ls
|
33 | 公共 视频 文档 音乐 aria aria2-downloads Dockerfile example.com+5.pem GOPATH minio-binaries nowip_hosts.txt tech_backend.jar
|
34 | 模板 图片 下载 桌面 aria2-config cv_debug.log example.com+5-key.pem go math navicat_reset src
|
35 | ~ ········································································································································· 10:47:55
|
36 | ❯ ncat -lvp 1589 --ssl-key example.com+5-key.pem --ssl-cert example.com+5.pem
|
37 | Ncat: Version 7.92 ( https://nmap.org/ncat )
|
38 | Ncat: Listening on :::1589
|
39 | Ncat: Listening on 0.0.0.0:1589
|
40 | Ncat: Connection from 127.0.0.1.
|
41 | Ncat: Connection from 127.0.0.1:39156.
|
42 | Ncat: Failed SSL connection from 127.0.0.1: error:00000000:lib(0):func(0):reason(0)
|
43 | ```
|
44 |
|
45 | `mkcert` 自动生成并安装一个本地 CA 到 root stores,并且生成 locally-trusted 证书。`mkcert` 不会自动使用证书来配置服务器,不过,这取决于你。
|
46 |
|
47 | ## 安装
|
48 |
|
49 | > Warning: `mkcert` 自动生成的 `rootCA-key.pem` 文件提供了完整的能力来拦截你机器上的安全请求。请不要分享它。
|
50 |
|
51 | ### macOS
|
52 |
|
53 | ```bash
|
54 | $ brew install mkcert
|
55 | $ brew install nss # 如果用 Firefox 的话
|
56 | ```
|
57 |
|
58 | ### Linux
|
59 |
|
60 | 在 Linux 上,首先要安装 `certutil`
|
61 |
|
62 | ```bash
|
63 | $ sudo apt install libnss3-tools
|
64 | # -or-
|
65 | $ sudo yum install nss-tools
|
66 | # -or-
|
67 | $ sudo pacman -S nss
|
68 | # -or-
|
69 | $ sudo zypper install mozilla-nss-tools
|
70 | ```
|
71 |
|
72 | 然后可以使用 [Homebrew on Linux](https://docs.brew.sh/Homebrew-on-Linux) 来安装。
|
73 |
|
74 | ```bash
|
75 | $ brew install mkcert
|
76 | ```
|
77 |
|
78 | 或者从源码构建(要求 Go 1.13+)
|
79 |
|
80 | ```bash
|
81 | git clone https://github.com/FiloSottile/mkcert && cd mkcert
|
82 | go build -ldflags "-X main.Version=$(git describe --tags)"
|
83 | ```
|
84 |
|
85 | 又或者使用 [预构建的二进制文件](https://github.com/FiloSottile/mkcert/releases)。
|
86 |
|
87 | ```bash
|
88 | $ curl -JLO "https://dl.filippo.io/mkcert/latest?for=linux/amd64"
|
89 | $ chmod +x mkcert-v*-linux-amd64
|
90 | $ sudo cp mkcert-v*-linux-amd64 /usr/local/bin/mkcert
|
91 | ```
|
92 |
|
93 | 对于 Arch Linux 用户(比如我),[`mkcert`](https://www.archlinux.org/packages/community/x86_64/mkcert/) 在 Arch Linux 官方仓库中可用。
|
94 |
|
95 | ```bash
|
96 | $ sudo pacman -S mkcert
|
97 | ```
|
98 |
|
99 | ### Windows
|
100 |
|
101 | 使用 [Chocolatey](https://chocolatey.org/)
|
102 |
|
103 | ```bash
|
104 | $ choco install mkcert
|
105 | ```
|
106 |
|
107 | 或者使用 Scoop
|
108 |
|
109 | ```bash
|
110 | $ scoop bucket add extras
|
111 | $ scoop install mkcert
|
112 | ```
|
113 |
|
114 | 或者从源码构建(要求 Go 1.10+) ,或者使用 [预构建的二进制文件](https://github.com/FiloSottile/mkcert/releases)。
|
115 |
|
116 | 如果遇到权限问题,请使用管理员运行 `mkcert`
|
117 |
|
118 | ## 支持的 root stores
|
119 |
|
120 | `mkcert` 支持以下 root stores:
|
121 |
|
122 | - macOS system store
|
123 | - Windows system store
|
124 | - Linux 发行版提供
|
125 | - `update-ca-trust` (Fedora,RHEL,CentOS)或者
|
126 | - `update-ca-certificates` (Ubuntu,Debian,OpenSUSE,SLES)或者
|
127 | - `trust` (Arch)
|
128 | - Firefox (仅 macOS 和 Linux)
|
129 | - Chrome 和 Chromium
|
130 | - Java(当 `JAVA_HOME` 被设置时)
|
131 |
|
132 | 为了把 local root CA 装到这些 root stores 中,你可以设置 `TRUST_STORES` 环境变量到一个逗号分隔的 list。有这些选项:"system","java" 和 "nss"(包括了 Firefox)。
|
133 |
|
134 | ## 高级 topics
|
135 |
|
136 | ### 高级选项
|
137 |
|
138 | ```bash
|
139 | -cert-file FILE, -key-file FILE, -p12-file FILE
|
140 | # 自定义输出路径.
|
141 | -client # 生成供客户端认证使用的证书.
|
142 | -ecdsa # 生成使用一个 ECDSA (一种椭圆曲线签名算法)key 来生成证书.
|
143 | -pkcs12 # 生成一个 ".p12" PKCS #12 文件,也可以被识别为 ".pfx" 文件,
|
144 | # 包含 cert 和 key for legacy applications.
|
145 | -csr CSR # 生成一个给予 CSR(证书签名申请) 的证书。
|
146 | # 与除了 -install 和 -cert-file 以外的其它所以 flag 和参数冲突!
|
147 | ```
|
148 |
|
149 | [SSL 证书 什么是CSR?-常见问题-文档中心-腾讯云](https://cloud.tencent.com/document/product/400/5367)
|
150 |
|
151 | > **请注意!** 你必须把这些选项放在域名列表之前。
|
152 |
|
153 | ### 例如
|
154 |
|
155 | ```bash
|
156 | mkcert -key-file key.pem -cert-file cert.pem example.com *.example.com
|
157 | ```
|
158 |
|
159 | ### S/MIME (邮件安全证书)
|
160 |
|
161 | 用下面这种方式 `mkcert` 会生成一个 S/MIME 证书:
|
162 |
|
163 | ```bash
|
164 | mkcert filippo@example.com
|
165 | ```
|
166 |
|
167 | ### 移动设备
|
168 |
|
169 | 对于要让移动设备信任证书的情况,你得安装 root CA。就是 `rootCA.pem` 这个文件,可以通过 `mkcert -CAROOT` 打印出这个文件所在的目录。
|
170 |
|
171 | 在 iOS 上,你也可以使用 AirDrop,把 CA 邮件发给你自己,或者通过一个 HTTP server 提供它。在打开它之后,你需要 [install the profile in Settings > Profile Downloaded](https://github.com/FiloSottile/mkcert/issues/233#issuecomment-690110809) and then [enable full trust in it](https://support.apple.com/en-nz/HT204477) 。
|
172 |
|
173 | 对于 Android ,你得安装这个 CA 然后在应用程序的开发版本中启用 user roots。可以看一看这个 [StackOverflow 回答](https://stackoverflow.com/a/22040887/749014) 。
|
174 |
|
175 | ### 用 Node.js 来使用这个 root
|
176 |
|
177 | Node 不使用 system root store,所以它不会自动接受 `mkcert` 证书。相反,你得设置 [`NODE_EXTRA_CA_CERTS`](https://nodejs.org/api/cli.html#cli_node_extra_ca_certs_file) 环境变量。
|
178 |
|
179 | ```bash
|
180 | export NODE_EXTRA_CA_CERTS="$(mkcert -CAROOT)/rootCA.pem"
|
181 | ```
|
182 |
|
183 | ### 改变 CA 文件的位置
|
184 |
|
185 | CA 证书和它的 key 被存储在用户家目录的一个文件夹中。一般来说你不会想去关注它的位置,因为它会被自动装载。但是你可以通过 `mkcert -CAROOT` 来打印这个目录位置。
|
186 |
|
187 | 如果你想要管理单独的 CA 们,你可以使用 `\$CAROOT` 环境变量来设置 mkcert 放置和寻找 CA files 的路径。
|
188 |
|
189 | ### 在其它系统上安装 CA
|
190 |
|
191 | 安装 trust store 不需要 CA key(只要 CA),所以你可以导出 CA,并且使用 `mkcert` 来安装到其它机器上。
|
192 |
|
193 | - 找到 `rootCA.pem` 文件,可以用 `mkcert -CAROOT` 找到对应目录。
|
194 | - 把它 copy 到别的机器上。
|
195 | - 设置 `\$CAROOT` 为 `rootCA.pem` 所在目录。
|
196 | - 运行 `mkcert -install`(arch linux 可以 `sudo trust anchor --store rootCA.pem`,其它发行版可以用自带的命令手动添加来信任 CA)
|
197 |
|
198 | 请千万记住 `mkcert` 是用于开发目的的,不建议用于生产,所以它不应该被用到用户终端上,并且你不应该导出或者共享 `rootCA-key.pem` 。
|