Compare commits

..

144 Commits
2.2.9 ... 2.6.0

Author SHA1 Message Date
neil
c9febbdd87 fix for centos ncat and debian default netcat (#330) 2016-10-19 22:14:42 +08:00
Peter Lyons
caa2e45a8c use RFC2606 example.com domain in docs (#327)
https://www.rfc-editor.org/rfc/rfc2606.txt
2016-10-13 10:14:36 +08:00
neilpang
d9130c9852 minor 2016-10-12 22:38:28 +08:00
neilpang
661f05837c minor 2016-10-12 21:48:18 +08:00
neil
b15cfc2c5a minor 2016-10-11 18:30:38 +08:00
neil
c575c9af3d Merge branch 'master' of https://github.com/Neilpang/acme.sh 2016-10-11 18:06:35 +08:00
neil
81f27e9077 minor, get the error info, if it contains CRLF 2016-10-11 18:05:32 +08:00
neil
f78babfaa0 nc (#324) 2016-10-10 19:47:16 +08:00
neilpang
66990cf872 minor 2016-10-09 22:27:25 +08:00
root
095fe2ed1b minor 2016-10-09 22:19:35 +08:00
neil
483ebc8141 Update README.md 2016-10-09 22:17:45 +08:00
neilpang
b9311282eb minor fix pdns api 2016-10-09 22:15:15 +08:00
Maxim Zalysin
d6f0c2b52b Add support PowerDNS API (#322)
* Add support PowerDNS API

* Small fixes
2016-10-09 21:56:04 +08:00
neil
bb25febd70 Checkdomain (#317)
* check if domains are changed

* fix output info
2016-10-05 22:09:15 +08:00
neil
19ab2a29ce fix tail for solaris 2016-10-05 13:03:45 +08:00
neil
24b4fe9867 Merge branch 'master' of https://github.com/Neilpang/acme.sh 2016-10-05 12:16:14 +08:00
neil
aa7b82de04 minor 2016-10-05 12:15:06 +08:00
neil
3d826bed3a fix for ncat on centos, try without '-p' first (#315) 2016-10-04 23:35:56 +08:00
neil
d2ae7e78ef 60 days 2016-10-04 21:17:19 +08:00
neil
656bd330f8 change default renew days o 60.
fix https://github.com/Neilpang/acme.sh/issues/314
https://github.com/Neilpang/acme.sh/issues/281
2016-10-04 20:55:31 +08:00
neil
c2c8f32010 fix for wget 2016-10-03 22:29:48 +08:00
neil
9f43c270e6 fix wget 2016-10-03 22:08:40 +08:00
neil
50827188ff minor: save on success 2016-10-02 23:54:21 +08:00
neil
6ae0f7f5c6 support "--listen-v4" and "--listen-v6" (#311)
https://github.com/Neilpang/acme.sh/issues/310
2016-10-02 23:37:37 +08:00
neil
c583d6bb49 fix sleep display 2016-09-30 22:43:24 +08:00
neil
fdcb6b721c fix for busybox 2016-09-30 22:13:27 +08:00
neil
ef858ef062 use head -n 2016-09-30 21:37:39 +08:00
neil
fe04faf675 Add Chinese link 2016-09-30 21:27:23 +08:00
neil
ad752b317d support csr that contains empty CN field. fix https://github.com/Neilpang/acme.sh/issues/306 2016-09-29 22:19:03 +08:00
neil
59649e9b1e support --auto-upgrade 2016-09-28 22:11:00 +08:00
neil
6bf281f905 support '--auto-upgrade' 2016-09-28 22:05:43 +08:00
neil
4dfc8b262c support individual ca path 2016-09-28 13:27:32 +08:00
neil
f08ffe9feb v2.6.0 2016-09-28 13:26:02 +08:00
neil
65de3110a9 minor, fix error message 2016-09-28 13:13:08 +08:00
neil
f6dcd98995 save api first 2016-09-28 13:07:51 +08:00
neil
950172dc01 debug info 2016-09-27 23:52:52 +08:00
neil
5c48e139d4 support individual ca accounts 2016-09-27 23:43:18 +08:00
neil
150e9c8a48 Update README.md 2016-09-27 22:03:42 +08:00
neil
b19ba13aff fix for Mac osx 2016-09-27 21:27:43 +08:00
neil
30bfc2cea7 fix https://github.com/Neilpang/acme.sh/issues/304 2016-09-27 13:11:08 +08:00
neil
30c2d84c6d minor: remove useless hook. 2016-09-26 13:33:09 +08:00
neil
fbd2038fa7 minor 2016-09-26 13:08:19 +08:00
neil
e4b8d9b9d6 minor, No need to save ACCOUNT_URL 2016-09-25 22:54:58 +08:00
neil
6b50003697 minor 2016-09-25 22:26:41 +08:00
neil
a73c5b3355 support log level 2016-09-25 21:58:59 +08:00
neil
eb59817e81 Support updateaccount and registeraccount. fix https://github.com/Neilpang/acme.sh/issues/70 2016-09-25 10:56:06 +08:00
neil
d404e92d16 Fetch agreement tos dynamically, fix https://github.com/Neilpang/acme.sh/issues/253 2016-09-24 23:53:53 +08:00
neil
86c017ec9d fix deactivate return code 2016-09-24 14:17:04 +08:00
neil
0407c4e0f7 minor 2016-09-24 14:01:28 +08:00
neil
0ba95a3dd4 fix auto upgrade 2016-09-24 13:43:08 +08:00
neil
0463b5d6cd support "--local-address" to specify a listening ip address in standalone mode if the server have multiple ips. By default, the standalone server listens to 0.0.0.0 2016-09-23 23:14:03 +08:00
neil
3f4513b3a9 Support deactivate in bulk 2016-09-23 22:35:13 +08:00
neil
fb2029e717 add more info 2016-09-22 23:25:32 +08:00
neil
48f02fb61b minor 2016-09-22 23:23:27 +08:00
neil
0c00e870c6 Support Authorization deactivation
https://github.com/Neilpang/acme.sh/issues/291
2016-09-22 23:17:50 +08:00
neil
7da50703fb minor 2016-09-22 21:38:11 +08:00
neil
cfdaff5a46 fix cf 2016-09-22 20:36:33 +08:00
neil
18e46962c2 fix https://github.com/Neilpang/acme.sh/issues/297 2016-09-22 13:15:25 +08:00
neil
319e0ae3cf fix auto upgrade 2016-09-21 13:39:39 +08:00
neil
e69a7c38d9 fix auto upgrade 2016-09-21 13:27:05 +08:00
neil
ecd685755b fix auto upgrade 2016-09-21 13:18:46 +08:00
neil
276b51d927 minor 2016-09-21 13:09:22 +08:00
neil
251d1c5c9f minor 2016-09-20 22:23:49 +08:00
neil
028e17475f minor, renew time minus 1 day 2016-09-20 21:03:43 +08:00
neil
1ab630435d fix color when upgrade in cronjob 2016-09-20 20:34:33 +08:00
neil
89002ed298 support AUTO_UPGRADE. In the cron job, try to upgrade acme.sh if "AUTO_UPGRADE" is set. 2016-09-20 20:22:25 +08:00
neil
d0871bdae3 rename "--logfile" to "--log", and give a default log file 2016-09-20 19:08:02 +08:00
neil
5ea6e9c9c0 support "--logfile" 2016-09-19 23:07:43 +08:00
neil
267f283a31 fix bug, upgrade in current dir without installation. 2016-09-18 13:06:15 +08:00
neil
3324c0ae79 opps 2016-09-17 12:52:47 +08:00
neil
811bff6db0 minor, hide debug info 2016-09-17 12:29:50 +08:00
neil
0c9546ccb0 fix https://github.com/Neilpang/acme.sh/issues/288
add --ocsp-must-staple, --ocsp
2016-09-15 10:41:47 +08:00
neil
7b16442656 minor 2016-09-10 18:04:59 +08:00
neil
b0070f03af support '--pre-hook', '--post-hook' and '--renew-hook' 2016-09-06 23:26:22 +08:00
neil
08ee072f11 minor, fix color 2016-09-06 19:37:41 +08:00
neil
f3e4cea34f work in the current dir, without installation (#279) 2016-09-02 22:37:49 +08:00
neil
2d12b68952 minor 2016-09-02 20:55:11 +08:00
neil
1643b476eb fix bugs. 2016-08-27 20:00:47 +08:00
neil
5980ebc79a minor, do not output the key file if using signcsr 2016-08-27 15:44:03 +08:00
neil
8371b030cf Issue a cert from existing CSR 2016-08-27 14:00:26 +08:00
neil
10afcaca2f Support issue cert from existing CSR (#276)
fix https://github.com/Neilpang/acme.sh/issues/212
2016-08-27 13:52:13 +08:00
neil
2fb4b62330 Merge branch 'master' of https://github.com/Neilpang/acme.sh 2016-08-25 22:28:15 +08:00
neil
cbcd7e0f86 minor, fix format 2016-08-25 22:27:48 +08:00
neil
df1c9d88a8 Update README.md 2016-08-25 22:13:34 +08:00
neil
3aae1ae3d9 minor, fix _mktemp 2016-08-25 21:46:31 +08:00
neil
775bd1abd0 minor 2016-08-25 13:17:42 +08:00
Patrick Sodré
78009539d1 Add option for a custom ca-bundle file. (#274)
* Add option for a custom ca-bundle file.

* Renamed option cacert to ca-bundle.

* Save CA_BUNDLE path in configuration file.

* Store absolule path to ca-bundle file
2016-08-25 13:14:56 +08:00
neil
36246ad9ac Add OVH, kimsufi, soyoustart and runabove api 2016-08-25 13:10:13 +08:00
neil
e2053b22b4 minor, fix format 2016-08-25 13:06:04 +08:00
neil
dfdc402fbb fix typo 2016-08-25 12:03:19 +08:00
neil
73ba54a502 Support OVH domain api 2016-08-25 11:03:25 +08:00
neil
690a5e205d Support Ovh domain api (#273)
* support ovh

* fix success link

* fix OVH issues.

* v2.4.3 Support OVH domain api
2016-08-25 10:45:41 +08:00
neil
a6014bf04e support sha1 2016-08-24 18:46:23 +08:00
neil
d4d1f0f4a9 Add donate list 2016-08-23 23:16:19 +08:00
neil
5fbc47eb3a fixd createAccountKey https://github.com/Neilpang/acme.sh/issues/271 2016-08-23 22:53:43 +08:00
neil
6d4e903b08 https://github.com/Neilpang/acme.sh/issues/270 2016-08-23 10:03:50 +08:00
neil
66f08eb236 minor format output 2016-08-22 13:36:39 +08:00
neil
933c169da5 minor 2016-08-17 13:17:06 +08:00
neil
a8df88ab91 https://github.com/Neilpang/acme.sh/issues/263 2016-08-15 21:14:36 +08:00
neil
df9547ae39 minor 2016-08-15 19:15:19 +08:00
neil
d529eb6d00 minor 2016-08-14 23:20:53 +08:00
neil
fac1e367c9 2.4.1 fix bug. 2016-08-14 22:37:21 +08:00
neil
31a5487cba fix dual certs 2016-08-13 20:37:52 +08:00
neil
43822d37a7 Support RSA and ECDSA dual certs (#262)
* Support RSA and ECDSA dual certs

* minor

* fix RSA and ECC dual certs

* minor
2016-08-13 19:22:25 +08:00
neil
527dd31c70 Support SunOS, Solaris 2016-08-11 13:47:38 +08:00
neil
e3c66532c5 Support Solaris 2016-08-10 23:13:14 +08:00
neil
22ea4004e1 Support SunOS/Solaris (#260)
Support SunOS/Solaris 

* Support Solaris

* Support SunOS/Open Solaris
2016-08-10 21:54:08 +08:00
neil
d190a43e0a https://github.com/Neilpang/acme.sh/issues/258 2016-08-08 10:19:51 +08:00
neil
bd5e57d879 https://github.com/Neilpang/acme.sh/issues/258 2016-08-08 10:17:10 +08:00
neil
08928b486b minor: add version to useragent 2016-08-07 14:47:57 +08:00
neil
75da0713d2 tls mode: -naccept is not supported by many old openssl versions. (#257)
So I remove it.  and use 2 GET requests to make openssl sever exit.
2016-08-07 14:25:55 +08:00
neil
d35bf51780 2.3.5: skip domain verify if the authorization is already valid, add to production server. 2016-08-07 10:23:52 +08:00
neil
ec603beeb0 skip verify (#256)
skip domain verify if the authorization is already valid
2016-08-07 10:21:27 +08:00
neil
7820467d59 Merge pull request #255 from jim3mar/master
dns_cx.sh prefix and suffix domain bug fixed
2016-08-05 21:44:22 +08:00
Jim Ma
fe09757cb3 dns_cx.sh prefix and suffix domain bug fixed 2016-08-05 21:31:12 +08:00
neil
1e6b68f5d1 fix https://github.com/Neilpang/acme.sh/issues/244
Update renew days for renew/renewall
2016-08-02 21:47:35 +08:00
neil
f574e5813f add the new reg hash 2016-08-02 10:56:40 +08:00
neil
30684246d2 new version number 2.3.4 for LE-SA-v1.1.1-August-1-2016.pdf
agreement to LE-SA-v1.1.1-August-1-2016.pdf
2016-08-02 10:04:29 +08:00
neil
8bdf5cf854 Merge pull request #248 from Acris/master
Update agreement to LE-SA-v1.1.1-August-1-2016.pdf
2016-08-02 03:06:16 +08:00
Acris Liu
c93ec9331b Update agreement to LE-SA-v1.1.1-August-1-2016.pdf 2016-08-02 01:21:00 +08:00
root
0886e67df7 chmod +x 2016-08-01 17:08:01 +08:00
neil
30de13b4df support Godaddy domaain api 2016-07-29 18:07:16 +08:00
neil
7a60c14b31 Merge pull request #243 from t413/master
Support for shells without 'stat' (busybox ash)
2016-07-26 13:18:41 +08:00
Tim O'Brien
3ad08e9515 Changed _stat exit code, added line return, added README link to wiki 2016-07-25 11:07:34 -07:00
Tim O'Brien
32fdc19697 Support for shells without 'stat' (busybox ash)
- the _stat command can now return an error
- the issue() command chown command isn't run if _stat fails
2016-07-22 14:17:33 -07:00
neil
c9c31c04c3 typos 2016-07-21 10:48:37 +08:00
neil
c3dd3ef0d7 typos 2016-07-20 22:18:07 +08:00
neil
fa989a554d Update README.md 2016-07-16 21:57:29 +08:00
neil
4a4dacb52c minor, change default dns sleep time from 60 seconds to 120 seconds. 2016-07-15 22:56:16 +08:00
neil
dcf9cb581d minor, add more debug info 2016-07-15 16:40:03 +08:00
neil
1a6305c93f Merge pull request #236 from tohojo/regexp-escape
Add missing escape in regular expression.
2016-07-09 18:35:50 +08:00
neil
bdbf323fee remove the default value 'no' 2016-07-09 17:25:27 +08:00
neil
7270f277a7 minor: less debug message 2016-07-09 15:55:36 +08:00
Toke Høiland-Jørgensen
32dfc387c8 Add missing escape in regular expression.
There was a missing escape of a { character in one of the regular
expressions passed to grep. This adds that.

Signed-off-by: Toke Høiland-Jørgensen <toke@toke.dk>
2016-07-08 15:42:21 +02:00
neil
b3752e78b6 minor, remove error message. 2016-07-08 12:29:47 +08:00
neil
4c0d3f1b75 minor. remove the ugly return code for installcert. 2016-07-08 11:50:47 +08:00
neil
2e3cb75530 Merge pull request #234 from tgoodyear/patch-1
Update README.md to fix typo: scrypt -> script
2016-07-05 13:28:06 +08:00
Trevor Goodyear
3e99ffe692 Update README.md to fix typo: scrypt -> script 2016-07-04 13:00:17 -04:00
neil
096d8992a1 fix upgrade issue 2016-07-04 20:40:29 +08:00
neil
0bbe6eef89 minor 2016-07-03 12:46:18 +08:00
neil
d0b748a4f2 add more debug message. 2016-07-02 13:46:35 +08:00
neil
58f41a194a minor 2016-07-02 13:21:22 +08:00
neil
d8d10bc478 opps 2016-07-02 13:13:41 +08:00
neil
61623d22d8 fix bug: re-generate domain key if the key length is different. 2016-07-02 13:03:59 +08:00
9 changed files with 2400 additions and 514 deletions

123
README.md
View File

@@ -13,6 +13,8 @@ It's probably the `easiest&smallest&smartest` shell script to automatically issu
Wiki: https://github.com/Neilpang/acme.sh/wiki Wiki: https://github.com/Neilpang/acme.sh/wiki
# [中文说明](https://github.com/Neilpang/acme.sh/wiki/%E8%AF%B4%E6%98%8E)
#Tested OS #Tested OS
| NO | Status| Platform| | NO | Status| Platform|
|----|-------|---------| |----|-------|---------|
@@ -32,6 +34,8 @@ Wiki: https://github.com/Neilpang/acme.sh/wiki
|14|-----| Cloud Linux https://github.com/Neilpang/le/issues/111 |14|-----| Cloud Linux https://github.com/Neilpang/le/issues/111
|15|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/openbsd.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|OpenBSD |15|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/openbsd.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|OpenBSD
|16|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/mageia.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|Mageia |16|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/mageia.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|Mageia
|17|-----| OpenWRT: Tested and working. See [wiki page](https://github.com/Neilpang/acme.sh/wiki/How-to-run-on-OpenWRT)
|18|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/solaris.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|SunOS/Solaris
For all build statuses, check our [daily build project](https://github.com/Neilpang/acmetest): For all build statuses, check our [daily build project](https://github.com/Neilpang/acmetest):
@@ -44,17 +48,9 @@ https://github.com/Neilpang/acmetest
3. Apache mode 3. Apache mode
4. Dns mode 4. Dns mode
# Upgrade from 1.x to 2.x
You can simply uninstall 1.x and re-install 2.x.
2.x is 100% compatible to 1.x. You will feel right at home as if nothing has changed.
# le.sh renamed to acme.sh NOW! # 1. How to install
All configurations are 100% compatible between `le.sh` and `acme.sh`. You just need to uninstall `le.sh` and re-install `acme.sh` again.
Nothing will be broken during the process.
# How to install
### 1. Install online: ### 1. Install online:
@@ -111,40 +107,40 @@ root@v1:~# acme.sh -h
``` ```
# Just issue a cert: # 2. Just issue a cert:
**Example 1:** Single domain. **Example 1:** Single domain.
```bash ```bash
acme.sh --issue -d aa.com -w /home/wwwroot/aa.com acme.sh --issue -d example.com -w /home/wwwroot/example.com
``` ```
**Example 2:** Multiple domains in the same cert. **Example 2:** Multiple domains in the same cert.
```bash ```bash
acme.sh --issue -d aa.com -d www.aa.com -d cp.aa.com -w /home/wwwroot/aa.com acme.sh --issue -d example.com -d www.example.com -d cp.example.com -w /home/wwwroot/example.com
``` ```
The parameter `/home/wwwroot/aa.com` is the web root folder. You **MUST** have `write access` to this folder. The parameter `/home/wwwroot/example.com` is the web root folder. You **MUST** have `write access` to this folder.
Second argument **"aa.com"** is the main domain you want to issue cert for. Second argument **"example.com"** is the main domain you want to issue cert for.
You must have at least a domain there. You must have at least a domain there.
You must point and bind all the domains to the same webroot dir: `/home/wwwroot/aa.com`. You must point and bind all the domains to the same webroot dir: `/home/wwwroot/example.com`.
Generate/issued certs will be placed in `~/.acme.sh/aa.com/` Generate/issued certs will be placed in `~/.acme.sh/example.com/`
The issued cert will be renewed every 80 days automatically. The issued cert will be renewed every **60** days automatically.
More examples: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert More examples: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert
# Install issued cert to apache/nginx etc. # 3. Install the issued cert to apache/nginx etc.
After you issue a cert, you probably want to install the cert with your nginx/apache or other servers you may be using. After you issue a cert, you probably want to install/copy the cert to your nginx/apache or other servers you may be using.
```bash ```bash
acme.sh --installcert -d aa.com \ acme.sh --installcert -d example.com \
--certpath /path/to/certfile/in/apache/nginx \ --certpath /path/to/certfile/in/apache/nginx \
--keypath /path/to/keyfile/in/apache/nginx \ --keypath /path/to/keyfile/in/apache/nginx \
--capath /path/to/ca/certfile/apache/nginx \ --capath /path/to/ca/certfile/apache/nginx \
@@ -154,23 +150,23 @@ acme.sh --installcert -d aa.com \
Only the domain is required, all the other parameters are optional. Only the domain is required, all the other parameters are optional.
Install the issued cert/key to the production apache or nginx path. Install/copy the issued cert/key to the production apache or nginx path.
The cert will be `renewed every 80 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`. 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`.
# Use Standalone server to issue cert # 4. Use Standalone server to issue cert
**(requires you be root/sudoer, or you have permission to listen tcp 80 port)** **(requires you be root/sudoer, or you have permission to listen tcp 80 port)**
The tcp `80` port **MUST** be free to listen, otherwise you will be prompted to free the `80` port and try again. The tcp `80` port **MUST** be free to listen, otherwise you will be prompted to free the `80` port and try again.
```bash ```bash
acme.sh --issue --standalone -d aa.com -d www.aa.com -d cp.aa.com acme.sh --issue --standalone -d example.com -d www.example.com -d cp.example.com
``` ```
More examples: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert More examples: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert
# Use Standalone tls server to issue cert # 5. Use Standalone tls server to issue cert
**(requires you be root/sudoer, or you have permission to listen tcp 443 port)** **(requires you be root/sudoer, or you have permission to listen tcp 443 port)**
@@ -179,12 +175,12 @@ acme.sh supports `tls-sni-01` validation.
The tcp `443` port **MUST** be free to listen, otherwise you will be prompted to free the `443` port and try again. The tcp `443` port **MUST** be free to listen, otherwise you will be prompted to free the `443` port and try again.
```bash ```bash
acme.sh --issue --tls -d aa.com -d www.aa.com -d cp.aa.com acme.sh --issue --tls -d example.com -d www.example.com -d cp.example.com
``` ```
More examples: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert More examples: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert
# Use Apache mode # 6. Use Apache mode
**(requires you be root/sudoer, since it is required to interact with apache server)** **(requires you be root/sudoer, since it is required to interact with apache server)**
@@ -195,28 +191,28 @@ Particularly, if you are running an apache server, you should use apache mode in
Just set string "apache" as the second argument, it will force use of apache plugin automatically. Just set string "apache" as the second argument, it will force use of apache plugin automatically.
``` ```
acme.sh --issue --apache -d aa.com -d www.aa.com -d user.aa.com acme.sh --issue --apache -d example.com -d www.example.com -d user.example.com
``` ```
More examples: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert More examples: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert
# Use DNS mode: # 7. Use DNS mode:
Support the `dns-01` challenge. Support the `dns-01` challenge.
```bash ```bash
acme.sh --issue --dns -d aa.com -d www.aa.com -d user.aa.com acme.sh --issue --dns -d example.com -d www.example.com -d user.example.com
``` ```
You should get the output like below: You should get the output like below:
``` ```
Add the following txt record: Add the following txt record:
Domain:_acme-challenge.aa.com Domain:_acme-challenge.example.com
Txt value:9ihDbjYfTExAYeDs4DBUeuTo18KBzwvTEjUnSwd32-c Txt value:9ihDbjYfTExAYeDs4DBUeuTo18KBzwvTEjUnSwd32-c
Add the following txt record: Add the following txt record:
Domain:_acme-challenge.www.aa.com Domain:_acme-challenge.www.example.com
Txt value:9ihDbjxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Txt value:9ihDbjxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Please add those txt records to the domains. Waiting for the dns to take effect. Please add those txt records to the domains. Waiting for the dns to take effect.
@@ -226,12 +222,12 @@ Please add those txt records to the domains. Waiting for the dns to take effect.
Then just rerun with `renew` argument: Then just rerun with `renew` argument:
```bash ```bash
acme.sh --renew -d aa.com acme.sh --renew -d example.com
``` ```
Ok, it's finished. Ok, it's finished.
# Automatic DNS API integration # 8. Automatic DNS API integration
If your DNS provider supports API access, we can use API to automatically issue the certs. If your DNS provider supports API access, we can use API to automatically issue the certs.
@@ -242,8 +238,11 @@ You don't have do anything manually!
1. Cloudflare.com API 1. Cloudflare.com API
2. Dnspod.cn API 2. Dnspod.cn API
3. Cloudxns.com API 3. Cloudxns.com API
4. AWS Route 53, see: https://github.com/Neilpang/acme.sh/issues/65 4. Godaddy.com API
5. lexicon dns api: https://github.com/Neilpang/acme.sh/wiki/How-to-use-lexicon-dns-api 5. OVH, kimsufi, soyoustart and runabove API
6. AWS Route 53, see: https://github.com/Neilpang/acme.sh/issues/65
7. PowerDNS API
8. lexicon dns api: https://github.com/Neilpang/acme.sh/wiki/How-to-use-lexicon-dns-api
(DigitalOcean, DNSimple, DnsMadeEasy, DNSPark, EasyDNS, Namesilo, NS1, PointHQ, Rage4 and Vultr etc.) (DigitalOcean, DNSimple, DnsMadeEasy, DNSPark, EasyDNS, Namesilo, NS1, PointHQ, Rage4 and Vultr etc.)
##### More APIs are coming soon... ##### More APIs are coming soon...
@@ -252,7 +251,7 @@ If your DNS provider is not on the supported list above, you can write your own
For more details: [How to use dns api](dnsapi) For more details: [How to use dns api](dnsapi)
# Issue ECC certificate: # 9. Issue ECC certificate:
`Let's Encrypt` now can issue **ECDSA** certificates. `Let's Encrypt` now can issue **ECDSA** certificates.
@@ -265,13 +264,13 @@ For example:
### Single domain ECC cerfiticate: ### Single domain ECC cerfiticate:
```bash ```bash
acme.sh --issue -w /home/wwwroot/aa.com -d aa.com --keylength ec-256 acme.sh --issue -w /home/wwwroot/example.com -d example.com --keylength ec-256
``` ```
SAN multi domain ECC certificate: SAN multi domain ECC certificate:
```bash ```bash
acme.sh --issue -w /home/wwwroot/aa.com -d aa.com -d www.aa.com --keylength ec-256 acme.sh --issue -w /home/wwwroot/example.com -d example.com -d www.example.com --keylength ec-256
``` ```
Please look at the last parameter above. Please look at the last parameter above.
@@ -282,6 +281,46 @@ Valid values are:
2. **ec-384 (secp384r1, "ECDSA P-384")** 2. **ec-384 (secp384r1, "ECDSA P-384")**
3. **ec-521 (secp521r1, "ECDSA P-521", which is not supported by Let's Encrypt yet.)** 3. **ec-521 (secp521r1, "ECDSA P-521", which is not supported by Let's Encrypt yet.)**
# 10. How to renew the cert
No, you don't need to renew the certs manually. All the certs will be renewed automatically every **60** days.
However, you can also force to renew any cert:
```
acme.sh --renew -d example.com --force
```
or, for ECC cert:
```
acme.sh --renew -d example.com --force --ecc
```
# 11. How to upgrade `acme.sh`
acme.sh is in developing, it's strongly recommended to use the latest code.
You can update acme.sh to the latest code:
```
acme.sh --upgrade
```
You can enable auto upgrade:
```
acme.sh --upgrade --auto-upgrade
```
Then **acme.sh** will keep up to date automatically.
Disable auto upgrade:
```
acme.sh --upgrade --auto-upgrade 0
```
# 12. Issue a cert from an existing CSR
https://github.com/Neilpang/acme.sh/wiki/Issue-a-cert-from-existing-CSR
# Under the Hood # Under the Hood
Speak ACME language using shell, directly to "Let's Encrypt". Speak ACME language using shell, directly to "Let's Encrypt".
@@ -293,7 +332,7 @@ TODO:
2. ACME protocol: https://github.com/ietf-wg-acme/acme 2. ACME protocol: https://github.com/ietf-wg-acme/acme
3. Certbot: https://github.com/certbot/certbot 3. Certbot: https://github.com/certbot/certbot
# License & Other # License & Others
License is GPLv3 License is GPLv3
@@ -302,4 +341,8 @@ Please Star and Fork me.
[Issues](https://github.com/Neilpang/acme.sh/issues) and [pull requests](https://github.com/Neilpang/acme.sh/pulls) are welcomed. [Issues](https://github.com/Neilpang/acme.sh/issues) and [pull requests](https://github.com/Neilpang/acme.sh/pulls) are welcomed.
# Donate
1. PayPal: donate@acme.sh
[Donate List](https://github.com/Neilpang/acme.sh/wiki/Donate-list)

2157
acme.sh

File diff suppressed because it is too large Load Diff

View File

@@ -15,7 +15,7 @@ export CF_Email="xxxx@sss.com"
Ok, let's issue cert now: Ok, let's issue cert now:
``` ```
acme.sh --issue --dns dns_cf -d aa.com -d www.aa.com acme.sh --issue --dns dns_cf -d example.com -d www.example.com
``` ```
The `CF_Key` and `CF_Email` will be saved in `~/.acme.sh/account.conf`, when next time you use cloudflare api, it will reuse this key. The `CF_Key` and `CF_Email` will be saved in `~/.acme.sh/account.conf`, when next time you use cloudflare api, it will reuse this key.
@@ -37,7 +37,7 @@ export DP_Key="sADDsdasdgdsf"
Ok, let's issue cert now: Ok, let's issue cert now:
``` ```
acme.sh --issue --dns dns_dp -d aa.com -d www.aa.com acme.sh --issue --dns dns_dp -d example.com -d www.example.com
``` ```
The `DP_Id` and `DP_Key` will be saved in `~/.acme.sh/account.conf`, when next time you use dnspod.cn api, it will reuse this key. The `DP_Id` and `DP_Key` will be saved in `~/.acme.sh/account.conf`, when next time you use dnspod.cn api, it will reuse this key.
@@ -58,12 +58,63 @@ export CX_Secret="sADDsdasdgdsf"
Ok, let's issue cert now: Ok, let's issue cert now:
``` ```
acme.sh --issue --dns dns_cx -d aa.com -d www.aa.com acme.sh --issue --dns dns_cx -d example.com -d www.example.com
``` ```
The `CX_Key` and `CX_Secret` will be saved in `~/.acme.sh/account.conf`, when next time you use Cloudxns.com api, it will reuse this key. The `CX_Key` and `CX_Secret` will be saved in `~/.acme.sh/account.conf`, when next time you use Cloudxns.com api, it will reuse this key.
## Use Godaddy.com domain api to automatically issue cert
We support Godaddy integration.
First you need to login to your Godaddy account to get your api key and api secret.
https://developer.godaddy.com/keys/
Please Create a Production key, instead of a Test key.
```
export GD_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
export GD_Secret="asdfsdafdsfdsfdsfdsfdsafd"
```
Ok, let's issue cert now:
```
acme.sh --issue --dns dns_gd -d example.com -d www.example.com
```
The `GD_Key` and `GD_Secret` will be saved in `~/.acme.sh/account.conf`, when next time you use cloudflare api, it will reuse this key.
## Use PowerDNS embedded api to automatically issue cert
We support PowerDNS embedded API integration.
First you need to enable api and set your api-token in PowerDNS configuration.
https://doc.powerdns.com/md/httpapi/README/
```
export PDNS_Url="http://ns.example.com:8081"
export PDNS_ServerId="localhost"
export PDNS_Token="0123456789ABCDEF"
export PDNS_Ttl=60
```
Ok, let's issue cert now:
```
acme.sh --issue --dns dns_pdns -d example.com -d www.example.com
```
The `PDNS_Url`, `PDNS_ServerId`, `PDNS_Token` and `PDNS_Ttl` will be saved in `~/.acme.sh/account.conf`.
## Use OVH/kimsufi/soyoustart/runabove API
https://github.com/Neilpang/acme.sh/wiki/How-to-use-OVH-domain-api
# Use custom api # Use custom api
@@ -72,17 +123,15 @@ If your api is not supported yet, you can write your own dns api.
Let's assume you want to name it 'myapi', Let's assume you want to name it 'myapi',
1. Create a bash script named `~/.acme.sh/dns_myapi.sh`, 1. Create a bash script named `~/.acme.sh/dns_myapi.sh`,
2. In the scrypt, you must have a function named `dns_myapi_add()`. Which will be called by acme.sh to add dns records. 2. In the script, you must have a function named `dns_myapi_add()`. Which will be called by acme.sh to add dns records.
3. Then you can use your api to issue cert like: 3. Then you can use your api to issue cert like:
``` ```
acme.sh --issue --dns dns_myapi -d aa.com -d www.aa.com acme.sh --issue --dns dns_myapi -d example.com -d www.example.com
``` ```
For more details, please check our sample script: [dns_myapi.sh](dns_myapi.sh) For more details, please check our sample script: [dns_myapi.sh](dns_myapi.sh)
# Use lexicon dns api # Use lexicon dns api
https://github.com/Neilpang/acme.sh/wiki/How-to-use-lexicon-dns-api https://github.com/Neilpang/acme.sh/wiki/How-to-use-lexicon-dns-api

View File

@@ -43,12 +43,12 @@ dns_cf_add(){
return 1 return 1
fi fi
count=$(printf "$response" | grep -o \"count\":[^,]* | cut -d : -f 2) count=$(printf "%s\n" "$response" | _egrep_o \"count\":[^,]* | cut -d : -f 2)
_debug count "$count" _debug count "$count"
if [ "$count" = "0" ] ; then if [ "$count" = "0" ] ; then
_info "Adding record" _info "Adding record"
if _cf_rest POST "zones/$_domain_id/dns_records" "{\"type\":\"TXT\",\"name\":\"$fulldomain\",\"content\":\"$txtvalue\",\"ttl\":120}"; then if _cf_rest POST "zones/$_domain_id/dns_records" "{\"type\":\"TXT\",\"name\":\"$fulldomain\",\"content\":\"$txtvalue\",\"ttl\":120}"; then
if printf $response | grep $fulldomain > /dev/null ; then if printf -- "%s" "$response" | grep $fulldomain > /dev/null ; then
_info "Added, sleeping 10 seconds" _info "Added, sleeping 10 seconds"
sleep 10 sleep 10
#todo: check if the record takes effect #todo: check if the record takes effect
@@ -61,7 +61,7 @@ dns_cf_add(){
_err "Add txt record error." _err "Add txt record error."
else else
_info "Updating record" _info "Updating record"
record_id=$(printf "$response" | grep -o \"id\":\"[^\"]*\" | cut -d : -f 2 | tr -d \"| head -1) record_id=$(printf "%s\n" "$response" | _egrep_o \"id\":\"[^\"]*\" | cut -d : -f 2 | tr -d \"| head -n 1)
_debug "record_id" $record_id _debug "record_id" $record_id
_cf_rest PUT "zones/$_domain_id/dns_records/$record_id" "{\"id\":\"$record_id\",\"type\":\"TXT\",\"name\":\"$fulldomain\",\"content\":\"$txtvalue\",\"zone_id\":\"$_domain_id\",\"zone_name\":\"$_domain\"}" _cf_rest PUT "zones/$_domain_id/dns_records/$record_id" "{\"id\":\"$record_id\",\"type\":\"TXT\",\"name\":\"$fulldomain\",\"content\":\"$txtvalue\",\"zone_id\":\"$_domain_id\",\"zone_name\":\"$_domain\"}"
@@ -103,7 +103,7 @@ _get_root() {
fi fi
if printf $response | grep \"name\":\"$h\" >/dev/null ; then if printf $response | grep \"name\":\"$h\" >/dev/null ; then
_domain_id=$(printf "$response" | grep -o \"id\":\"[^\"]*\" | head -1 | cut -d : -f 2 | tr -d \") _domain_id=$(printf "%s\n" "$response" | _egrep_o \"id\":\"[^\"]*\" | head -n 1 | cut -d : -f 2 | tr -d \")
if [ "$_domain_id" ] ; then if [ "$_domain_id" ] ; then
_sub_domain=$(printf $domain | cut -d . -f 1-$p) _sub_domain=$(printf $domain | cut -d . -f 1-$p)
_domain=$h _domain=$h

View File

@@ -69,7 +69,7 @@ existing_records() {
return 1 return 1
fi fi
count=0 count=0
seg=$(printf "$response" | grep -o "{[^{]*host\":\"$_sub_domain\"[^}]*}") seg=$(printf "%s\n" "$response" | _egrep_o "{[^\{]*host\":\"$_sub_domain\"[^\}]*\}")
_debug seg "$seg" _debug seg "$seg"
if [ -z "$seg" ] ; then if [ -z "$seg" ] ; then
return 0 return 0
@@ -77,7 +77,7 @@ existing_records() {
if printf "$response" | grep '"type":"TXT"' > /dev/null ; then if printf "$response" | grep '"type":"TXT"' > /dev/null ; then
count=1 count=1
record_id=$(printf "$seg" | grep -o \"record_id\":\"[^\"]*\" | cut -d : -f 2 | tr -d \") record_id=$(printf "%s\n" "$seg" | _egrep_o \"record_id\":\"[^\"]*\" | cut -d : -f 2 | tr -d \")
_debug record_id "$record_id" _debug record_id "$record_id"
return 0 return 0
fi fi
@@ -145,9 +145,9 @@ _get_root() {
fi fi
if printf "$response" | grep "$h." >/dev/null ; then if printf "$response" | grep "$h." >/dev/null ; then
seg=$(printf "$response" | grep -o "{[^{]*$h\.[^}]*\}" ) seg=$(printf "%s" "$response" | _egrep_o "\{[^\{]*\"$h\.\"[^\}]*\}" )
_debug seg "$seg" _debug seg "$seg"
_domain_id=$(printf "$seg" | grep -o \"id\":\"[^\"]*\" | cut -d : -f 2 | tr -d \") _domain_id=$(printf "%s" "$seg" | _egrep_o \"id\":\"[^\"]*\" | cut -d : -f 2 | tr -d \")
_debug _domain_id "$_domain_id" _debug _domain_id "$_domain_id"
if [ "$_domain_id" ] ; then if [ "$_domain_id" ] ; then
_sub_domain=$(printf $domain | cut -d . -f 1-$p) _sub_domain=$(printf $domain | cut -d . -f 1-$p)

View File

@@ -152,7 +152,7 @@ _get_root() {
fi fi
if printf "$response" | grep "Action completed successful" >/dev/null ; then if printf "$response" | grep "Action completed successful" >/dev/null ; then
_domain_id=$(printf "$response" | grep -o \"id\":\"[^\"]*\" | cut -d : -f 2 | tr -d \") _domain_id=$(printf "%s\n" "$response" | _egrep_o \"id\":\"[^\"]*\" | cut -d : -f 2 | tr -d \")
_debug _domain_id "$_domain_id" _debug _domain_id "$_domain_id"
if [ "$_domain_id" ] ; then if [ "$_domain_id" ] ; then
_sub_domain=$(printf $domain | cut -d . -f 1-$p) _sub_domain=$(printf $domain | cut -d . -f 1-$p)

118
dnsapi/dns_gd.sh Executable file
View File

@@ -0,0 +1,118 @@
#!/usr/bin/env sh
#Godaddy domain api
#
#GD_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
#
#GD_Secret="asdfsdfsfsdfsdfdfsdf"
GD_Api="https://api.godaddy.com/v1"
######## Public functions #####################
#Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_gd_add(){
fulldomain=$1
txtvalue=$2
if [ -z "$GD_Key" ] || [ -z "$GD_Secret" ] ; then
_err "You don't specify godaddy api key and secret yet."
_err "Please create you key and try again."
return 1
fi
#save the api key and email to the account conf file.
_saveaccountconf GD_Key "$GD_Key"
_saveaccountconf GD_Secret "$GD_Secret"
_debug "First detect the root zone"
if ! _get_root $fulldomain ; then
_err "invalid domain"
return 1
fi
_debug _domain_id "$_domain_id"
_debug _sub_domain "$_sub_domain"
_debug _domain "$_domain"
_info "Adding record"
if _gd_rest PUT "domains/$_domain/records/TXT/$_sub_domain" "[{\"data\":\"$txtvalue\"}]"; then
if [ "$response" = "{}" ] ; then
_info "Added, sleeping 10 seconds"
sleep 10
#todo: check if the record takes effect
return 0
else
_err "Add txt record error."
_err "$response"
return 1
fi
fi
_err "Add txt record error."
}
#################### Private functions bellow ##################################
#_acme-challenge.www.domain.com
#returns
# _sub_domain=_acme-challenge.www
# _domain=domain.com
# _domain_id=sdjkglgdfewsdfg
_get_root() {
domain=$1
i=2
p=1
while [ '1' ] ; do
h=$(printf $domain | cut -d . -f $i-100)
if [ -z "$h" ] ; then
#not valid
return 1;
fi
if ! _gd_rest GET "domains/$h" ; then
return 1
fi
if printf "$response" | grep '"code":"NOT_FOUND"' >/dev/null ; then
_debug "$h not found"
else
_sub_domain=$(printf $domain | cut -d . -f 1-$p)
_domain=$h
return 0
fi
p=$i
i=$(expr $i + 1)
done
return 1
}
_gd_rest() {
m=$1
ep="$2"
data="$3"
_debug $ep
_H1="Authorization: sso-key $GD_Key:$GD_Secret"
_H2="Content-Type: application/json"
if [ "$data" ] ; then
_debug data "$data"
response="$(_post "$data" "$GD_Api/$ep" "" $m)"
else
response="$(_get "$GD_Api/$ep")"
fi
if [ "$?" != "0" ] ; then
_err "error $ep"
return 1
fi
_debug2 response "$response"
return 0
}

302
dnsapi/dns_ovh.sh Executable file
View File

@@ -0,0 +1,302 @@
#!/usr/bin/env sh
#Applcation Key
#OVH_AK="sdfsdfsdfljlbjkljlkjsdfoiwje"
#
#Application Secret
#OVH_AS="sdfsafsdfsdfdsfsdfsa"
#
#Consumer Key
#OVH_CK="sdfsdfsdfsdfsdfdsf"
#OVH_END_POINT=ovh-eu
#'ovh-eu'
OVH_EU='https://eu.api.ovh.com/1.0'
#'ovh-ca':
OVH_CA='https://ca.api.ovh.com/1.0'
#'kimsufi-eu'
KSF_EU='https://eu.api.kimsufi.com/1.0'
#'kimsufi-ca'
KSF_CA='https://ca.api.kimsufi.com/1.0'
#'soyoustart-eu'
SYS_EU='https://eu.api.soyoustart.com/1.0'
#'soyoustart-ca'
SYS_CA='https://ca.api.soyoustart.com/1.0'
#'runabove-ca'
RAV_CA='https://api.runabove.com/1.0'
wiki="https://github.com/Neilpang/acme.sh/wiki/How-to-use-OVH-domain-api"
ovh_success="https://github.com/Neilpang/acme.sh/wiki/OVH-Success"
_ovh_get_api() {
_ogaep="$1"
case "${_ogaep}" in
ovh-eu|ovheu)
printf "%s" $OVH_EU
return
;;
ovh-ca|ovhca)
printf "%s" $OVH_CA
return
;;
kimsufi-eu|kimsufieu)
printf "%s" $KSF_EU
return
;;
kimsufi-ca|kimsufica)
printf "%s" $KSF_CA
return
;;
soyoustart-eu|soyoustarteu)
printf "%s" $SYS_EU
return
;;
soyoustart-ca|soyoustartca)
printf "%s" $SYS_CA
return
;;
runabove-ca|runaboveca)
printf "%s" $RAV_CA
return
;;
*)
_err "Unknown parameter : $1"
return 1
;;
esac
}
######## Public functions #####################
#Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_ovh_add(){
fulldomain=$1
txtvalue=$2
if [ -z "$OVH_AK" ] || [ -z "$OVH_AS" ] ; then
_err "You don't specify OVH application key and application secret yet."
_err "Please create you key and try again."
return 1
fi
#save the api key and email to the account conf file.
_saveaccountconf OVH_AK "$OVH_AK"
_saveaccountconf OVH_AS "$OVH_AS"
if [ -z "$OVH_END_POINT" ] ; then
OVH_END_POINT="ovh-eu"
fi
_info "Using OVH endpoint: $OVH_END_POINT"
if [ "$OVH_END_POINT" != "ovh-eu" ] ; then
_saveaccountconf OVH_END_POINT "$OVH_END_POINT"
fi
OVH_API="$(_ovh_get_api $OVH_END_POINT )"
_debug OVH_API "$OVH_API"
if [ -z "$OVH_CK" ] ; then
_info "OVH consumer key is empty, Let's get one:"
if ! _ovh_authentication ; then
_err "Can not get consumer key."
fi
#return and wait for retry.
return 1;
fi
_info "Checking authentication"
response="$(_ovh_rest GET "domain/")"
if _contains "$response" "INVALID_CREDENTIAL" ; then
_err "The consumer key is invalid: $OVH_CK"
_err "Please retry to create a new one."
_clearaccountconf OVH_CK
return 1
fi
_info "Consumer key is ok."
_debug "First detect the root zone"
if ! _get_root $fulldomain ; then
_err "invalid domain"
return 1
fi
_debug _domain_id "$_domain_id"
_debug _sub_domain "$_sub_domain"
_debug _domain "$_domain"
_debug "Getting txt records"
_ovh_rest GET "domain/zone/$_domain/record?fieldType=TXT&subDomain=$_sub_domain"
if _contains "$response" '\[\]' || _contains "$response" "This service does not exist" ; then
_info "Adding record"
if _ovh_rest POST "domain/zone/$_domain/record" "{\"fieldType\":\"TXT\",\"subDomain\":\"$_sub_domain\",\"target\":\"$txtvalue\",\"ttl\":60}"; then
if _contains "$response" "$txtvalue" ; then
_ovh_rest POST "domain/zone/$_domain/refresh"
_debug "Refresh:$response"
_info "Added, sleeping 10 seconds"
sleep 10
return 0
fi
fi
_err "Add txt record error."
else
_info "Updating record"
record_id=$(printf "%s" "$response" | tr -d "[]" | cut -d , -f 1)
if [ -z "$record_id" ] ; then
_err "Can not get record id."
return 1
fi
_debug "record_id" $record_id
if _ovh_rest PUT "domain/zone/$_domain/record/$record_id" "{\"target\":\"$txtvalue\",\"subDomain\":\"$_sub_domain\",\"ttl\":60}" ; then
if _contains "$response" "null" ; then
_ovh_rest POST "domain/zone/$_domain/refresh"
_debug "Refresh:$response"
_info "Updated, sleeping 10 seconds"
sleep 10
return 0;
fi
fi
_err "Update error"
return 1
fi
}
#################### Private functions bellow ##################################
_ovh_authentication() {
_H1="X-Ovh-Application: $OVH_AK"
_H2="Content-type: application/json"
_H3=""
_H4=""
_ovhdata='{"accessRules": [{"method": "GET","path": "/*"},{"method": "POST","path": "/*"},{"method": "PUT","path": "/*"},{"method": "DELETE","path": "/*"}],"redirection":"'$ovh_success'"}'
response="$(_post "$_ovhdata" "$OVH_API/auth/credential")"
_debug3 response "$response"
validationUrl="$(echo "$response" | _egrep_o "validationUrl\":\"[^\"]*\"" | _egrep_o "http.*\"" | tr -d '"')"
if [ -z "$validationUrl" ] ; then
_err "Unable to get validationUrl"
return 1
fi
_debug validationUrl "$validationUrl"
consumerKey="$(echo "$response" | _egrep_o "consumerKey\":\"[^\"]*\"" | cut -d : -f 2 | tr -d '"')"
if [ -z "$consumerKey" ] ; then
_err "Unable to get consumerKey"
return 1
fi
_debug consumerKey "$consumerKey"
OVH_CK="$consumerKey"
_saveaccountconf OVH_CK "$OVH_CK"
_info "Please open this link to do authentication: $(__green "$validationUrl" )"
_info "Here is a guide for you: $(__green "$wiki" )"
_info "Please retry after the authentication is done."
}
#_acme-challenge.www.domain.com
#returns
# _sub_domain=_acme-challenge.www
# _domain=domain.com
# _domain_id=sdjkglgdfewsdfg
_get_root() {
domain=$1
i=2
p=1
while [ '1' ] ; do
h=$(printf $domain | cut -d . -f $i-100)
if [ -z "$h" ] ; then
#not valid
return 1;
fi
if ! _ovh_rest GET "domain/zone/$h" ; then
return 1
fi
if ! _contains "$response" "This service does not exist" >/dev/null ; then
_sub_domain=$(printf $domain | cut -d . -f 1-$p)
_domain=$h
return 0
fi
p=$i
i=$(expr $i + 1)
done
return 1
}
_ovh_timestamp() {
_H1=""
_H2=""
_H3=""
_H4=""
_H5=""
_get "$OVH_API/auth/time" "" 30
}
_ovh_rest() {
m=$1
ep="$2"
data="$3"
_debug $ep
_ovh_url="$OVH_API/$ep"
_debug2 _ovh_url "$_ovh_url"
_ovh_t="$(_ovh_timestamp)"
_debug2 _ovh_t "$_ovh_t"
_ovh_p="$OVH_AS+$OVH_CK+$m+$_ovh_url+$data+$_ovh_t"
_debug _ovh_p "$_ovh_p"
_ovh_hex="$(printf "%s" "$_ovh_p" | _digest sha1 hex)"
_debug2 _ovh_hex "$_ovh_hex"
_H1="X-Ovh-Application: $OVH_AK"
_H2="X-Ovh-Signature: \$1\$$_ovh_hex"
_debug2 _H2 "$_H2"
_H3="X-Ovh-Timestamp: $_ovh_t"
_H4="X-Ovh-Consumer: $OVH_CK"
_H5="Content-Type: application/json;charset=utf-8"
if [ "$data" ] || [ "$m" = "POST" ] || [ "$m" = "PUT" ] ; then
_debug data "$data"
response="$(_post "$data" "$_ovh_url" "" $m)"
else
response="$(_get "$_ovh_url")"
fi
if [ "$?" != "0" ] ; then
_err "error $ep"
return 1
fi
_debug2 response "$response"
return 0
}

133
dnsapi/dns_pdns.sh Executable file
View File

@@ -0,0 +1,133 @@
#!/usr/bin/env sh
#PowerDNS Emdedded API
#https://doc.powerdns.com/md/httpapi/api_spec/
#
#PDNS_Url="http://ns.example.com:8081"
#PDNS_ServerId="localhost"
#PDNS_Token="0123456789ABCDEF"
#PDNS_Ttl=60
DEFAULT_PDNS_TTL=60
######## Public functions #####################
#Usage: add _acme-challenge.www.domain.com "123456789ABCDEF0000000000000000000000000000000000000"
dns_pdns_add() {
fulldomain=$1
txtvalue=$2
if [ -z "$PDNS_Url" ] ; then
_err "You don't specify PowerDNS address."
_err "Please set PDNS_Url and try again."
return 1
fi
if [ -z "$PDNS_ServerId" ] ; then
_err "You don't specify PowerDNS server id."
_err "Please set you PDNS_ServerId and try again."
return 1
fi
if [ -z "$PDNS_Token" ] ; then
_err "You don't specify PowerDNS token."
_err "Please create you PDNS_Token and try again."
return 1
fi
if [ -z "$PDNS_Ttl" ] ; then
PDNS_Ttl=$DEFAULT_PDNS_TTL
fi
#save the api addr and key to the account conf file.
_saveaccountconf PDNS_Url "$PDNS_Url"
_saveaccountconf PDNS_ServerId "$PDNS_ServerId"
_saveaccountconf PDNS_Token "$PDNS_Token"
if [ "$PDNS_Ttl" != "$DEFAULT_PDNS_TTL" ] ; then
_saveaccountconf PDNS_Ttl "$PDNS_Ttl"
fi
_debug "First detect the root zone"
if ! _get_root $fulldomain ; then
_err "invalid domain"
return 1
fi
_debug _domain "$_domain"
if ! set_record "$_domain" "$fulldomain" "$txtvalue" ; then
return 1
fi
return 0
}
set_record() {
_info "Adding record"
root=$1
full=$2
txtvalue=$3
if ! _pdns_rest "PATCH" "/api/v1/servers/$PDNS_ServerId/zones/$root." "{\"rrsets\": [{\"name\": \"$full.\", \"changetype\": \"REPLACE\", \"type\": \"TXT\", \"ttl\": $PDNS_Ttl, \"records\": [{\"name\": \"$full.\", \"type\": \"TXT\", \"content\": \"\\\"$txtvalue\\\"\", \"disabled\": false, \"ttl\": $PDNS_Ttl}]}]}" ; then
_err "Set txt record error."
return 1
fi
if ! _pdns_rest "PUT" "/api/v1/servers/$PDNS_ServerId/zones/$root./notify" ; then
_err "Notify servers error."
return 1
fi
return 0
}
#################### Private functions bellow ##################################
#_acme-challenge.www.domain.com
#returns
# _domain=domain.com
_get_root() {
domain=$1
i=1
p=1
if _pdns_rest "GET" "/api/v1/servers/$PDNS_ServerId/zones" ; then
_zones_response=$response
fi
while [ '1' ] ; do
h=$(printf $domain | cut -d . -f $i-100)
if [ -z "$h" ] ; then
return 1
fi
if printf "$_zones_response" | grep "\"name\": \"$h.\"" >/dev/null ; then
_domain=$h
return 0
fi
p=$i
i=$(expr $i + 1)
done
_debug "$domain not found"
return 1
}
_pdns_rest() {
method=$1
ep=$2
data=$3
_H1="X-API-Key: $PDNS_Token"
if [ ! "$method" = "GET" ] ; then
_debug data "$data"
response="$(_post "$data" "$PDNS_Url$ep" "" "$method")"
else
response="$(_get "$PDNS_Url$ep")"
fi
if [ "$?" != "0" ] ; then
_err "error $ep"
return 1
fi
_debug2 response "$response"
return 0
}