1 # An ACME Shell script: acme.sh
2 - An ACME protocol client written purely in Shell (Unix shell) language.
3 - Fully ACME protocol implementation.
4 - Simple, powerful and very easy to use. You only need 3 minutes to learn.
5 - Bash, dash and sh compatible.
6 - Simplest shell script for Let's Encrypt free certificate client.
7 - Purely written in Shell with no dependencies on python or Let's Encrypt official client.
8 - Just one script, to issue, renew and install your certificates automatically.
9 - DOES NOT require `root/sudoer` access.
11 It's probably the `easiest&smallest&smartest` shell script to automatically issue & renew the free certificates from Let's Encrypt.
14 Wiki: https://github.com/Neilpang/acme.sh/wiki
16 # [中文说明](https://github.com/Neilpang/acme.sh/wiki/%E8%AF%B4%E6%98%8E)
19 | NO | Status| Platform|
20 |----|-------|---------|
21 |1|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/ubuntu-latest.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)| Ubuntu
22 |2|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/debian-latest.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)| Debian
23 |3|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/centos-latest.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|CentOS
24 |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)
25 |5|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/freebsd.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|FreeBSD
26 |6|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/pfsense.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|pfsense
27 |7|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/opensuse-latest.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|openSUSE
28 |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)
29 |9|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/base-archlinux.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|Archlinux
30 |10|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/fedora-latest.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|fedora
31 |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
32 |12|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/oraclelinux-latest.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|Oracle Linux
33 |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
34 |14|-----| Cloud Linux https://github.com/Neilpang/le/issues/111
35 |15|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/openbsd.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|OpenBSD
36 |16|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/mageia.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|Mageia
37 |17|-----| OpenWRT: Tested and working. See [wiki page](https://github.com/Neilpang/acme.sh/wiki/How-to-run-on-OpenWRT)
38 |18|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/solaris.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|SunOS/Solaris
40 For all build statuses, check our [daily build project](https://github.com/Neilpang/acmetest):
42 https://github.com/Neilpang/acmetest
55 ### 1. Install online:
57 Check this project: https://github.com/Neilpang/get.acme.sh
60 curl https://get.acme.sh | sh
67 wget -O - https://get.acme.sh | sh
72 ### 2. Or, Install from git:
77 git clone https://github.com/Neilpang/acme.sh.git
82 You `don't have to be root` then, although `it is recommended`.
84 Advanced Installation: https://github.com/Neilpang/acme.sh/wiki/How-to-install
86 The installer will perform 3 actions:
88 1. Create and copy `acme.sh` to your home dir (`$HOME`): `~/.acme.sh/`.
89 All certs will be placed in this folder.
90 2. Create alias for: `acme.sh=~/.acme.sh/acme.sh`.
91 3. Create everyday cron job to check and renew the cert if needed.
96 0 0 * * * "/home/user/.acme.sh"/acme.sh --cron --home "/home/user/.acme.sh" > /dev/null
99 After the installation, you must close current terminal and reopen again to make the alias take effect.
101 Ok, you are ready to issue cert now.
106 root@v1:~# acme.sh -h
110 # 2. Just issue a cert:
112 **Example 1:** Single domain.
115 acme.sh --issue -d example.com -w /home/wwwroot/example.com
118 **Example 2:** Multiple domains in the same cert.
121 acme.sh --issue -d example.com -d www.example.com -d cp.example.com -w /home/wwwroot/example.com
124 The parameter `/home/wwwroot/example.com` is the web root folder. You **MUST** have `write access` to this folder.
126 Second argument **"example.com"** is the main domain you want to issue cert for.
127 You must have at least a domain there.
129 You must point and bind all the domains to the same webroot dir: `/home/wwwroot/example.com`.
131 Generate/issued certs will be placed in `~/.acme.sh/example.com/`
133 The issued cert will be renewed every **60** days automatically.
135 More examples: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert
138 # 3. Install the issued cert to apache/nginx etc.
140 After you issue a cert, you probably want to install/copy the cert to your nginx/apache or other servers you may be using.
143 acme.sh --installcert -d example.com \
144 --certpath /path/to/certfile/in/apache/nginx \
145 --keypath /path/to/keyfile/in/apache/nginx \
146 --capath /path/to/ca/certfile/apache/nginx \
147 --fullchainpath path/to/fullchain/certfile/apache/nginx \
148 --reloadcmd "service apache2|nginx reload"
151 Only the domain is required, all the other parameters are optional.
153 Install/copy the issued cert/key to the production apache or nginx path.
155 The cert will be `renewed every **60** days by default` (which is configurable). Once the cert is renewed, the apache/nginx will be automatically reloaded by the command: `service apache2 reload` or `service nginx reload`.
157 # 4. Use Standalone server to issue cert
159 **(requires you be root/sudoer, or you have permission to listen tcp 80 port)**
161 The tcp `80` port **MUST** be free to listen, otherwise you will be prompted to free the `80` port and try again.
164 acme.sh --issue --standalone -d example.com -d www.example.com -d cp.example.com
167 More examples: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert
169 # 5. Use Standalone tls server to issue cert
171 **(requires you be root/sudoer, or you have permission to listen tcp 443 port)**
173 acme.sh supports `tls-sni-01` validation.
175 The tcp `443` port **MUST** be free to listen, otherwise you will be prompted to free the `443` port and try again.
178 acme.sh --issue --tls -d example.com -d www.example.com -d cp.example.com
181 More examples: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert
185 **(requires you be root/sudoer, since it is required to interact with apache server)**
187 If you are running a web server, apache or nginx, it is recommended to use the `Webroot mode`.
189 Particularly, if you are running an apache server, you should use apache mode instead. This mode doesn't write any files to your web root folder.
191 Just set string "apache" as the second argument, it will force use of apache plugin automatically.
194 acme.sh --issue --apache -d example.com -d www.example.com -d user.example.com
197 More examples: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert
201 Support the `dns-01` challenge.
204 acme.sh --issue --dns -d example.com -d www.example.com -d user.example.com
207 You should get the output like below:
210 Add the following txt record:
211 Domain:_acme-challenge.example.com
212 Txt value:9ihDbjYfTExAYeDs4DBUeuTo18KBzwvTEjUnSwd32-c
214 Add the following txt record:
215 Domain:_acme-challenge.www.example.com
216 Txt value:9ihDbjxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
218 Please add those txt records to the domains. Waiting for the dns to take effect.
222 Then just rerun with `renew` argument:
225 acme.sh --renew -d example.com
230 # 8. Automatic DNS API integration
232 If your DNS provider supports API access, we can use API to automatically issue the certs.
234 You don't have do anything manually!
236 ### Currently acme.sh supports:
238 1. Cloudflare.com API
242 5. OVH, kimsufi, soyoustart and runabove API
243 6. AWS Route 53, see: https://github.com/Neilpang/acme.sh/issues/65
245 8. lexicon dns api: https://github.com/Neilpang/acme.sh/wiki/How-to-use-lexicon-dns-api
246 (DigitalOcean, DNSimple, DnsMadeEasy, DNSPark, EasyDNS, Namesilo, NS1, PointHQ, Rage4 and Vultr etc.)
249 ##### More APIs are coming soon...
251 If your DNS provider is not on the supported list above, you can write your own script API easily. If you do please consider submitting a [Pull Request](https://github.com/Neilpang/acme.sh/pulls) and contribute to the project.
253 For more details: [How to use dns api](dnsapi)
255 # 9. Issue ECC certificate:
257 `Let's Encrypt` now can issue **ECDSA** certificates.
259 And we also support it.
261 Just set the `length` parameter with a prefix `ec-`.
265 ### Single domain ECC cerfiticate:
268 acme.sh --issue -w /home/wwwroot/example.com -d example.com --keylength ec-256
271 SAN multi domain ECC certificate:
274 acme.sh --issue -w /home/wwwroot/example.com -d example.com -d www.example.com --keylength ec-256
277 Please look at the last parameter above.
281 1. **ec-256 (prime256v1, "ECDSA P-256")**
282 2. **ec-384 (secp384r1, "ECDSA P-384")**
283 3. **ec-521 (secp521r1, "ECDSA P-521", which is not supported by Let's Encrypt yet.)**
286 # 10. How to renew the cert
288 No, you don't need to renew the certs manually. All the certs will be renewed automatically every **60** days.
290 However, you can also force to renew any cert:
293 acme.sh --renew -d example.com --force
298 acme.sh --renew -d example.com --force --ecc
301 # 11. How to upgrade `acme.sh`
302 acme.sh is in developing, it's strongly recommended to use the latest code.
304 You can update acme.sh to the latest code:
309 You can enable auto upgrade:
311 acme.sh --upgrade --auto-upgrade
313 Then **acme.sh** will keep up to date automatically.
315 Disable auto upgrade:
317 acme.sh --upgrade --auto-upgrade 0
320 # 12. Issue a cert from an existing CSR
322 https://github.com/Neilpang/acme.sh/wiki/Issue-a-cert-from-existing-CSR
327 Speak ACME language using shell, directly to "Let's Encrypt".
332 1. Acme-tiny: https://github.com/diafygi/acme-tiny
333 2. ACME protocol: https://github.com/ietf-wg-acme/acme
334 3. Certbot: https://github.com/certbot/certbot
340 Please Star and Fork me.
342 [Issues](https://github.com/Neilpang/acme.sh/issues) and [pull requests](https://github.com/Neilpang/acme.sh/pulls) are welcomed.
346 1. PayPal: donate@acme.sh
348 [Donate List](https://github.com/Neilpang/acme.sh/wiki/Donate-list)