]> git.proxmox.com Git - mirror_acme.sh.git/blob - README.md
Merge pull request #1983 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 - 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](https://centminmod.com/letsencrypt-acmetool-https.html)
37 - [splynx](https://forum.splynx.com/t/free-ssl-cert-for-splynx-lets-encrypt/297)
38 - [archlinux](https://www.archlinux.org/packages/community/any/acme.sh)
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 1. TELE3 (https://www.tele3.cz)
323 1. EUSERV.EU (https://www.euserv.eu)
324 1. DNSPod.com API (https://www.dnspod.com)
325 1. Google Cloud DNS API
326 1. ConoHa (https://www.conoha.jp)
327 1. netcup DNS API (https://www.netcup.de)
328 1. GratisDNS.dk (https://gratisdns.dk)
329 1. Namecheap API (https://www.namecheap.com/)
330 1. MyDNS.JP API (https://www.mydns.jp/)
331 1. hosting.de (https://www.hosting.de)
332 1. Neodigit.net API (https://www.neodigit.net)
333 1. Exoscale.com API (https://www.exoscale.com/)
334
335 And:
336
337 **lexicon DNS API: https://github.com/Neilpang/acme.sh/wiki/How-to-use-lexicon-dns-api
338 (DigitalOcean, DNSimple, DNSMadeEasy, DNSPark, EasyDNS, Namesilo, NS1, PointHQ, Rage4 and Vultr etc.)**
339
340
341 **More APIs coming soon...**
342
343 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.
344
345 For more details: [How to use DNS API](dnsapi)
346
347 # 8. Use DNS manual mode:
348
349 See: https://github.com/Neilpang/acme.sh/wiki/dns-manual-mode first.
350
351 If your dns provider doesn't support any api access, you can add the txt record by your hand.
352
353 ```bash
354 acme.sh --issue --dns -d example.com -d www.example.com -d cp.example.com
355 ```
356
357 You should get an output like below:
358
359 ```sh
360 Add the following txt record:
361 Domain:_acme-challenge.example.com
362 Txt value:9ihDbjYfTExAYeDs4DBUeuTo18KBzwvTEjUnSwd32-c
363
364 Add the following txt record:
365 Domain:_acme-challenge.www.example.com
366 Txt value:9ihDbjxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
367
368 Please add those txt records to the domains. Waiting for the dns to take effect.
369 ```
370
371 Then just rerun with `renew` argument:
372
373 ```bash
374 acme.sh --renew -d example.com
375 ```
376
377 Ok, it's done.
378
379 **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.**
380
381 **Please use dns api mode instead.**
382
383 # 9. Issue ECC certificates
384
385 `Let's Encrypt` can now issue **ECDSA** certificates.
386
387 And we support them too!
388
389 Just set the `keylength` parameter with a prefix `ec-`.
390
391 For example:
392
393 ### Single domain ECC certificate
394
395 ```bash
396 acme.sh --issue -w /home/wwwroot/example.com -d example.com --keylength ec-256
397 ```
398
399 ### SAN multi domain ECC certificate
400
401 ```bash
402 acme.sh --issue -w /home/wwwroot/example.com -d example.com -d www.example.com --keylength ec-256
403 ```
404
405 Please look at the `keylength` parameter above.
406
407 Valid values are:
408
409 1. **ec-256 (prime256v1, "ECDSA P-256")**
410 2. **ec-384 (secp384r1, "ECDSA P-384")**
411 3. **ec-521 (secp521r1, "ECDSA P-521", which is not supported by Let's Encrypt yet.)**
412
413
414
415 # 10. Issue Wildcard certificates
416
417 It's simple, just give a wildcard domain as the `-d` parameter.
418
419 ```sh
420 acme.sh --issue -d example.com -d '*.example.com' --dns dns_cf
421 ```
422
423
424
425 # 11. How to renew the certs
426
427 No, you don't need to renew the certs manually. All the certs will be renewed automatically every **60** days.
428
429 However, you can also force to renew a cert:
430
431 ```sh
432 acme.sh --renew -d example.com --force
433 ```
434
435 or, for ECC cert:
436
437 ```sh
438 acme.sh --renew -d example.com --force --ecc
439 ```
440
441
442 # 12. How to stop cert renewal
443
444 To stop renewal of a cert, you can execute the following to remove the cert from the renewal list:
445
446 ```sh
447 acme.sh --remove -d example.com [--ecc]
448 ```
449
450 The cert/key file is not removed from the disk.
451
452 You can remove the respective directory (e.g. `~/.acme.sh/example.com`) by yourself.
453
454
455 # 13. How to upgrade `acme.sh`
456
457 acme.sh is in constant development, so it's strongly recommended to use the latest code.
458
459 You can update acme.sh to the latest code:
460
461 ```sh
462 acme.sh --upgrade
463 ```
464
465 You can also enable auto upgrade:
466
467 ```sh
468 acme.sh --upgrade --auto-upgrade
469 ```
470
471 Then **acme.sh** will be kept up to date automatically.
472
473 Disable auto upgrade:
474
475 ```sh
476 acme.sh --upgrade --auto-upgrade 0
477 ```
478
479
480 # 14. Issue a cert from an existing CSR
481
482 https://github.com/Neilpang/acme.sh/wiki/Issue-a-cert-from-existing-CSR
483
484
485 # 15. Under the Hood
486
487 Speak ACME language using shell, directly to "Let's Encrypt".
488
489 TODO:
490
491
492 # 16. Acknowledgments
493
494 1. Acme-tiny: https://github.com/diafygi/acme-tiny
495 2. ACME protocol: https://github.com/ietf-wg-acme/acme
496
497
498 # 17. License & Others
499
500 License is GPLv3
501
502 Please Star and Fork me.
503
504 [Issues](https://github.com/Neilpang/acme.sh/issues) and [pull requests](https://github.com/Neilpang/acme.sh/pulls) are welcome.
505
506
507 # 18. Donate
508 Your donation makes **acme.sh** better:
509
510 1. PayPal/Alipay(支付宝)/Wechat(微信): [https://donate.acme.sh/](https://donate.acme.sh/)
511
512 [Donate List](https://github.com/Neilpang/acme.sh/wiki/Donate-list)