]> git.proxmox.com Git - mirror_acme.sh.git/blob - README.md
Merge pull request #1229 from Neilpang/dev
[mirror_acme.sh.git] / README.md
1 # An ACME Shell script: acme.sh [![Build Status](https://travis-ci.org/Neilpang/acme.sh.svg?branch=master)](https://travis-ci.org/Neilpang/acme.sh)
2
3 [![Join the chat at https://gitter.im/acme-sh/Lobby](https://badges.gitter.im/acme-sh/Lobby.svg)](https://gitter.im/acme-sh/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
4 - An ACME protocol client written purely in Shell (Unix shell) language.
5 - Full ACME protocol implementation.
6 - Simple, powerful and very easy to use. You only need 3 minutes to learn it.
7 - Bash, dash and sh compatible.
8 - Simplest shell script for Let's Encrypt free certificate client.
9 - Purely written in Shell with no dependencies on python or the official Let's Encrypt client.
10 - Just one script to issue, renew and install your certificates automatically.
11 - DOES NOT require `root/sudoer` access.
12 - Docker friendly
13 - IPv6 support
14
15 It's probably the `easiest & smartest` shell script to automatically issue & renew the free certificates from Let's Encrypt.
16
17 Wiki: https://github.com/Neilpang/acme.sh/wiki
18
19 For Docker Fans: [acme.sh :two_hearts: Docker ](https://github.com/Neilpang/acme.sh/wiki/Run-acme.sh-in-docker)
20
21 Twitter: [@neilpangxa](https://twitter.com/neilpangxa)
22
23
24 # [中文说明](https://github.com/Neilpang/acme.sh/wiki/%E8%AF%B4%E6%98%8E)
25
26 # Who are using **acme.sh**
27 - [FreeBSD.org](https://blog.crashed.org/letsencrypt-in-freebsd-org/)
28 - [ruby-china.org](https://ruby-china.org/topics/31983)
29 - [Proxmox](https://pve.proxmox.com/wiki/HTTPS_Certificate_Configuration_(Version_4.x_and_newer))
30 - [pfsense](https://github.com/pfsense/FreeBSD-ports/pull/89)
31 - [webfaction](https://community.webfaction.com/questions/19988/using-letsencrypt)
32 - [Loadbalancer.org](https://www.loadbalancer.org/blog/loadbalancer-org-with-lets-encrypt-quick-and-dirty)
33 - [discourse.org](https://meta.discourse.org/t/setting-up-lets-encrypt/40709)
34 - [Centminmod](http://centminmod.com/letsencrypt-acmetool-https.html)
35 - [splynx](https://forum.splynx.com/t/free-ssl-cert-for-splynx-lets-encrypt/297)
36 - [archlinux](https://aur.archlinux.org/packages/acme.sh-git/)
37 - [opnsense.org](https://github.com/opnsense/plugins/tree/master/security/acme-client/src/opnsense/scripts/OPNsense/AcmeClient)
38 - [more...](https://github.com/Neilpang/acme.sh/wiki/Blogs-and-tutorials)
39
40 # Tested OS
41
42 | NO | Status| Platform|
43 |----|-------|---------|
44 |1|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/ubuntu-latest.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)| Ubuntu
45 |2|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/debian-latest.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)| Debian
46 |3|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/centos-latest.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|CentOS
47 |4|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/windows-cygwin.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|Windows (cygwin with curl, openssl and crontab included)
48 |5|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/freebsd.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|FreeBSD
49 |6|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/pfsense.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|pfsense
50 |7|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/opensuse-latest.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|openSUSE
51 |8|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/alpine-latest.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|Alpine Linux (with curl)
52 |9|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/base-archlinux.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|Archlinux
53 |10|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/fedora-latest.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|fedora
54 |11|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/kalilinux-kali-linux-docker.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|Kali Linux
55 |12|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/oraclelinux-latest.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|Oracle Linux
56 |13|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/proxmox.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)| Proxmox https://pve.proxmox.com/wiki/HTTPSCertificateConfiguration#Let.27s_Encrypt_using_acme.sh
57 |14|-----| Cloud Linux https://github.com/Neilpang/le/issues/111
58 |15|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/openbsd.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|OpenBSD
59 |16|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/mageia.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|Mageia
60 |17|-----| OpenWRT: Tested and working. See [wiki page](https://github.com/Neilpang/acme.sh/wiki/How-to-run-on-OpenWRT)
61 |18|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/solaris.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|SunOS/Solaris
62 |19|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/gentoo-stage3-amd64.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|Gentoo Linux
63 |20|[![Build Status](https://travis-ci.org/Neilpang/acme.sh.svg?branch=master)](https://travis-ci.org/Neilpang/acme.sh)|Mac OSX
64
65 For all build statuses, check our [weekly build project](https://github.com/Neilpang/acmetest):
66
67 https://github.com/Neilpang/acmetest
68
69
70 # Supported modes
71
72 - Webroot mode
73 - Standalone mode
74 - Apache mode
75 - Nginx mode ( Beta )
76 - DNS mode
77 - [Stateless mode](https://github.com/Neilpang/acme.sh/wiki/Stateless-Mode)
78
79
80 # 1. How to install
81
82 ### 1. Install online
83
84 Check this project: https://github.com/Neilpang/get.acme.sh
85
86 ```bash
87 curl https://get.acme.sh | sh
88 ```
89
90 Or:
91
92 ```bash
93 wget -O - https://get.acme.sh | sh
94 ```
95
96
97 ### 2. Or, Install from git
98
99 Clone this project and launch installation:
100
101 ```bash
102 git clone https://github.com/Neilpang/acme.sh.git
103 cd ./acme.sh
104 ./acme.sh --install
105 ```
106
107 You `don't have to be root` then, although `it is recommended`.
108
109 Advanced Installation: https://github.com/Neilpang/acme.sh/wiki/How-to-install
110
111 The installer will perform 3 actions:
112
113 1. Create and copy `acme.sh` to your home dir (`$HOME`): `~/.acme.sh/`.
114 All certs will be placed in this folder too.
115 2. Create alias for: `acme.sh=~/.acme.sh/acme.sh`.
116 3. Create daily cron job to check and renew the certs if needed.
117
118 Cron entry example:
119
120 ```bash
121 0 0 * * * "/home/user/.acme.sh"/acme.sh --cron --home "/home/user/.acme.sh" > /dev/null
122 ```
123
124 After the installation, you must close the current terminal and reopen it to make the alias take effect.
125
126 Ok, you are ready to issue certs now.
127
128 Show help message:
129
130 ```
131 root@v1:~# acme.sh -h
132 ```
133
134 # 2. Just issue a cert
135
136 **Example 1:** Single domain.
137
138 ```bash
139 acme.sh --issue -d example.com -w /home/wwwroot/example.com
140 ```
141
142 or:
143
144 ```bash
145 acme.sh --issue -d example.com -w /home/username/public_html
146 ```
147
148 or:
149
150 ```bash
151 acme.sh --issue -d example.com -w /var/www/html
152 ```
153
154 **Example 2:** Multiple domains in the same cert.
155
156 ```bash
157 acme.sh --issue -d example.com -d www.example.com -d cp.example.com -w /home/wwwroot/example.com
158 ```
159
160 The parameter `/home/wwwroot/example.com` or `/home/username/public_html` or `/var/www/html` is the web root folder where you host your website files. You **MUST** have `write access` to this folder.
161
162 Second argument **"example.com"** is the main domain you want to issue the cert for.
163 You must have at least one domain there.
164
165 You must point and bind all the domains to the same webroot dir: `/home/wwwroot/example.com`.
166
167 Generated/issued certs will be placed in `~/.acme.sh/example.com/`
168
169 The issued cert will be renewed automatically every **60** days.
170
171 More examples: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert
172
173
174 # 3. Install the issued cert to Apache/Nginx etc.
175
176 After you issue a cert, you probably want to install/copy the cert to your Apache/Nginx or other servers.
177 You **MUST** use this command to copy the certs to the target files, **DO NOT** use the certs files in **~/.acme.sh/** folder, they are for internal use only, the folder structure may change in the future.
178
179 **Apache** example:
180 ```bash
181 acme.sh --install-cert -d example.com \
182 --cert-file /path/to/certfile/in/apache/cert.pem \
183 --key-file /path/to/keyfile/in/apache/key.pem \
184 --fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem \
185 --reloadcmd "service apache2 force-reload"
186 ```
187
188 **Nginx** example:
189 ```bash
190 acme.sh --install-cert -d example.com \
191 --key-file /path/to/keyfile/in/nginx/key.pem \
192 --fullchain-file /path/to/fullchain/nginx/cert.pem \
193 --reloadcmd "service nginx force-reload"
194 ```
195
196 Only the domain is required, all the other parameters are optional.
197
198 The ownership and permission info of existing files are preserved. You may want to precreate the files to have defined ownership and permission.
199
200 Install/copy the issued cert/key to the production Apache or Nginx path.
201
202 The cert will be renewed every **60** days by default (which is configurable). Once the cert is renewed, the Apache/Nginx service will be reloaded automatically by the command: `service apache2 force-reload` or `service nginx force-reload`.
203
204
205 # 4. Use Standalone server to issue cert
206
207 **(requires you to be root/sudoer or have permission to listen on port 80 (TCP))**
208
209 Port `80` (TCP) **MUST** be free to listen on, otherwise you will be prompted to free it and try again.
210
211 ```bash
212 acme.sh --issue --standalone -d example.com -d www.example.com -d cp.example.com
213 ```
214
215 More examples: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert
216
217
218 # 5. Use Standalone TLS server to issue cert
219
220 **(requires you to be root/sudoer or have permission to listen on port 443 (TCP))**
221
222 acme.sh supports `tls-sni-01` validation.
223
224 Port `443` (TCP) **MUST** be free to listen on, otherwise you will be prompted to free it and try again.
225
226 ```bash
227 acme.sh --issue --tls -d example.com -d www.example.com -d cp.example.com
228 ```
229
230 More examples: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert
231
232
233 # 6. Use Apache mode
234
235 **(requires you to be root/sudoer, since it is required to interact with Apache server)**
236
237 If you are running a web server, Apache or Nginx, it is recommended to use the `Webroot mode`.
238
239 Particularly, if you are running an Apache server, you should use Apache mode instead. This mode doesn't write any files to your web root folder.
240
241 Just set string "apache" as the second argument and it will force use of apache plugin automatically.
242
243 ```
244 acme.sh --issue --apache -d example.com -d www.example.com -d cp.example.com
245 ```
246
247 More examples: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert
248
249 # 7. Use Nginx mode
250
251 **(requires you to be root/sudoer, since it is required to interact with Nginx server)**
252
253 If you are running a web server, Apache or Nginx, it is recommended to use the `Webroot mode`.
254
255 Particularly, if you are running an nginx server, you can use nginx mode instead. This mode doesn't write any files to your web root folder.
256
257 Just set string "nginx" as the second argument.
258
259 It will configure nginx server automatically to verify the domain and then restore the nginx config to the original version.
260
261 So, the config is not changed.
262
263 ```
264 acme.sh --issue --nginx -d example.com -d www.example.com -d cp.example.com
265 ```
266
267 More examples: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert
268
269 # 8. Use DNS mode:
270
271 Support the `dns-01` challenge.
272
273 ```bash
274 acme.sh --issue --dns -d example.com -d www.example.com -d cp.example.com
275 ```
276
277 You should get an output like below:
278
279 ```
280 Add the following txt record:
281 Domain:_acme-challenge.example.com
282 Txt value:9ihDbjYfTExAYeDs4DBUeuTo18KBzwvTEjUnSwd32-c
283
284 Add the following txt record:
285 Domain:_acme-challenge.www.example.com
286 Txt value:9ihDbjxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
287
288 Please add those txt records to the domains. Waiting for the dns to take effect.
289 ```
290
291 Then just rerun with `renew` argument:
292
293 ```bash
294 acme.sh --renew -d example.com
295 ```
296
297 Ok, it's finished.
298
299 **Take care, this is dns manual mode, it can not be renewed automatically. you will have to add a new txt record to your domain by your hand when you renew your cert.**
300
301 **Please use dns api mode instead.**
302
303 # 9. Automatic DNS API integration
304
305 If your DNS provider supports API access, we can use that API to automatically issue the certs.
306
307 You don't have to do anything manually!
308
309 ### Currently acme.sh supports:
310
311 1. CloudFlare.com API
312 1. DNSPod.cn API
313 1. CloudXNS.com API
314 1. GoDaddy.com API
315 1. PowerDNS.com API
316 1. OVH, kimsufi, soyoustart and runabove API
317 1. nsupdate API
318 1. LuaDNS.com API
319 1. DNSMadeEasy.com API
320 1. AWS Route 53
321 1. aliyun.com(阿里云) API
322 1. ISPConfig 3.1 API
323 1. Alwaysdata.com API
324 1. Linode.com API
325 1. FreeDNS (https://freedns.afraid.org/)
326 1. cyon.ch
327 1. Domain-Offensive/Resellerinterface/Domainrobot API
328 1. Gandi LiveDNS API
329 1. Knot DNS API
330 1. DigitalOcean API (native)
331 1. ClouDNS.net API
332 1. Infoblox NIOS API (https://www.infoblox.com/)
333 1. VSCALE (https://vscale.io/)
334 1. Dynu API (https://www.dynu.com)
335 1. DNSimple API
336 1. NS1.com API
337 1. DuckDNS.org API
338 1. Name.com API
339 1. Dyn Managed DNS API
340 1. Yandex PDD API (https://pdd.yandex.ru)
341 1. Hurricane Electric DNS service (https://dns.he.net)
342 1. UnoEuro API (https://www.unoeuro.com/)
343 1. INWX (https://www.inwx.de/)
344 1. Servercow (https://servercow.de)
345 1. Namesilo (https://www.namesilo.com)
346 1. InternetX autoDNS API (https://internetx.com)
347 1. Azure DNS
348 1. selectel.com(selectel.ru) DNS API
349
350 And:
351
352 1. lexicon DNS API: https://github.com/Neilpang/acme.sh/wiki/How-to-use-lexicon-dns-api
353 (DigitalOcean, DNSimple, DNSMadeEasy, DNSPark, EasyDNS, Namesilo, NS1, PointHQ, Rage4 and Vultr etc.)
354
355
356
357 **More APIs coming soon...**
358
359 If your DNS provider is not on the supported list above, you can write your own DNS API script easily. If you do, please consider submitting a [Pull Request](https://github.com/Neilpang/acme.sh/pulls) and contribute it to the project.
360
361 For more details: [How to use DNS API](dnsapi)
362
363
364 # 10. Issue ECC certificates
365
366 `Let's Encrypt` can now issue **ECDSA** certificates.
367
368 And we support them too!
369
370 Just set the `length` parameter with a prefix `ec-`.
371
372 For example:
373
374 ### Single domain ECC certificate
375
376 ```bash
377 acme.sh --issue -w /home/wwwroot/example.com -d example.com --keylength ec-256
378 ```
379
380 ### SAN multi domain ECC certificate
381
382 ```bash
383 acme.sh --issue -w /home/wwwroot/example.com -d example.com -d www.example.com --keylength ec-256
384 ```
385
386 Please look at the last parameter above.
387
388 Valid values are:
389
390 1. **ec-256 (prime256v1, "ECDSA P-256")**
391 2. **ec-384 (secp384r1, "ECDSA P-384")**
392 3. **ec-521 (secp521r1, "ECDSA P-521", which is not supported by Let's Encrypt yet.)**
393
394
395 # 11. How to renew the issued certs
396
397 No, you don't need to renew the certs manually. All the certs will be renewed automatically every **60** days.
398
399 However, you can also force to renew any cert:
400
401 ```
402 acme.sh --renew -d example.com --force
403 ```
404
405 or, for ECC cert:
406
407 ```
408 acme.sh --renew -d example.com --force --ecc
409 ```
410
411
412 # 12. How to upgrade `acme.sh`
413
414 acme.sh is in constant development, so it's strongly recommended to use the latest code.
415
416 You can update acme.sh to the latest code:
417
418 ```
419 acme.sh --upgrade
420 ```
421
422 You can also enable auto upgrade:
423
424 ```
425 acme.sh --upgrade --auto-upgrade
426 ```
427
428 Then **acme.sh** will be kept up to date automatically.
429
430 Disable auto upgrade:
431
432 ```
433 acme.sh --upgrade --auto-upgrade 0
434 ```
435
436
437 # 13. Issue a cert from an existing CSR
438
439 https://github.com/Neilpang/acme.sh/wiki/Issue-a-cert-from-existing-CSR
440
441
442 # 14. Under the Hood
443
444 Speak ACME language using shell, directly to "Let's Encrypt".
445
446 TODO:
447
448
449 # 15. Acknowledgments
450
451 1. Acme-tiny: https://github.com/diafygi/acme-tiny
452 2. ACME protocol: https://github.com/ietf-wg-acme/acme
453 3. Certbot: https://github.com/certbot/certbot
454
455
456 # 16. License & Others
457
458 License is GPLv3
459
460 Please Star and Fork me.
461
462 [Issues](https://github.com/Neilpang/acme.sh/issues) and [pull requests](https://github.com/Neilpang/acme.sh/pulls) are welcome.
463
464
465 # 17. Donate
466 Your donation makes **acme.sh** better:
467
468 1. PayPal/Alipay(支付宝)/Wechat(微信): [https://donate.acme.sh/](https://donate.acme.sh/)
469
470 [Donate List](https://github.com/Neilpang/acme.sh/wiki/Donate-list)