1 # An ACME Shell script: acme.sh
3 [![FreeBSD](https://github.com/acmesh-official/acme.sh/actions/workflows/FreeBSD.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/FreeBSD.yml)
4 [![OpenBSD](https://github.com/acmesh-official/acme.sh/actions/workflows/OpenBSD.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/OpenBSD.yml)
5 [![NetBSD](https://github.com/acmesh-official/acme.sh/actions/workflows/NetBSD.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/NetBSD.yml)
6 [![MacOS](https://github.com/acmesh-official/acme.sh/actions/workflows/MacOS.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/MacOS.yml)
7 [![Ubuntu](https://github.com/acmesh-official/acme.sh/actions/workflows/Ubuntu.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/Ubuntu.yml)
8 [![Windows](https://github.com/acmesh-official/acme.sh/actions/workflows/Windows.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/Windows.yml)
9 [![Solaris](https://github.com/acmesh-official/acme.sh/actions/workflows/Solaris.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/Solaris.yml)
10 [![DragonFlyBSD](https://github.com/acmesh-official/acme.sh/actions/workflows/DragonFlyBSD.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/DragonFlyBSD.yml)
13 ![Shellcheck](https://github.com/acmesh-official/acme.sh/workflows/Shellcheck/badge.svg)
14 ![PebbleStrict](https://github.com/acmesh-official/acme.sh/workflows/PebbleStrict/badge.svg)
15 ![DockerHub](https://github.com/acmesh-official/acme.sh/workflows/Build%20DockerHub/badge.svg)
18 <a href="https://opencollective.com/acmesh" alt="Financial Contributors on Open Collective"><img src="https://opencollective.com/acmesh/all/badge.svg?label=financial+contributors" /></a>
19 [![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)
20 [![Docker stars](https://img.shields.io/docker/stars/neilpang/acme.sh.svg)](https://hub.docker.com/r/neilpang/acme.sh "Click to view the image on Docker Hub")
21 [![Docker pulls](https://img.shields.io/docker/pulls/neilpang/acme.sh.svg)](https://hub.docker.com/r/neilpang/acme.sh "Click to view the image on Docker Hub")
25 - An ACME protocol client written purely in Shell (Unix shell) language.
26 - Full ACME protocol implementation.
28 - Support SAN and wildcard certs
29 - Simple, powerful and very easy to use. You only need 3 minutes to learn it.
30 - Bash, dash and sh compatible.
31 - Purely written in Shell with no dependencies on python.
32 - Just one script to issue, renew and install your certificates automatically.
33 - DOES NOT require `root/sudoer` access.
36 - Cron job notifications for renewal or error etc.
38 It's probably the `easiest & smartest` shell script to automatically issue & renew the free certificates.
40 Wiki: https://github.com/acmesh-official/acme.sh/wiki
42 For Docker Fans: [acme.sh :two_hearts: Docker ](https://github.com/acmesh-official/acme.sh/wiki/Run-acme.sh-in-docker)
44 Twitter: [@neilpangxa](https://twitter.com/neilpangxa)
47 # [中文说明](https://github.com/acmesh-official/acme.sh/wiki/%E8%AF%B4%E6%98%8E)
50 - [FreeBSD.org](https://blog.crashed.org/letsencrypt-in-freebsd-org/)
51 - [ruby-china.org](https://ruby-china.org/topics/31983)
52 - [Proxmox](https://pve.proxmox.com/wiki/Certificate_Management)
53 - [pfsense](https://github.com/pfsense/FreeBSD-ports/pull/89)
54 - [Loadbalancer.org](https://www.loadbalancer.org/blog/loadbalancer-org-with-lets-encrypt-quick-and-dirty)
55 - [discourse.org](https://meta.discourse.org/t/setting-up-lets-encrypt/40709)
56 - [Centminmod](https://centminmod.com/letsencrypt-acmetool-https.html)
57 - [splynx](https://forum.splynx.com/t/free-ssl-cert-for-splynx-lets-encrypt/297)
58 - [opnsense.org](https://github.com/opnsense/plugins/tree/master/security/acme-client/src/opnsense/scripts/OPNsense/AcmeClient)
59 - [CentOS Web Panel](https://control-webpanel.com)
60 - [lnmp.org](https://lnmp.org/)
61 - [more...](https://github.com/acmesh-official/acme.sh/wiki/Blogs-and-tutorials)
65 | NO | Status| Platform|
66 |----|-------|---------|
67 |1|[![MacOS](https://github.com/acmesh-official/acme.sh/actions/workflows/MacOS.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/MacOS.yml)|Mac OSX
68 |2|[![Windows](https://github.com/acmesh-official/acme.sh/actions/workflows/Windows.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/Windows.yml)|Windows (cygwin with curl, openssl and crontab included)
69 |3|[![FreeBSD](https://github.com/acmesh-official/acme.sh/actions/workflows/FreeBSD.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/FreeBSD.yml)|FreeBSD
70 |4|[![Solaris](https://github.com/acmesh-official/acme.sh/actions/workflows/Solaris.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/Solaris.yml)|Solaris
71 |5|[![Ubuntu](https://github.com/acmesh-official/acme.sh/actions/workflows/Ubuntu.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/Ubuntu.yml)| Ubuntu
73 |7|[![OpenBSD](https://github.com/acmesh-official/acme.sh/actions/workflows/OpenBSD.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/OpenBSD.yml)|OpenBSD
74 |8|[![NetBSD](https://github.com/acmesh-official/acme.sh/actions/workflows/NetBSD.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/NetBSD.yml)|NetBSD
75 |9|[![DragonFlyBSD](https://github.com/acmesh-official/acme.sh/actions/workflows/DragonFlyBSD.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/DragonFlyBSD.yml)|DragonFlyBSD
76 |10|[![Linux](https://github.com/acmesh-official/acme.sh/actions/workflows/Linux.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/Linux.yml)| Debian
77 |11|[![Linux](https://github.com/acmesh-official/acme.sh/actions/workflows/Linux.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/Linux.yml)|CentOS
78 |12|[![Linux](https://github.com/acmesh-official/acme.sh/actions/workflows/Linux.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/Linux.yml)|openSUSE
79 |13|[![Linux](https://github.com/acmesh-official/acme.sh/actions/workflows/Linux.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/Linux.yml)|Alpine Linux (with curl)
80 |14|[![Linux](https://github.com/acmesh-official/acme.sh/actions/workflows/Linux.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/Linux.yml)|Archlinux
81 |15|[![Linux](https://github.com/acmesh-official/acme.sh/actions/workflows/Linux.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/Linux.yml)|fedora
82 |16|[![Linux](https://github.com/acmesh-official/acme.sh/actions/workflows/Linux.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/Linux.yml)|Kali Linux
83 |17|[![Linux](https://github.com/acmesh-official/acme.sh/actions/workflows/Linux.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/Linux.yml)|Oracle Linux
84 |18|[![Linux](https://github.com/acmesh-official/acme.sh/actions/workflows/Linux.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/Linux.yml)|Mageia
85 |19|[![Linux](https://github.com/acmesh-official/acme.sh/actions/workflows/Linux.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/Linux.yml)|Gentoo Linux
86 |10|[![Linux](https://github.com/acmesh-official/acme.sh/actions/workflows/Linux.yml/badge.svg)](https://github.com/acmesh-official/acme.sh/actions/workflows/Linux.yml)|ClearLinux
87 |11|-----| Cloud Linux https://github.com/acmesh-official/acme.sh/issues/111
88 |22|-----| OpenWRT: Tested and working. See [wiki page](https://github.com/acmesh-official/acme.sh/wiki/How-to-run-on-OpenWRT)
89 |23|[![](https://acmesh-official.github.io/acmetest/status/proxmox.svg)](https://github.com/acmesh-official/letest#here-are-the-latest-status)| Proxmox: See Proxmox VE Wiki. Version [4.x, 5.0, 5.1](https://pve.proxmox.com/wiki/HTTPS_Certificate_Configuration_(Version_4.x,_5.0_and_5.1)#Let.27s_Encrypt_using_acme.sh), version [5.2 and up](https://pve.proxmox.com/wiki/Certificate_Management)
92 Check our [testing project](https://github.com/acmesh-official/acmetest):
94 https://github.com/acmesh-official/acmetest
98 - [ZeroSSL.com CA](https://github.com/acmesh-official/acme.sh/wiki/ZeroSSL.com-CA)(default)
100 - [BuyPass.com CA](https://github.com/acmesh-official/acme.sh/wiki/BuyPass.com-CA)
101 - [SSL.com CA](https://github.com/acmesh-official/acme.sh/wiki/SSL.com-CA)
102 - [Google.com Public CA](https://github.com/acmesh-official/acme.sh/wiki/Google-Public-CA)
103 - [Pebble strict Mode](https://github.com/letsencrypt/pebble)
104 - Any other [RFC8555](https://tools.ietf.org/html/rfc8555)-compliant CA
110 - Standalone tls-alpn mode
114 - [DNS alias mode](https://github.com/acmesh-official/acme.sh/wiki/DNS-alias-mode)
115 - [Stateless mode](https://github.com/acmesh-official/acme.sh/wiki/Stateless-Mode)
120 ### 1. Install online
122 Check this project: https://github.com/acmesh-official/get.acme.sh
125 curl https://get.acme.sh | sh -s email=my@example.com
131 wget -O - https://get.acme.sh | sh -s email=my@example.com
135 ### 2. Or, Install from git
137 Clone this project and launch installation:
140 git clone https://github.com/acmesh-official/acme.sh.git
142 ./acme.sh --install -m my@example.com
145 You `don't have to be root` then, although `it is recommended`.
147 Advanced Installation: https://github.com/acmesh-official/acme.sh/wiki/How-to-install
149 The installer will perform 3 actions:
151 1. Create and copy `acme.sh` to your home dir (`$HOME`): `~/.acme.sh/`.
152 All certs will be placed in this folder too.
153 2. Create alias for: `acme.sh=~/.acme.sh/acme.sh`.
154 3. Create daily cron job to check and renew the certs if needed.
159 0 0 * * * "/home/user/.acme.sh"/acme.sh --cron --home "/home/user/.acme.sh" > /dev/null
162 After the installation, you must close the current terminal and reopen it to make the alias take effect.
164 Ok, you are ready to issue certs now.
169 root@v1:~# acme.sh -h
172 # 2. Just issue a cert
174 **Example 1:** Single domain.
177 acme.sh --issue -d example.com -w /home/wwwroot/example.com
183 acme.sh --issue -d example.com -w /home/username/public_html
189 acme.sh --issue -d example.com -w /var/www/html
192 **Example 2:** Multiple domains in the same cert.
195 acme.sh --issue -d example.com -d www.example.com -d cp.example.com -w /home/wwwroot/example.com
198 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.
200 Second argument **"example.com"** is the main domain you want to issue the cert for.
201 You must have at least one domain there.
203 You must point and bind all the domains to the same webroot dir: `/home/wwwroot/example.com`.
205 The certs will be placed in `~/.acme.sh/example.com/`
207 The certs will be renewed automatically every **60** days.
209 More examples: https://github.com/acmesh-official/acme.sh/wiki/How-to-issue-a-cert
212 # 3. Install the cert to Apache/Nginx etc.
214 After the cert is generated, you probably want to install/copy the cert to your Apache/Nginx or other servers.
215 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.
219 acme.sh --install-cert -d example.com \
220 --cert-file /path/to/certfile/in/apache/cert.pem \
221 --key-file /path/to/keyfile/in/apache/key.pem \
222 --fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem \
223 --reloadcmd "service apache2 force-reload"
228 acme.sh --install-cert -d example.com \
229 --key-file /path/to/keyfile/in/nginx/key.pem \
230 --fullchain-file /path/to/fullchain/nginx/cert.pem \
231 --reloadcmd "service nginx force-reload"
234 Only the domain is required, all the other parameters are optional.
236 The ownership and permission info of existing files are preserved. You can pre-create the files to define the ownership and permission.
238 Install/copy the cert/key to the production Apache or Nginx path.
240 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`.
243 **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.**
245 # 4. Use Standalone server to issue cert
247 **(requires you to be root/sudoer or have permission to listen on port 80 (TCP))**
249 Port `80` (TCP) **MUST** be free to listen on, otherwise you will be prompted to free it and try again.
252 acme.sh --issue --standalone -d example.com -d www.example.com -d cp.example.com
255 More examples: https://github.com/acmesh-official/acme.sh/wiki/How-to-issue-a-cert
257 # 5. Use Standalone ssl server to issue cert
259 **(requires you to be root/sudoer or have permission to listen on port 443 (TCP))**
261 Port `443` (TCP) **MUST** be free to listen on, otherwise you will be prompted to free it and try again.
264 acme.sh --issue --alpn -d example.com -d www.example.com -d cp.example.com
267 More examples: https://github.com/acmesh-official/acme.sh/wiki/How-to-issue-a-cert
272 **(requires you to be root/sudoer, since it is required to interact with Apache server)**
274 If you are running a web server, it is recommended to use the `Webroot mode`.
276 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.
278 Just set string "apache" as the second argument and it will force use of apache plugin automatically.
281 acme.sh --issue --apache -d example.com -d www.example.com -d cp.example.com
284 **This apache mode is only to issue the cert, it will not change your apache config files.
285 You will need to configure your website config files to use the cert by yourself.
286 We don't want to mess with your apache server, don't worry.**
288 More examples: https://github.com/acmesh-official/acme.sh/wiki/How-to-issue-a-cert
292 **(requires you to be root/sudoer, since it is required to interact with Nginx server)**
294 If you are running a web server, it is recommended to use the `Webroot mode`.
296 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.
298 Just set string "nginx" as the second argument.
300 It will configure nginx server automatically to verify the domain and then restore the nginx config to the original version.
302 So, the config is not changed.
305 acme.sh --issue --nginx -d example.com -d www.example.com -d cp.example.com
308 **This nginx mode is only to issue the cert, it will not change your nginx config files.
309 You will need to configure your website config files to use the cert by yourself.
310 We don't want to mess with your nginx server, don't worry.**
312 More examples: https://github.com/acmesh-official/acme.sh/wiki/How-to-issue-a-cert
314 # 8. Automatic DNS API integration
316 If your DNS provider supports API access, we can use that API to automatically issue the certs.
318 You don't have to do anything manually!
320 ### Currently acme.sh supports most of the dns providers:
322 https://github.com/acmesh-official/acme.sh/wiki/dnsapi
324 # 9. Use DNS manual mode:
326 See: https://github.com/acmesh-official/acme.sh/wiki/dns-manual-mode first.
328 If your dns provider doesn't support any api access, you can add the txt record by hand.
331 acme.sh --issue --dns -d example.com -d www.example.com -d cp.example.com
334 You should get an output like below:
337 Add the following txt record:
338 Domain:_acme-challenge.example.com
339 Txt value:9ihDbjYfTExAYeDs4DBUeuTo18KBzwvTEjUnSwd32-c
341 Add the following txt record:
342 Domain:_acme-challenge.www.example.com
343 Txt value:9ihDbjxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
345 Please add those txt records to the domains. Waiting for the dns to take effect.
348 Then just rerun with `renew` argument:
351 acme.sh --renew -d example.com
356 **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.**
358 **Please use dns api mode instead.**
360 # 10. Issue ECC certificates
362 Just set the `keylength` parameter with a prefix `ec-`.
366 ### Single domain ECC certificate
369 acme.sh --issue -w /home/wwwroot/example.com -d example.com --keylength ec-256
372 ### SAN multi domain ECC certificate
375 acme.sh --issue -w /home/wwwroot/example.com -d example.com -d www.example.com --keylength ec-256
378 Please look at the `keylength` parameter above.
382 1. **ec-256 (prime256v1, "ECDSA P-256", which is the default key type)**
383 2. **ec-384 (secp384r1, "ECDSA P-384")**
384 3. **ec-521 (secp521r1, "ECDSA P-521", which is not supported by Let's Encrypt yet.)**
385 4. **2048 (RSA2048)**
386 5. **3072 (RSA3072)**
387 6. **4096 (RSA4096)**
390 # 11. Issue Wildcard certificates
392 It's simple, just give a wildcard domain as the `-d` parameter.
395 acme.sh --issue -d example.com -d '*.example.com' --dns dns_cf
400 # 12. How to renew the certs
402 No, you don't need to renew the certs manually. All the certs will be renewed automatically every **60** days.
404 However, you can also force to renew a cert:
407 acme.sh --renew -d example.com --force
413 acme.sh --renew -d example.com --force --ecc
417 # 13. How to stop cert renewal
419 To stop renewal of a cert, you can execute the following to remove the cert from the renewal list:
422 acme.sh --remove -d example.com [--ecc]
425 The cert/key file is not removed from the disk.
427 You can remove the respective directory (e.g. `~/.acme.sh/example.com`) by yourself.
430 # 14. How to upgrade `acme.sh`
432 acme.sh is in constant development, so it's strongly recommended to use the latest code.
434 You can update acme.sh to the latest code:
440 You can also enable auto upgrade:
443 acme.sh --upgrade --auto-upgrade
446 Then **acme.sh** will be kept up to date automatically.
448 Disable auto upgrade:
451 acme.sh --upgrade --auto-upgrade 0
455 # 15. Issue a cert from an existing CSR
457 https://github.com/acmesh-official/acme.sh/wiki/Issue-a-cert-from-existing-CSR
460 # 16. Send notifications in cronjob
462 https://github.com/acmesh-official/acme.sh/wiki/notify
467 Speak ACME language using shell, directly to "Let's Encrypt".
472 # 18. Acknowledgments
474 1. Acme-tiny: https://github.com/diafygi/acme-tiny
475 2. ACME protocol: https://github.com/ietf-wg-acme/acme
480 ### Code Contributors
482 This project exists thanks to all the people who contribute.
483 <a href="https://github.com/acmesh-official/acme.sh/graphs/contributors"><img src="https://opencollective.com/acmesh/contributors.svg?width=890&button=false" /></a>
485 ### Financial Contributors
487 Become a financial contributor and help us sustain our community. [[Contribute](https://opencollective.com/acmesh/contribute)]
491 <a href="https://opencollective.com/acmesh"><img src="https://opencollective.com/acmesh/individuals.svg?width=890"></a>
495 Support this project with your organization. Your logo will show up here with a link to your website. [[Contribute](https://opencollective.com/acmesh/contribute)]
497 <a href="https://opencollective.com/acmesh/organization/0/website"><img src="https://opencollective.com/acmesh/organization/0/avatar.svg"></a>
498 <a href="https://opencollective.com/acmesh/organization/1/website"><img src="https://opencollective.com/acmesh/organization/1/avatar.svg"></a>
499 <a href="https://opencollective.com/acmesh/organization/2/website"><img src="https://opencollective.com/acmesh/organization/2/avatar.svg"></a>
500 <a href="https://opencollective.com/acmesh/organization/3/website"><img src="https://opencollective.com/acmesh/organization/3/avatar.svg"></a>
501 <a href="https://opencollective.com/acmesh/organization/4/website"><img src="https://opencollective.com/acmesh/organization/4/avatar.svg"></a>
502 <a href="https://opencollective.com/acmesh/organization/5/website"><img src="https://opencollective.com/acmesh/organization/5/avatar.svg"></a>
503 <a href="https://opencollective.com/acmesh/organization/6/website"><img src="https://opencollective.com/acmesh/organization/6/avatar.svg"></a>
504 <a href="https://opencollective.com/acmesh/organization/7/website"><img src="https://opencollective.com/acmesh/organization/7/avatar.svg"></a>
505 <a href="https://opencollective.com/acmesh/organization/8/website"><img src="https://opencollective.com/acmesh/organization/8/avatar.svg"></a>
506 <a href="https://opencollective.com/acmesh/organization/9/website"><img src="https://opencollective.com/acmesh/organization/9/avatar.svg"></a>
510 # 19. License & Others
514 Please Star and Fork me.
516 [Issues](https://github.com/acmesh-official/acme.sh/issues) and [pull requests](https://github.com/acmesh-official/acme.sh/pulls) are welcome.
520 Your donation makes **acme.sh** better:
522 1. PayPal/Alipay(支付宝)/Wechat(微信): [https://donate.acme.sh/](https://donate.acme.sh/)
524 [Donate List](https://github.com/acmesh-official/acme.sh/wiki/Donate-list)