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