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