Compare commits

..
301 Commits
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
neil bc96082fa9 typos 2016-06-27 10:32:51 +08:00
neil 52677b0a88 2.2.9 support --upgrade 2016-06-26 13:30:47 +08:00
neil e4a1958573 support apache2ctl 2016-06-26 11:49:41 +08:00
neil 523c7682fa minor: add MAX_RENEW 2016-06-26 10:09:51 +08:00
neil 87ab2d9085 minor, add more debug info 2016-06-25 09:40:00 +08:00
neil 687cfcc2b1 minor add error code 2016-06-25 09:29:23 +08:00
neil c8e9a31ee5 add --nocron, for not installing default cronjob. 2016-06-24 22:27:22 +08:00
bruncsak 2ce87fe264 bug fix to respect the --accountkeylength flag (#219)
Thanks.
2016-06-23 20:11:43 +08:00
neil 13d7cae9e2 add --insecure Do not check the server certificate, in some devices, the api server's certificate may not be trusted. 2016-06-20 18:35:40 +08:00
neil 8814a348a8 minor, do not write the default user agent. 2016-06-19 14:39:24 +08:00
neil 5aa146a53f fix bug 2016-06-18 12:28:23 +08:00
neil cc17973113 return the error code in cron 2016-06-18 11:29:28 +08:00
neil 423966a505 minor, add more debug info 2016-06-17 21:35:34 +08:00
neil fbad6a392d opps 2016-06-17 20:57:54 +08:00
neil 331c4bb669 minor, add more debug info 2016-06-17 20:54:22 +08:00
neil 63a195e5cc minor: fix user-agent string. 2016-06-17 18:09:55 +08:00
neil e22bcf7cb4 support tls (#215)
* support tls-sni-01
'--tls'  and '--tlsport'

* fix tls doc
2016-06-17 13:23:44 +08:00
neil 869578ce4a minor, fix apache error messaage. 2016-06-15 13:57:27 +08:00
neil 5fc5016d2c minor, fix apache error message. 2016-06-15 13:46:45 +08:00
neil 22e7ba3f7b Merge branch 'master' of https://github.com/Neilpang/acme.sh 2016-06-14 13:08:10 +08:00
neil dcf4f8f64e minor, format the output of "--list" 2016-06-14 13:07:33 +08:00
neil d07e8f91c4 Update README.md 2016-06-14 12:00:19 +08:00
neil 054cb72e55 minor, save days only when necessary 2016-06-13 14:49:00 +08:00
neil 0e38c60da3 add "--dnssleep". The time in seconds to wait for all the txt records to take effect in dns api mode. Default 60 seconds. 2016-06-13 10:13:20 +08:00
neil 6d7eda3e8d v2.2.6 Add "--list" command 2016-06-09 14:18:54 +08:00
neil ee1737a52e minor, ignore empty -d value 2016-06-09 12:45:30 +08:00
neil 432c589722 Merge branch 'master' of https://github.com/Neilpang/acme.sh 2016-06-09 12:07:05 +08:00
neil c083e078d4 minor, remove unnecessary message 2016-06-09 12:06:37 +08:00
Jeremy Fleischman 9003525210 typo 2016-06-07 13:23:32 +08:00
neil bf233fbd48 minor 2016-06-07 13:05:27 +08:00
neil cc7fdbd661 minor, remove the unnecessary error file 2016-06-07 11:27:36 +08:00
neil 199067e8ab add Mageia status 2016-06-05 19:53:22 +08:00
rajcz d65e3d9a6e typos 2016-06-03 18:12:34 +08:00
neil ec9fc8cbf7 add more debug message 2016-05-31 21:38:41 +08:00
neil 9aaf36cd0c add curl error message. 2016-05-31 21:20:10 +08:00
neil c4d8fd83d4 check return code 2016-05-31 20:32:58 +08:00
neil a272ee4f59 fix get nonce 2016-05-31 20:16:57 +08:00
neil 7012b91f05 add err check for post and get 2016-05-31 12:28:43 +08:00
neil 16679b572f add more debug info 2016-05-31 12:12:30 +08:00
neil 6e18034333 fix error message. 2016-05-30 22:06:30 +08:00
neil b7ec6789b3 add more log 2016-05-30 21:55:49 +08:00
neil c835ab025a add more log 2016-05-30 21:28:03 +08:00
neil 39c8f79f3e add '--httpport' for servers that is behind a reverse proxy or load balancer 2016-05-29 14:08:39 +08:00
neil eae290992f minor, fix normalize json 2016-05-23 22:02:43 +08:00
neil bb276fc985 minor. 2016-05-23 13:32:50 +08:00
raunsbaekdk 8d5618c44a Bash does not support double equal sign (#192)
use single equal sign '=' instead.
2016-05-21 22:59:39 +08:00
neil 8f63baf7e4 fix centos apache issue 2016-05-21 15:33:10 +08:00
neil 78768e985b minor, add more apache debug info 2016-05-21 14:47:23 +08:00
neil 2ee5d873db fix for the new let's encrypt format 2016-05-21 14:33:40 +08:00
neil 6cd3a8a549 Merge branch 'master' of https://github.com/Neilpang/acme.sh 2016-05-16 22:43:04 +08:00
neil 5778811a18 minor, fix apache version 2016-05-16 22:42:32 +08:00
neil 4e1f39cdec Update README.md 2016-05-14 19:47:03 +08:00
neil 2c554a4bbb minor 2016-05-13 22:25:40 +08:00
neil 8fb9a709b0 fix issue, Wget 1.13.4 doesn't support "--method" 2016-05-13 21:58:29 +08:00
neil 484d9d2ad8 minor 2016-05-13 21:33:52 +08:00
neil 1953957506 minor, polish code 2016-05-13 21:14:00 +08:00
neil 06e8b869b9 Update README.md 2016-05-11 13:27:33 +08:00
neil 8f48168c73 minor 2016-05-10 23:20:50 +08:00
neil d3595686f6 fix issue. return the actual retcode. 2016-05-09 22:56:19 +08:00
neil c839b2b039 minor, add comments 2016-05-09 22:36:48 +08:00
neil acafa585f4 support tcsh 2016-05-09 22:28:45 +08:00
Alistair Nixon 7939b419f7 fix issue where keyauthorization starts with a - character (#184) 2016-05-09 18:18:38 +08:00
neil 61579ec329 Update README.md 2016-05-08 21:47:37 +08:00
neil 1786a5e55a fix issue 2016-05-08 21:21:07 +08:00
neil 2ed01ff040 lexicon dns api: (DigitalOcean, DNSimple, DnsMadeEasy, DNSPark, EasyDNS, Namesilo, NS1, PointHQ, Rage4 and Vultr etc.) 2016-05-08 18:29:30 +08:00
root 9bf69d30e0 exec mode 2016-05-08 09:19:17 +08:00
neil 218dc3390f support lexicon dns api 2016-05-08 18:20:56 +08:00
neil 6626371d87 minor. create the csh only when necessary. 2016-05-08 00:44:03 +08:00
neil a4270efac9 fix wget support in dns api 2016-05-07 23:33:42 +08:00
neil 94dc5f330c install alias for csh 2016-05-07 17:11:01 +08:00
neil c53da1ef72 fix bug. when the webroot contains 'no' or 'apache' 2016-05-03 20:41:40 +08:00
neil 01f54558b9 fix error message. 2016-04-27 23:34:29 +08:00
neil ca2a96b3f3 ignore the installcert error for 'issue' 2016-04-27 22:29:35 +08:00
neil 4d2f38b03a minor, just refactor some code. 2016-04-27 22:14:15 +08:00
neil 762978f8d8 remove umask, just chmod for the "$LE_WORKING_DIR" 2016-04-26 08:11:40 +08:00
neil bfdf1f482e umask 2016-04-25 20:01:37 +08:00
neil 990d46d659 Update README.md 2016-04-25 13:49:02 +08:00
neil 620f86130c Update README.md 2016-04-25 13:48:03 +08:00
neil c0205b0ad5 Merge branch 'master' of https://github.com/Neilpang/acme.sh 2016-04-24 23:17:08 +08:00
neil ff3bce3287 minor, remove 'cp -p', for unnecessary warning message for Proxmox. 2016-04-24 23:16:45 +08:00
neil 2b3fc6656c Update README.md 2016-04-24 23:10:54 +08:00
Indust 4fa08fc78c fix record update error for cloudxns (#167)
thanks.
2016-04-24 22:54:40 +08:00
neil 5c5705789e Merge pull request #171 from Neilpang/fix
remove echo -e
2016-04-24 22:19:47 +08:00
neil ac0a1661f3 remove echo -e 2016-04-24 22:16:03 +08:00
neil 7cde2f8526 Merge pull request #170 from qbi/patch-1
typos
2016-04-24 19:08:06 +08:00
Jens Kubieziel 5bdad8448c Fix some typos 2016-04-24 10:50:09 +00:00
neil 63c6a3b089 Support OpenBSD 2016-04-24 13:57:50 +08:00
neil 230234e701 fix issue for openBSD 2016-04-24 13:51:42 +08:00
neil e4739512e6 minor, remove kill. the following _get call will cause the nc exit. 2016-04-23 14:03:04 +08:00
neil 14f3dbb71a minor, fix sed_i 2016-04-22 20:50:43 +08:00
neil 0103f59f82 remove unnecessary kill. 2016-04-21 22:48:40 +08:00
neil d9ded9f3f3 Update README.md 2016-04-21 21:43:28 +08:00
neil 1f60d2bbb4 Update README.md 2016-04-21 21:12:48 +08:00
neil daf5650445 Update README.md 2016-04-21 21:09:08 +08:00
neil 998c92d57e Update README.md 2016-04-20 22:38:26 +08:00
neil 6de38fbf08 sh 2016-04-19 23:42:10 +08:00
neil 073ca4bf8d support sh 2016-04-19 23:23:52 +08:00
neil 0cca212843 v2.2.2 support sh 2016-04-19 23:17:38 +08:00
neil c8b6fe62a1 fix compatible for windows nc 2016-04-19 22:01:51 +08:00
neil f321c3c7ea fix issue for nc on windows. 2016-04-19 21:56:44 +08:00
neil 80a0a7b5c5 minor: fix apachectl error message (#160) 2016-04-19 18:36:15 +08:00
neil 51e85716ee minor: fix apachectl error message 2016-04-19 18:34:04 +08:00
neil 641989fdee NO_DETECT_SH 2016-04-18 22:43:33 +08:00
neil e4f67c626a Merge pull request #156 from Neilpang/master
merge
2016-04-18 21:36:13 +08:00
neil db0534ed97 fix bug, uninstall env 2016-04-18 21:33:21 +08:00
Richard van Dijk 2d39b3df88 fix renewAll bug
$CERT_HOME is required by renewAll, but wasn't initialized.
2016-04-18 09:11:05 +08:00
Richard van Dijk a79b26af6c fix renewAll bug
$CERT_HOME is required by renewAll, but wasn't initialized.
2016-04-18 08:37:35 +08:00
neil a1048c48e4 fix compatible for dash 2016-04-17 20:58:56 +08:00
neil fc33dbb54e fix compatible 2016-04-17 20:49:28 +08:00
neil 0a7c936442 modify shebang to bash after install if bash is installed. 2016-04-17 19:47:22 +08:00
neil c5f2df5c93 fix compatible for sh. head -n -1 is not supported on pfsense. 2016-04-17 19:16:48 +08:00
neil cada9dc0a0 Merge pull request #154 from Neilpang/master
merge
2016-04-17 18:58:15 +08:00
neil cbd13a123f Merge branch 'master' of https://github.com/Neilpang/acme.sh 2016-04-17 18:56:10 +08:00
neil c1c7d87bc5 minor. 2016-04-17 18:56:03 +08:00
neil f4312b4428 fix 2016-04-17 18:54:06 +08:00
neil 00a506053c compatible to dash 2016-04-17 17:33:08 +08:00
neil c191ab7c07 Update README.md 2016-04-17 12:02:36 +08:00
neil 8663fb7e64 revert to bash. there are some issue with sh need to fix yet. 2016-04-17 07:38:43 +08:00
neil 99dc89c051 v2.2.0. It's time to declare that we are sh compatible, not only bash. 2016-04-16 23:10:46 +08:00
neil 158f22f733 fix compatible for sh. rename api. '-' is not allowed in the function name. 2016-04-16 22:31:17 +08:00
neil eccec5f6d5 fix compatible for sh. '-' is not allowed in function name. 2016-04-16 22:19:29 +08:00
neil dceb3acace fix compatible for sh 2016-04-16 21:52:24 +08:00
neil 036e9d1074 fix compatible for sh 2016-04-16 21:01:40 +08:00
neil 6ed1c718b9 minor, install without dnsapi 2016-04-16 20:06:26 +08:00
neil 8f7ad693a8 fix compatible for sh 2016-04-16 20:02:41 +08:00
neil eac18b1c99 fix compatible for sh 2016-04-16 19:38:11 +08:00
neil 6f93064114 fix bug: multi webroots 2016-04-16 19:23:44 +08:00
neil b281789777 add --certhome for --install command to save all the certs. 2016-04-16 19:05:53 +08:00
neil 5ef501c5ec More. restore apache on error 2016-04-16 18:31:00 +08:00
neil 0662507116 add --days only valid for -issue command. 2016-04-16 18:15:36 +08:00
neil b5eb4b904e add --accountkey and --accountemail 2016-04-16 17:56:45 +08:00
neil 93c9216b69 update doc 2016-04-16 17:27:30 +08:00
neil 635695ec84 add --useragent to specify user-aggent for install or issue or other command 2016-04-16 17:25:26 +08:00
neil 41e3eafa90 skip creating accountkey/domainkey if already existing 2016-04-15 21:27:32 +08:00
neil 937cbf6df8 Update README.md 2016-04-15 20:45:08 +08:00
neil 432c14b86a Merge pull request #143 from sergeifilippov/patch-2
Update dns-myapi.sh
2016-04-15 20:42:27 +08:00
neil 6ce00fcdb8 Merge pull request #141 from sergeifilippov/patch-1
README rewrite
2016-04-15 20:39:27 +08:00
Sergei Filippov fb67522324 Update dns-myapi.sh 2016-04-15 23:41:15 +12:00
Sergei Filippov 2b45dba57c README rewrite
Refactoring the README.

Cleaned up:

- Spelling
- Grammar
- Formatting

Doing my part to help out the maintainer of this awesome tool! Thank you @neilpang
2016-04-15 22:50:40 +12:00
neil b0515cf8c0 Install from get.acme.sh 2016-04-14 22:27:51 +08:00
neil 6cc11ffb7d rename to acme.sh 2016-04-14 21:44:26 +08:00
neil 65938b73e1 update doc for --home 2016-04-13 23:36:32 +08:00
neil 70a5587513 typo 2016-04-13 22:58:03 +08:00
neil 3d434e43ad minor 2016-04-13 21:38:13 +08:00
neil a7b7355dcf v2.0.1. Use '--home' install of env 2016-04-13 20:37:18 +08:00
neil 63f5d07ed7 Merge pull request #133 from Neilpang/nc-timeout
Add nc timeout
2016-04-13 00:26:20 +08:00
neil 233e8a2085 kill nc 2016-04-13 00:24:55 +08:00
neil 770dc4b230 expose the error 2016-04-12 23:47:09 +08:00
neil dca09dedac kill nc process 2016-04-12 23:43:24 +08:00
neil 6fc1447fa6 add timeout for nc. 2016-04-12 23:18:22 +08:00
neil fb6d3ab285 Merge pull request #127 from roozbehk/fixkeypath
bug, incorrect parameter for keypath
2016-04-12 09:46:11 +08:00
roozbehk 3ed4102a3c incorrect parameter for keypath 2016-04-11 21:32:49 -04:00
neil d53289d707 Save customized account.conf. 2016-04-11 22:33:57 +08:00
neil e8cce73a17 100% compatible from 1.x to 2.x 2016-04-10 12:54:01 +08:00
neil 5c917113e8 V2 help 2016-04-09 23:57:29 +08:00
neil a63b05a9e7 le.sh v2.0.0
1. Unix-like command api
2. 100% compatible with le.sh 1.x command api.
3. Support different webroot for each domain in the same cert.
```
le.sh  --issue  -d a.com  -w /wwwroot/a.com  -d b.com -w /wwwroot/b.com
```
4. Support different authentication methods for each domain in the same cert. Hybrid usage:
```
le.sh  --issue  -d a.com -w /wwwroot/a.com  -d  b.com -dns dns-cf
```

5. Two different debug levels to provide useful debug info. `--debug`  or `--debug 2`
6. Support to install `fullchain.cer` after renewal.
7. Better performance.
2016-04-09 23:40:59 +08:00
neil 6cb415f57e Support revoke cert 2016-04-06 22:16:09 +08:00
13 changed files with 5129 additions and 2121 deletions

No files matched your search

+229 -164
View File
@@ -1,283 +1,348 @@
# le: means simp`Le` # An ACME Shell script: acme.sh
Simplest shell script for LetsEncrypt free Certificate client - An ACME protocol client written purely in Shell (Unix shell) language.
- Fully ACME protocol implementation.
- Simple, powerful and very easy to use. You only need 3 minutes to learn.
- Bash, dash and sh compatible.
- Simplest shell script for Let's Encrypt free certificate client.
- Purely written in Shell with no dependencies on python or Let's Encrypt official client.
- Just one script, to issue, renew and install your certificates automatically.
- DOES NOT require `root/sudoer` access.
Simple and Powerful, you only need 3 minutes to learn. It's probably the `easiest&smallest&smartest` shell script to automatically issue & renew the free certificates from Let's Encrypt.
Pure written in bash, no dependencies to python, acme-tiny or LetsEncrypt official client.
Just one script, to issue, renew your certificates automatically.
Probably it's the smallest&easiest&smartest shell script to automatically issue & renew the free certificates from LetsEncrypt. Wiki: https://github.com/Neilpang/acme.sh/wiki
NOT require to be `root/sudoer`. # [中文说明](https://github.com/Neilpang/acme.sh/wiki/%E8%AF%B4%E6%98%8E)
Wiki: https://github.com/Neilpang/le/wiki
#Tested OS #Tested OS
1. Ubuntu [![](https://cdn.rawgit.com/Neilpang/letest/master/status/ubuntu-latest.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status) | NO | Status| Platform|
2. Debian [![](https://cdn.rawgit.com/Neilpang/letest/master/status/debian-latest.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status) |----|-------|---------|
3. CentOS [![](https://cdn.rawgit.com/Neilpang/letest/master/status/centos-latest.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status) |1|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/ubuntu-latest.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)| Ubuntu
4. Windows (cygwin with curl, openssl and crontab included) [![](https://cdn.rawgit.com/Neilpang/letest/master/status/windows.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status) |2|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/debian-latest.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)| Debian
5. FreeBSD with bash [![](https://cdn.rawgit.com/Neilpang/letest/master/status/freebsd.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status) |3|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/centos-latest.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|CentOS
6. pfsense with bash and curl |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)
7. openSUSE [![](https://cdn.rawgit.com/Neilpang/letest/master/status/opensuse-latest.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status) |5|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/freebsd.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|FreeBSD
8. Alpine Linux [![](https://cdn.rawgit.com/Neilpang/letest/master/status/alpine-latest.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status) (with bash, curl. https://github.com/Neilpang/le/issues/94) |6|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/pfsense.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|pfsense
9. Archlinux [![](https://cdn.rawgit.com/Neilpang/letest/master/status/base-archlinux.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status) |7|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/opensuse-latest.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|openSUSE
10. fedora [![](https://cdn.rawgit.com/Neilpang/letest/master/status/fedora-latest.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status) |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)
11. Kali Linux [![](https://cdn.rawgit.com/Neilpang/letest/master/status/kalilinux-kali-linux-docker.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status) |9|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/base-archlinux.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|Archlinux
12. Oracle Linux [![](https://cdn.rawgit.com/Neilpang/letest/master/status/oraclelinux-latest.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status) |10|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/fedora-latest.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|fedora
13. Cloud Linux https://github.com/Neilpang/le/issues/111 |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
14. Proxmox https://pve.proxmox.com/wiki/HTTPSCertificateConfiguration#Let.27s_Encrypt_using_le.sh |12|[![](https://cdn.rawgit.com/Neilpang/acmetest/master/status/oraclelinux-latest.svg)](https://github.com/Neilpang/letest#here-are-the-latest-status)|Oracle Linux
|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
|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
|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 the build status, check our daily build project: https://github.com/Neilpang/acmetest
https://github.com/Neilpang/letest.git # Supported Mode
#Supported Mode
1. Webroot mode 1. Webroot mode
2. Standalone mode 2. Standalone mode
3. Apache mode 3. Apache mode
4. Dns mode 4. Dns mode
#How to install
1. Install online:
``` # 1. How to install
curl https://raw.githubusercontent.com/Neilpang/le/master/le.sh | INSTALLONLINE=1 bash
### 1. Install online:
Check this project: https://github.com/Neilpang/get.acme.sh
```bash
curl https://get.acme.sh | sh
``` ```
Or: Or:
```
wget -O - https://raw.githubusercontent.com/Neilpang/le/master/le.sh | INSTALLONLINE=1 bash ```bash
wget -O - https://get.acme.sh | sh
``` ```
2. Or, Install from git: ### 2. Or, Install from git:
Clone this project: Clone this project:
```
git clone https://github.com/Neilpang/le.git ```bash
cd le git clone https://github.com/Neilpang/acme.sh.git
./le.sh install cd ./acme.sh
./acme.sh --install
``` ```
You don't have to be root then, although it is recommended. You `don't have to be root` then, although `it is recommended`.
Which does 3 jobs: Advanced Installation: https://github.com/Neilpang/acme.sh/wiki/How-to-install
* create and copy `le.sh` to your home dir: `~/.le`
All the certs will be placed in this folder.
* create alias : `le.sh=~/.le/le.sh` and `le=~/.le/le.sh`.
* create everyday cron job to check and renew the cert if needed.
After install, you must close current terminal and reopen again to make the alias take effect. The installer will perform 3 actions:
1. Create and copy `acme.sh` to your home dir (`$HOME`): `~/.acme.sh/`.
All certs will be placed in this folder.
2. Create alias for: `acme.sh=~/.acme.sh/acme.sh`.
3. Create everyday cron job to check and renew the cert if needed.
Cron entry example:
```bash
0 0 * * * "/home/user/.acme.sh"/acme.sh --cron --home "/home/user/.acme.sh" > /dev/null
```
After the installation, you must close current terminal and reopen again to make the alias take effect.
Ok, you are ready to issue cert now. Ok, you are ready to issue cert now.
Show help message: Show help message:
```
root@v1:~# le.sh
https://github.com/Neilpang/le
v1.2.2
Usage: le.sh [command] ...[args]....
Available commands:
install:
Install le.sh to your system.
issue:
Issue a cert.
installcert:
Install the issued cert to apache/nginx or any other server.
renew:
Renew a cert.
renewAll:
Renew all the certs.
uninstall:
Uninstall le.sh, and uninstall the cron job.
version:
Show version info.
installcronjob:
Install the cron job to renew certs, you don't need to call this. The 'install' command can automatically install the cron job.
uninstallcronjob:
Uninstall the cron job. The 'uninstall' command can do this automatically.
toPkcs:
Export the certificate and key to a pfx file.
createAccountKey:
Create an account private key, professional use.
createDomainKey:
Create an domain private key, professional use.
createCSR:
Create CSR , professional use.
root@v1:~/le# le issue
Usage: le issue webroot|no|apache|dns a.com [www.a.com,b.com,c.com]|no [key-length]|no
``` ```
Set the param value to "no" means you want to ignore it. root@v1:~# acme.sh -h
For example, if you give "no" to "key-length", it will use default length 2048.
And if you give 'no' to 'cert-file-path', it will not copy the issued cert to the "cert-file-path".
In all the cases, the issued cert will be placed in "~/.le/domain.com/"
```
# Just issue a cert: # 2. Just issue a cert:
Example 1:
Only one domain: **Example 1:** Single domain.
```
le issue /home/wwwroot/aa.com aa.com ```bash
acme.sh --issue -d example.com -w /home/wwwroot/example.com
``` ```
Example 2: **Example 2:** Multiple domains in the same cert.
Multiple domains in the same cert:
``` ```bash
le issue /home/wwwroot/aa.com aa.com www.aa.com,cp.aa.com acme.sh --issue -d example.com -d www.example.com -d cp.example.com -w /home/wwwroot/example.com
``` ```
First argument `/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.
Third argument is the additional domain list you want to use. Comma separated list, which is Optional. You must point and bind all the domains to the same webroot dir: `/home/wwwroot/example.com`.
You must point and bind all the domains to the same webroot dir:`/home/wwwroot/aa.com` Generate/issued certs will be placed in `~/.acme.sh/example.com/`
The cert will be placed in `~/.le/aa.com/` The issued cert will be renewed every **60** days automatically.
The issued cert will be renewed every 80 days automatically. 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.
le installcert aa.com /path/to/certfile/in/apache/nginx /path/to/keyfile/in/apache/nginx /path/to/ca/certfile/apache/nginx "service apache2|nginx reload"
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
acme.sh --installcert -d example.com \
--certpath /path/to/certfile/in/apache/nginx \
--keypath /path/to/keyfile/in/apache/nginx \
--capath /path/to/ca/certfile/apache/nginx \
--fullchainpath path/to/fullchain/certfile/apache/nginx \
--reloadcmd "service apache2|nginx reload"
``` ```
Install the issued cert/key to the production apache or nginx path. Only the domain is required, all the other parameters are optional.
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` Install/copy the issued cert/key to the production apache or nginx path.
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 (requires you be root/sudoer, or you have permission to listen tcp 80 port): # 4. Use Standalone server to issue cert
Same usage as all above, just give `no` as the webroot.
The tcp `80` port must be free to listen, otherwise you will be prompted to free the `80` port and try again.
``` **(requires you be root/sudoer, or you have permission to listen tcp 80 port)**
le issue no aa.com www.aa.com,cp.aa.com
The tcp `80` port **MUST** be free to listen, otherwise you will be prompted to free the `80` port and try again.
```bash
acme.sh --issue --standalone -d example.com -d www.example.com -d cp.example.com
``` ```
# Use Apache mode (requires you be root/sudoer, since it is required to interact with apache server): More examples: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert
If you are running a web server, apache or nginx, it is recommended to use the Webroot mode.
Particularly, if you are running an apache server, you can use apache mode instead. Which doesn't write any file to your web root folder.
Just set string "apache" to the first argument, it will use apache plugin automatically. # 5. Use Standalone tls server to issue cert
``` **(requires you be root/sudoer, or you have permission to listen tcp 443 port)**
le issue apache aa.com www.aa.com,user.aa.com
```
All the other arguments are the same with previous.
acme.sh supports `tls-sni-01` validation.
# Use DNS mode: The tcp `443` port **MUST** be free to listen, otherwise you will be prompted to free the `443` port and try again.
Support the latest dns-01 challenge.
``` ```bash
le issue dns aa.com www.aa.com,user.aa.com acme.sh --issue --tls -d example.com -d www.example.com -d cp.example.com
``` ```
You will get the output like bellow: More examples: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert
# 6. Use Apache mode
**(requires you be root/sudoer, since it is required to interact with apache server)**
If you are running a web server, apache or nginx, it is recommended to use the `Webroot mode`.
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.
Just set string "apache" as the second argument, it will force use of apache plugin automatically.
```
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
# 7. Use DNS mode:
Support the `dns-01` challenge.
```bash
acme.sh --issue --dns -d example.com -d www.example.com -d user.example.com
```
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.
Then just retry with 'renew' command:
``` ```
le renew aa.com
Then just rerun with `renew` argument:
```bash
acme.sh --renew -d example.com
``` ```
Ok, it's finished. Ok, it's finished.
# 8. Automatic DNS API integration
#Automatic dns api integeration 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 certs. You don't have do anything manually!
You don't have do anything manually.
###Currently we support: ### Currently acme.sh supports:
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/le/issues/65 4. Godaddy.com 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.)
More apis are coming soon.... ##### More APIs are coming soon...
If your dns provider is not in the supported list above, you can write your own script api easily. 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.
For more details: [How to use dns api](dnsapi) For more details: [How to use dns api](dnsapi)
# 9. Issue ECC certificate:
`Let's Encrypt` now can issue **ECDSA** certificates.
# Issue ECC certificate:
LetsEncrypt now can issue ECDSA certificate.
And we also support it. And we also support it.
Just set the `length` parameter with a prefix `ec-`. Just set the `length` parameter with a prefix `ec-`.
For example: For example:
Single domain: ### Single domain ECC cerfiticate:
```
le issue /home/wwwroot/aa.com aa.com no ec-256 ```bash
acme.sh --issue -w /home/wwwroot/example.com -d example.com --keylength ec-256
``` ```
SAN multiple domains: SAN multi domain ECC certificate:
```
le issue /home/wwwroot/aa.com aa.com www.aa.com,cp.aa.com ec-256 ```bash
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.
Valid values are: Valid values are:
1. ec-256 (prime256v1, "ECDSA P-256") 1. **ec-256 (prime256v1, "ECDSA P-256")**
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 letsencrypt yet.) 3. **ec-521 (secp521r1, "ECDSA P-521", which is not supported by Let's Encrypt yet.)**
# 10. How to renew the cert
#Under the Hood No, you don't need to renew the certs manually. All the certs will be renewed automatically every **60** days.
Speak ACME language with bash directly to Let's encrypt. 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
Speak ACME language using shell, directly to "Let's Encrypt".
TODO: TODO:
# Acknowledgment
#Acknowledgment
1. Acme-tiny: https://github.com/diafygi/acme-tiny 1. Acme-tiny: https://github.com/diafygi/acme-tiny
2. ACME protocol: https://github.com/ietf-wg-acme/acme 2. ACME protocol: https://github.com/ietf-wg-acme/acme
3. letsencrypt: https://github.com/letsencrypt/letsencrypt 3. Certbot: https://github.com/certbot/certbot
# License & Others
#License & Other
License is GPLv3 License is GPLv3
Please Star and Fork me. Please Star and Fork me.
Issues and pull requests 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)
Executable
+4105
View File
File diff suppressed because it is too large. Load diff
+63 -10
View File
@@ -15,10 +15,10 @@ export CF_Email="xxxx@sss.com"
Ok, let's issue cert now: Ok, let's issue cert now:
``` ```
le.sh issue dns-cf aa.com 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 `~/.le/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,10 +37,10 @@ export DP_Key="sADDsdasdgdsf"
Ok, let's issue cert now: Ok, let's issue cert now:
``` ```
le.sh issue dns-dp aa.com 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 `~/.le/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.
## Use Cloudxns.com domain api to automatically issue cert ## Use Cloudxns.com domain api to automatically issue cert
@@ -58,12 +58,63 @@ export CX_Secret="sADDsdasdgdsf"
Ok, let's issue cert now: Ok, let's issue cert now:
``` ```
le.sh issue dns-cx aa.com 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 `~/.le/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
@@ -71,16 +122,18 @@ 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 `~/.le/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 le.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:
``` ```
le.sh issue dns-myapi aa.com 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
https://github.com/Neilpang/acme.sh/wiki/How-to-use-lexicon-dns-api
-61
View File
@@ -1,61 +0,0 @@
#!/bin/bash
#Here is a sample custom api script.
#This file name is "dns-myapi.sh"
#So, here must be a method dns-myapi-add()
#Which will be called by le.sh to add the txt record to your api system.
#returns 0 meanst success, otherwise error.
######## Public functions #####################
#Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns-myapi-add() {
fulldomain=$1
txtvalue=$2
_err "Not implemented!"
return 1;
}
#################### Private functions bellow ##################################
_debug() {
if [ -z "$DEBUG" ] ; then
return
fi
if [ -z "$2" ] ; then
echo $1
else
echo "$1"="$2"
fi
}
_info() {
if [ -z "$2" ] ; then
echo "$1"
else
echo "$1"="$2"
fi
}
_err() {
if [ -z "$2" ] ; then
echo "$1" >&2
else
echo "$1"="$2" >&2
fi
}
+26 -52
View File
@@ -1,4 +1,4 @@
#!/bin/bash #!/usr/bin/env sh
# #
@@ -7,12 +7,12 @@
#CF_Email="xxxx@sss.com" #CF_Email="xxxx@sss.com"
CF_Api="https://api.cloudflare.com/client/v4/" CF_Api="https://api.cloudflare.com/client/v4"
######## Public functions ##################### ######## Public functions #####################
#Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs" #Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns-cf-add() { dns_cf_add(){
fulldomain=$1 fulldomain=$1
txtvalue=$2 txtvalue=$2
@@ -36,19 +36,19 @@ dns-cf-add() {
_debug _domain "$_domain" _debug _domain "$_domain"
_debug "Getting txt records" _debug "Getting txt records"
_cf_rest GET "/zones/${_domain_id}/dns_records?type=TXT&name=$fulldomain" _cf_rest GET "zones/${_domain_id}/dns_records?type=TXT&name=$fulldomain"
if [ "$?" != "0" ] || ! printf $response | grep \"success\":true > /dev/null ; then if ! printf "$response" | grep \"success\":true > /dev/null ; then
_err "Error" _err "Error"
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"
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,11 +61,11 @@ 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 \") 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\"}"
if [ "$?" == "0" ]; then if [ "$?" = "0" ]; then
_info "Updated, sleeping 10 seconds" _info "Updated, sleeping 10 seconds"
sleep 10 sleep 10
#todo: check if the record takes effect #todo: check if the record takes effect
@@ -102,8 +102,8 @@ _get_root() {
return 1 return 1
fi fi
if printf $response | grep \"name\":\"$h\" ; 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
@@ -112,60 +112,34 @@ _get_root() {
return 1 return 1
fi fi
p=$i p=$i
let "i+=1" i=$(expr $i + 1)
done done
return 1 return 1
} }
_cf_rest() { _cf_rest() {
m=$1 m=$1
ep="$2" ep="$2"
data="$3"
_debug $ep _debug $ep
if [ "$3" ] ; then
data="$3" _H1="X-Auth-Email: $CF_Email"
_H2="X-Auth-Key: $CF_Key"
_H3="Content-Type: application/json"
if [ "$data" ] ; then
_debug data "$data" _debug data "$data"
response="$(curl --silent -X $m "$CF_Api/$ep" -H "X-Auth-Email: $CF_Email" -H "X-Auth-Key: $CF_Key" -H "Content-Type: application/json" --data $data)" response="$(_post "$data" "$CF_Api/$ep" "" $m)"
else else
response="$(curl --silent -X $m "$CF_Api/$ep" -H "X-Auth-Email: $CF_Email" -H "X-Auth-Key: $CF_Key" -H "Content-Type: application/json")" response="$(_get "$CF_Api/$ep")"
fi fi
if [ "$?" != "0" ] ; then if [ "$?" != "0" ] ; then
_err "error $ep" _err "error $ep"
return 1 return 1
fi fi
_debug response "$response" _debug2 response "$response"
return 0 return 0
} }
_debug() {
if [ -z "$DEBUG" ] ; then
return
fi
if [ -z "$2" ] ; then
echo $1
else
echo "$1"="$2"
fi
}
_info() {
if [ -z "$2" ] ; then
echo "$1"
else
echo "$1"="$2"
fi
}
_err() {
if [ -z "$2" ] ; then
echo "$1" >&2
else
echo "$1"="$2" >&2
fi
}
+20 -45
View File
@@ -1,4 +1,4 @@
#!/bin/bash #!/usr/bin/env sh
# Cloudxns.com Domain api # Cloudxns.com Domain api
# #
@@ -14,7 +14,7 @@ CX_Api="https://www.cloudxns.net/api2"
######## Public functions ##################### ######## Public functions #####################
#Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs" #Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns-cx-add() { dns_cx_add() {
fulldomain=$1 fulldomain=$1
txtvalue=$2 txtvalue=$2
@@ -44,13 +44,13 @@ dns-cx-add() {
return 1 return 1
fi fi
if [ "$count" == "0" ] ; then if [ "$count" = "0" ] ; then
add_record $_domain $_sub_domain $txtvalue add_record $_domain $_sub_domain $txtvalue
else else
update_record $_domain $_sub_domain $txtvalue update_record $_domain $_sub_domain $txtvalue
fi fi
if [ "$?" == "0" ] ; then if [ "$?" = "0" ] ; then
return 0 return 0
fi fi
return 1 return 1
@@ -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
@@ -144,10 +144,10 @@ _get_root() {
return 1; return 1;
fi fi
if printf "$response" | grep "$h." ; 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)
@@ -159,7 +159,7 @@ _get_root() {
return 1 return 1
fi fi
p=$i p=$i
let "i+=1" i=$(expr $i + 1)
done done
return 1 return 1
} }
@@ -183,18 +183,23 @@ _rest() {
_debug sec "$sec" _debug sec "$sec"
hmac=$(printf "$sec"| openssl md5 |cut -d " " -f 2) hmac=$(printf "$sec"| openssl md5 |cut -d " " -f 2)
_debug hmac "$hmac" _debug hmac "$hmac"
if [ "$3" ] ; then _H1="API-KEY: $CX_Key"
response="$(curl --silent -X $m "$url" -H "API-KEY: $CX_Key" -H "API-REQUEST-DATE: $cdate" -H "API-HMAC: $hmac" -H 'Content-Type: application/json' -d "$data")" _H2="API-REQUEST-DATE: $cdate"
_H3="API-HMAC: $hmac"
_H4="Content-Type: application/json"
if [ "$data" ] ; then
response="$(_post "$data" "$url" "" $m)"
else else
response="$(curl --silent -X $m "$url" -H "API-KEY: $CX_Key" -H "API-REQUEST-DATE: $cdate" -H "API-HMAC: $hmac" -H 'Content-Type: application/json')" response="$(_get "$url")"
fi fi
if [ "$?" != "0" ] ; then if [ "$?" != "0" ] ; then
_err "error $ep" _err "error $ep"
return 1 return 1
fi fi
_debug response "$response" _debug2 response "$response"
if ! printf "$response" | grep '"message":"success"' > /dev/null ; then if ! printf "$response" | grep '"message":"success"' > /dev/null ; then
return 1 return 1
fi fi
@@ -202,33 +207,3 @@ _rest() {
} }
_debug() {
if [ -z "$DEBUG" ] ; then
return
fi
if [ -z "$2" ] ; then
echo $1
else
echo "$1"="$2"
fi
}
_info() {
if [ -z "$2" ] ; then
echo "$1"
else
echo "$1"="$2"
fi
}
_err() {
if [ -z "$2" ] ; then
echo "$1" >&2
else
echo "$1"="$2" >&2
fi
}
+12 -43
View File
@@ -1,4 +1,4 @@
#!/bin/bash #!/usr/bin/env sh
# Dnspod.cn Domain api # Dnspod.cn Domain api
# #
@@ -14,7 +14,7 @@ DP_Api="https://dnsapi.cn"
######## Public functions ##################### ######## Public functions #####################
#Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs" #Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns-dp-add() { dns_dp_add() {
fulldomain=$1 fulldomain=$1
txtvalue=$2 txtvalue=$2
@@ -44,7 +44,7 @@ dns-dp-add() {
return 1 return 1
fi fi
if [ "$count" == "0" ] ; then if [ "$count" = "0" ] ; then
add_record $_domain $_sub_domain $txtvalue add_record $_domain $_sub_domain $txtvalue
else else
update_record $_domain $_sub_domain $txtvalue update_record $_domain $_sub_domain $txtvalue
@@ -71,7 +71,6 @@ existing_records() {
if printf "$response" | grep "Action completed successful" >/dev/null ; then if printf "$response" | grep "Action completed successful" >/dev/null ; then
count=$(printf "$response" | grep '<type>TXT</type>' | wc -l) count=$(printf "$response" | grep '<type>TXT</type>' | wc -l)
record_id=$(printf "$response" | grep '^<id>' | tail -1 | cut -d '>' -f 2 | cut -d '<' -f 1) record_id=$(printf "$response" | grep '^<id>' | tail -1 | cut -d '>' -f 2 | cut -d '<' -f 1)
return 0 return 0
else else
@@ -152,8 +151,8 @@ _get_root() {
return 1 return 1
fi fi
if printf "$response" | grep "Action completed successful" ; 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)
@@ -165,7 +164,7 @@ _get_root() {
return 1 return 1
fi fi
p=$i p=$i
let "i+=1" i=$(expr $i + 1)
done done
return 1 return 1
} }
@@ -175,55 +174,25 @@ _get_root() {
_rest() { _rest() {
m=$1 m=$1
ep="$2" ep="$2"
data="$3"
_debug $ep _debug $ep
url="$REST_API/$ep" url="$REST_API/$ep"
_debug url "$url" _debug url "$url"
if [ "$3" ] ; then if [ "$data" ] ; then
data="$3" _debug2 data "$data"
_debug data "$data" response="$(_post $data "$url")"
response="$(curl --silent -X $m "$url" -d $data)"
else else
response="$(curl --silent -X $m "$url" )" response="$(_get "$url")"
fi fi
if [ "$?" != "0" ] ; then if [ "$?" != "0" ] ; then
_err "error $ep" _err "error $ep"
return 1 return 1
fi fi
_debug response "$response" _debug2 response "$response"
return 0 return 0
} }
_debug() {
if [ -z "$DEBUG" ] ; then
return
fi
if [ -z "$2" ] ; then
echo $1
else
echo "$1"="$2"
fi
}
_info() {
if [ -z "$2" ] ; then
echo "$1"
else
echo "$1"="$2"
fi
}
_err() {
if [ -z "$2" ] ; then
echo "$1" >&2
else
echo "$1"="$2" >&2
fi
}
+118
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
}
+69
View File
@@ -0,0 +1,69 @@
#!/usr/bin/env sh
# dns api wrapper of lexicon for acme.sh
lexicon_url="https://github.com/AnalogJ/lexicon"
lexicon_cmd="lexicon"
wiki="https://github.com/Neilpang/acme.sh/wiki/How-to-use-lexicon-dns-api"
######## Public functions #####################
#Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_lexicon_add() {
fulldomain=$1
txtvalue=$2
domain=$(printf "$fulldomain" | cut -d . -f 2-999)
if ! _exists $lexicon_cmd ; then
_err "Please install $lexicon_cmd first: $wiki"
return 1
fi
if [ -z "$PROVIDER" ] ; then
_err "Please define env PROVIDER first: $wiki"
return 1
fi
_savedomainconf PROVIDER "$PROVIDER"
export PROVIDER
Lx_name=$(echo LEXICON_${PROVIDER}_USERNAME | tr [a-z] [A-Z])
eval Lx_name_v="\$$Lx_name"
_debug "$Lx_name" "$Lx_name_v"
if [ "$Lx_name_v" ] ; then
_saveaccountconf $Lx_name "$Lx_name_v"
export "$Lx_name"
fi
Lx_token=$(echo LEXICON_${PROVIDER}_TOKEN | tr [a-z] [A-Z])
eval Lx_token_v="\$$Lx_token"
_debug "$Lx_token" "$Lx_token_v"
if [ "$Lx_token_v" ] ; then
_saveaccountconf $Lx_token "$Lx_token_v"
export "$Lx_token"
fi
Lx_password=$(echo LEXICON_${PROVIDER}_PASSWORD | tr [a-z] [A-Z])
eval Lx_password_v="\$$Lx_password"
_debug "$Lx_password" "$Lx_password_v"
if [ "$Lx_password_v" ] ; then
_saveaccountconf $Lx_password "$Lx_password_v"
export "$Lx_password"
fi
Lx_domaintoken=$(echo LEXICON_${PROVIDER}_DOMAINTOKEN | tr [a-z] [A-Z])
eval Lx_domaintoken_v="\$$Lx_domaintoken"
_debug "$Lx_domaintoken" "$Lx_domaintoken_v"
if [ "$Lx_domaintoken_v" ] ; then
export "$Lx_domaintoken"
_saveaccountconf $Lx_domaintoken "$Lx_domaintoken_v"
fi
$lexicon_cmd "$PROVIDER" create ${domain} TXT --name="_acme-challenge.${domain}." --content="${txtvalue}"
}
+52
View File
@@ -0,0 +1,52 @@
#!/usr/bin/env sh
#Here is a sample custom api script.
#This file name is "dns_myapi.sh"
#So, here must be a method dns_myapi_add()
#Which will be called by acme.sh to add the txt record to your api system.
#returns 0 means success, otherwise error.
######## Public functions #####################
#Usage: dns_myapi_add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_myapi_add() {
fulldomain=$1
txtvalue=$2
_err "Not implemented!"
return 1;
}
#################### Private functions bellow ##################################
_info() {
if [ -z "$2" ] ; then
echo "[$(date)] $1"
else
echo "[$(date)] $1='$2'"
fi
}
_err() {
_info "$@" >&2
return 1
}
_debug() {
if [ -z "$DEBUG" ] ; then
return
fi
_err "$@"
return 0
}
_debug2() {
if [ "$DEBUG" ] && [ "$DEBUG" -ge "2" ] ; then
_debug "$@"
fi
return
}
+302
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
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
}
-1746
View File
File diff suppressed because it is too large. Load diff
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.