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