]> git.proxmox.com Git - mirror_acme.sh.git/blame - README.md
move to wiki
[mirror_acme.sh.git] / README.md
CommitLineData
a2e62f8e 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)
319d49dd
TGB
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)
99dc89c0 4- An ACME protocol client written purely in Shell (Unix shell) language.
1bb90298 5- Full ACME protocol implementation.
79a2bed6 6- Support ACME v1 and ACME v2
7- Support ACME v2 wildcard certs
1bb90298
AL
8- Simple, powerful and very easy to use. You only need 3 minutes to learn it.
9- Bash, dash and sh compatible.
2b45dba5 10- Simplest shell script for Let's Encrypt free certificate client.
1bb90298
AL
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.
1f60d2bb 13- DOES NOT require `root/sudoer` access.
f3b43439 14- Docker friendly
0f48b156 15- IPv6 support
6c0ab5d2 16
9cf65e31 17It's probably the `easiest & smartest` shell script to automatically issue & renew the free certificates from Let's Encrypt.
6c0ab5d2 18
6cc11ffb 19Wiki: https://github.com/Neilpang/acme.sh/wiki
de9fd54e 20
f3b43439 21For Docker Fans: [acme.sh :two_hearts: Docker ](https://github.com/Neilpang/acme.sh/wiki/Run-acme.sh-in-docker)
1bb90298 22
08998032 23Twitter: [@neilpangxa](https://twitter.com/neilpangxa)
24
25
fe04faf6 26# [中文说明](https://github.com/Neilpang/acme.sh/wiki/%E8%AF%B4%E6%98%8E)
27
bae50da7 28# Who:
6f1c72f5 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)
26c669e4 36- [Centminmod](https://centminmod.com/letsencrypt-acmetool-https.html)
6f1c72f5 37- [splynx](https://forum.splynx.com/t/free-ssl-cert-for-splynx-lets-encrypt/297)
7ff52546 38- [archlinux](https://www.archlinux.org/packages/community/any/acme.sh)
9cf65e31 39- [opnsense.org](https://github.com/opnsense/plugins/tree/master/security/acme-client/src/opnsense/scripts/OPNsense/AcmeClient)
a5c1c303 40- [CentOS Web Panel](http://centos-webpanel.com/)
41- [lnmp.org](https://lnmp.org/)
63ec05a6 42- [more...](https://github.com/Neilpang/acme.sh/wiki/Blogs-and-tutorials)
1bb90298
AL
43
44# Tested OS
45
daf56504 46| NO | Status| Platform|
47|----|-------|---------|
620f8613 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
990d46d6 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)
620f8613 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
63c6a3b0 61|14|-----| Cloud Linux https://github.com/Neilpang/le/issues/111
620f8613 62|15|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/openbsd.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|OpenBSD
199067e8 63|16|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/mageia.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|Mageia
3ad08e95 64|17|-----| OpenWRT: Tested and working. See [wiki page](https://github.com/Neilpang/acme.sh/wiki/How-to-run-on-OpenWRT)
527dd31c 65|18|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/solaris.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|SunOS/Solaris
5961d443 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
b28a3db3 67|20|[![Build Status](https://travis-ci.org/Neilpang/acme.sh.svg?branch=master)](https://travis-ci.org/Neilpang/acme.sh)|Mac OSX
6c0ab5d2 68
aa66dfff 69For all build statuses, check our [weekly build project](https://github.com/Neilpang/acmetest):
6c0ab5d2 70
6cc11ffb 71https://github.com/Neilpang/acmetest
07f4ec4f 72
c4094c68 73# Supported CA
74
75- Letsencrypt.org CA(default)
76- [BuyPass.com CA](https://github.com/Neilpang/acme.sh/wiki/BuyPass.com-CA)
81f0189d 77- [Pebble strict Mode](https://github.com/letsencrypt/pebble)
2b45dba5 78
1bb90298 79# Supported modes
2c75b3fd 80
1bb90298
AL
81- Webroot mode
82- Standalone mode
c9baca79 83- Standalone tls-alpn mode
1bb90298 84- Apache mode
d5865989 85- Nginx mode
1bb90298 86- DNS mode
875625b1 87- [DNS alias mode](https://github.com/Neilpang/acme.sh/wiki/DNS-alias-mode)
7c488b59 88- [Stateless mode](https://github.com/Neilpang/acme.sh/wiki/Stateless-Mode)
2b45dba5 89
e8cce73a 90
df1c9d88 91# 1. How to install
6c0ab5d2 92
1bb90298 93### 1. Install online
6c0ab5d2 94
5bdad844 95Check this project: https://github.com/Neilpang/get.acme.sh
b0515cf8 96
2b45dba5 97```bash
99dc89c0 98curl https://get.acme.sh | sh
90dda23f 99```
100
101Or:
2b45dba5
SF
102
103```bash
99dc89c0 104wget -O - https://get.acme.sh | sh
90dda23f 105```
106
107
1bb90298 108### 2. Or, Install from git
2b45dba5 109
1bb90298 110Clone this project and launch installation:
2b45dba5
SF
111
112```bash
6cc11ffb 113git clone https://github.com/Neilpang/acme.sh.git
2b45dba5 114cd ./acme.sh
6cc11ffb 115./acme.sh --install
6c0ab5d2 116```
90dda23f 117
2b45dba5
SF
118You `don't have to be root` then, although `it is recommended`.
119
1bb90298 120Advanced Installation: https://github.com/Neilpang/acme.sh/wiki/How-to-install
d9ded9f3 121
2b45dba5 122The installer will perform 3 actions:
7a894c4c 123
1bb90298
AL
1241. Create and copy `acme.sh` to your home dir (`$HOME`): `~/.acme.sh/`.
125All certs will be placed in this folder too.
1262. Create alias for: `acme.sh=~/.acme.sh/acme.sh`.
1273. Create daily cron job to check and renew the certs if needed.
2b45dba5
SF
128
129Cron entry example:
130
131```bash
1320 0 * * * "/home/user/.acme.sh"/acme.sh --cron --home "/home/user/.acme.sh" > /dev/null
133```
acc1e53a 134
1bb90298
AL
135After the installation, you must close the current terminal and reopen it to make the alias take effect.
136
137Ok, you are ready to issue certs now.
acc1e53a 138
6c0ab5d2 139Show help message:
2b45dba5 140
e27dfbb0 141```sh
39c8f79f 142root@v1:~# acme.sh -h
6c0ab5d2 143```
1bb90298
AL
144
145# 2. Just issue a cert
2400e41f 146
2b45dba5 147**Example 1:** Single domain.
2400e41f 148
2b45dba5 149```bash
caa2e45a 150acme.sh --issue -d example.com -w /home/wwwroot/example.com
6c0ab5d2 151```
2b45dba5 152
4c38fec3 153or:
154
155```bash
156acme.sh --issue -d example.com -w /home/username/public_html
157```
158
159or:
160
161```bash
162acme.sh --issue -d example.com -w /var/www/html
163```
164
2b45dba5
SF
165**Example 2:** Multiple domains in the same cert.
166
167```bash
1bb90298 168acme.sh --issue -d example.com -d www.example.com -d cp.example.com -w /home/wwwroot/example.com
6c0ab5d2 169```
2400e41f 170
4c38fec3 171The 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.
6c0ab5d2 172
1bb90298
AL
173Second argument **"example.com"** is the main domain you want to issue the cert for.
174You must have at least one domain there.
6c0ab5d2 175
caa2e45a 176You must point and bind all the domains to the same webroot dir: `/home/wwwroot/example.com`.
6c0ab5d2 177
e27dfbb0 178The certs will be placed in `~/.acme.sh/example.com/`
6c0ab5d2 179
e27dfbb0 180The certs will be renewed automatically every **60** days.
6c0ab5d2 181
6cc11ffb 182More examples: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert
a63b05a9 183
184
e27dfbb0 185# 3. Install the cert to Apache/Nginx etc.
a63b05a9 186
e27dfbb0 187After the cert is generated, you probably want to install/copy the cert to your Apache/Nginx or other servers.
1bb90298 188You **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.
2b45dba5 189
1bb90298 190**Apache** example:
2b45dba5 191```bash
cd9c3a79 192acme.sh --install-cert -d example.com \
5c539af7 193--cert-file /path/to/certfile/in/apache/cert.pem \
194--key-file /path/to/keyfile/in/apache/key.pem \
195--fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem \
4743171b 196--reloadcmd "service apache2 force-reload"
3c33cdfa 197```
198
1bb90298 199**Nginx** example:
3c33cdfa 200```bash
cd9c3a79 201acme.sh --install-cert -d example.com \
5c539af7 202--key-file /path/to/keyfile/in/nginx/key.pem \
203--fullchain-file /path/to/fullchain/nginx/cert.pem \
4743171b 204--reloadcmd "service nginx force-reload"
6c0ab5d2 205```
7a894c4c 206
a63b05a9 207Only the domain is required, all the other parameters are optional.
208
e27dfbb0 209The ownership and permission info of existing files are preserved. You can pre-create the files to define the ownership and permission.
fe600441 210
e27dfbb0 211Install/copy the cert/key to the production Apache or Nginx path.
1bb90298 212
61852447 213The 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`.
7a894c4c 214
6c0ab5d2 215
58f75313 216**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.**
bae50da7 217
df1c9d88 218# 4. Use Standalone server to issue cert
6c0ab5d2 219
1bb90298 220**(requires you to be root/sudoer or have permission to listen on port 80 (TCP))**
072290f2 221
1bb90298 222Port `80` (TCP) **MUST** be free to listen on, otherwise you will be prompted to free it and try again.
2b45dba5
SF
223
224```bash
caa2e45a 225acme.sh --issue --standalone -d example.com -d www.example.com -d cp.example.com
072290f2
N
226```
227
6cc11ffb 228More examples: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert
a63b05a9 229
c9baca79 230# 5. Use Standalone ssl server to issue cert
e22bcf7c 231
c9baca79 232**(requires you to be root/sudoer or have permission to listen on port 443 (TCP))**
233
234Port `443` (TCP) **MUST** be free to listen on, otherwise you will be prompted to free it and try again.
235
236```bash
237acme.sh --issue --alpn -d example.com -d www.example.com -d cp.example.com
238```
239
240More examples: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert
241
242
243# 6. Use Apache mode
2b45dba5 244
1bb90298 245**(requires you to be root/sudoer, since it is required to interact with Apache server)**
2b45dba5 246
1bb90298 247If you are running a web server, Apache or Nginx, it is recommended to use the `Webroot mode`.
a63b05a9 248
d5865989 249Particularly, 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.
2c75b3fd 250
1bb90298 251Just set string "apache" as the second argument and it will force use of apache plugin automatically.
2c75b3fd 252
e27dfbb0 253```sh
1bb90298 254acme.sh --issue --apache -d example.com -d www.example.com -d cp.example.com
2c75b3fd 255```
a63b05a9 256
84d80e93 257**This apache mode is only to issue the cert, it will not change your apache config files.
d5865989 258You will need to configure your website config files to use the cert by yourself.
259We don't want to mess your apache server, don't worry.**
260
6cc11ffb 261More examples: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert
2c75b3fd 262
c9baca79 263# 7. Use Nginx mode
1bb90298 264
9d725af6 265**(requires you to be root/sudoer, since it is required to interact with Nginx server)**
266
267If you are running a web server, Apache or Nginx, it is recommended to use the `Webroot mode`.
268
269Particularly, 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.
270
271Just set string "nginx" as the second argument.
272
273It will configure nginx server automatically to verify the domain and then restore the nginx config to the original version.
274
275So, the config is not changed.
276
e27dfbb0 277```sh
9d725af6 278acme.sh --issue --nginx -d example.com -d www.example.com -d cp.example.com
279```
280
84d80e93 281**This nginx mode is only to issue the cert, it will not change your nginx config files.
d5865989 282You will need to configure your website config files to use the cert by yourself.
c1f52299 283We don't want to mess your nginx server, don't worry.**
d5865989 284
9d725af6 285More examples: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert
286
c9baca79 287# 8. Automatic DNS API integration
a947dbc6 288
1bb90298 289If your DNS provider supports API access, we can use that API to automatically issue the certs.
6c0ab5d2 290
1bb90298 291You don't have to do anything manually!
ab497961 292
236acbd6 293### Currently acme.sh supports most of the dns providers:
294
295https://github.com/Neilpang/acme.sh/wiki/dnsapi
296
ab497961 297
c9baca79 298# 9. Use DNS manual mode:
e27dfbb0 299
46ac97a3 300See: https://github.com/Neilpang/acme.sh/wiki/dns-manual-mode first.
301
d5865989 302If your dns provider doesn't support any api access, you can add the txt record by your hand.
e27dfbb0 303
304```bash
305acme.sh --issue --dns -d example.com -d www.example.com -d cp.example.com
306```
307
308You should get an output like below:
309
310```sh
311Add the following txt record:
312Domain:_acme-challenge.example.com
313Txt value:9ihDbjYfTExAYeDs4DBUeuTo18KBzwvTEjUnSwd32-c
314
315Add the following txt record:
316Domain:_acme-challenge.www.example.com
317Txt value:9ihDbjxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
318
319Please add those txt records to the domains. Waiting for the dns to take effect.
320```
321
322Then just rerun with `renew` argument:
323
324```bash
325acme.sh --renew -d example.com
326```
327
328Ok, it's done.
329
330**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.**
331
332**Please use dns api mode instead.**
ab497961 333
c9baca79 334# 10. Issue ECC certificates
2b45dba5 335
1bb90298 336`Let's Encrypt` can now issue **ECDSA** certificates.
2b45dba5 337
1bb90298 338And we support them too!
1add47a6 339
d5865989 340Just set the `keylength` parameter with a prefix `ec-`.
2b45dba5 341
1add47a6 342For example:
9e6c4208 343
bcbecff6 344### Single domain ECC certificate
9e6c4208 345
2b45dba5 346```bash
1bb90298 347acme.sh --issue -w /home/wwwroot/example.com -d example.com --keylength ec-256
1add47a6 348```
2b45dba5 349
1bb90298 350### SAN multi domain ECC certificate
2b45dba5
SF
351
352```bash
1bb90298 353acme.sh --issue -w /home/wwwroot/example.com -d example.com -d www.example.com --keylength ec-256
9e6c4208
N
354```
355
d5865989 356Please look at the `keylength` parameter above.
1add47a6 357
358Valid values are:
359
2b45dba5
SF
3601. **ec-256 (prime256v1, "ECDSA P-256")**
3612. **ec-384 (secp384r1, "ECDSA P-384")**
3623. **ec-521 (secp521r1, "ECDSA P-521", which is not supported by Let's Encrypt yet.)**
1add47a6 363
df1c9d88 364
df1c9d88 365
c9baca79 366# 11. Issue Wildcard certificates
df1c9d88 367
e27dfbb0 368It's simple, just give a wildcard domain as the `-d` parameter.
df1c9d88 369
e27dfbb0 370```sh
f2aa5c02 371acme.sh --issue -d example.com -d '*.example.com' --dns dns_cf
df1c9d88 372```
e27dfbb0 373
374
375
c9baca79 376# 12. How to renew the certs
e27dfbb0 377
378No, you don't need to renew the certs manually. All the certs will be renewed automatically every **60** days.
379
380However, you can also force to renew a cert:
381
382```sh
1bb90298 383acme.sh --renew -d example.com --force
df1c9d88 384```
385
386or, for ECC cert:
1bb90298 387
e27dfbb0 388```sh
1bb90298 389acme.sh --renew -d example.com --force --ecc
df1c9d88 390```
391
1bb90298 392
c9baca79 393# 13. How to stop cert renewal
a4964b90 394
e27dfbb0 395To stop renewal of a cert, you can execute the following to remove the cert from the renewal list:
a4964b90 396
e27dfbb0 397```sh
a4964b90
FW
398acme.sh --remove -d example.com [--ecc]
399```
400
e27dfbb0 401The cert/key file is not removed from the disk.
a4964b90 402
e27dfbb0 403You can remove the respective directory (e.g. `~/.acme.sh/example.com`) by yourself.
a4964b90 404
e27dfbb0 405
c9baca79 406# 14. How to upgrade `acme.sh`
1bb90298 407
329174b6 408acme.sh is in constant development, so it's strongly recommended to use the latest code.
df1c9d88 409
410You can update acme.sh to the latest code:
1bb90298 411
e27dfbb0 412```sh
df1c9d88 413acme.sh --upgrade
414```
415
1bb90298
AL
416You can also enable auto upgrade:
417
e27dfbb0 418```sh
1bb90298 419acme.sh --upgrade --auto-upgrade
59649e9b 420```
1bb90298
AL
421
422Then **acme.sh** will be kept up to date automatically.
59649e9b 423
424Disable auto upgrade:
1bb90298 425
e27dfbb0 426```sh
1bb90298 427acme.sh --upgrade --auto-upgrade 0
59649e9b 428```
429
1bb90298 430
c9baca79 431# 15. Issue a cert from an existing CSR
8371b030 432
433https://github.com/Neilpang/acme.sh/wiki/Issue-a-cert-from-existing-CSR
434
435
c9baca79 436# 16. Under the Hood
6c0ab5d2 437
99dc89c0 438Speak ACME language using shell, directly to "Let's Encrypt".
6c0ab5d2
N
439
440TODO:
441
1bb90298 442
c9baca79 443# 17. Acknowledgments
1bb90298 444
63f04675
N
4451. Acme-tiny: https://github.com/diafygi/acme-tiny
4462. ACME protocol: https://github.com/ietf-wg-acme/acme
63f04675 447
1bb90298 448
c9baca79 449# 18. License & Others
6c0ab5d2
N
450
451License is GPLv3
452
1d06c947 453Please Star and Fork me.
6c0ab5d2 454
1bb90298 455[Issues](https://github.com/Neilpang/acme.sh/issues) and [pull requests](https://github.com/Neilpang/acme.sh/pulls) are welcome.
6c0ab5d2
N
456
457
c9baca79 458# 19. Donate
cb6f6229 459Your donation makes **acme.sh** better:
6c0ab5d2 460
43d3b51b 4611. PayPal/Alipay(支付宝)/Wechat(微信): [https://donate.acme.sh/](https://donate.acme.sh/)
84d80e93 462
1bb90298 463[Donate List](https://github.com/Neilpang/acme.sh/wiki/Donate-list)