Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
Acme.Sh
Commits
c38ef902
Unverified
Commit
c38ef902
authored
Jul 18, 2018
by
neil
Committed by
GitHub
Jul 18, 2018
Browse files
Merge pull request #1738 from Neilpang/dev
sync
parents
f60dde41
9cecd525
Changes
4
Hide whitespace changes
Inline
Side-by-side
README.md
View file @
c38ef902
...
@@ -33,7 +33,7 @@ Twitter: [@neilpangxa](https://twitter.com/neilpangxa)
...
@@ -33,7 +33,7 @@ Twitter: [@neilpangxa](https://twitter.com/neilpangxa)
-
[
webfaction
](
https://community.webfaction.com/questions/19988/using-letsencrypt
)
-
[
webfaction
](
https://community.webfaction.com/questions/19988/using-letsencrypt
)
-
[
Loadbalancer.org
](
https://www.loadbalancer.org/blog/loadbalancer-org-with-lets-encrypt-quick-and-dirty
)
-
[
Loadbalancer.org
](
https://www.loadbalancer.org/blog/loadbalancer-org-with-lets-encrypt-quick-and-dirty
)
-
[
discourse.org
](
https://meta.discourse.org/t/setting-up-lets-encrypt/40709
)
-
[
discourse.org
](
https://meta.discourse.org/t/setting-up-lets-encrypt/40709
)
-
[
Centminmod
](
http://centminmod.com/letsencrypt-acmetool-https.html
)
-
[
Centminmod
](
http
s
://centminmod.com/letsencrypt-acmetool-https.html
)
-
[
splynx
](
https://forum.splynx.com/t/free-ssl-cert-for-splynx-lets-encrypt/297
)
-
[
splynx
](
https://forum.splynx.com/t/free-ssl-cert-for-splynx-lets-encrypt/297
)
-
[
archlinux
](
https://aur.archlinux.org/packages/acme.sh-git/
)
-
[
archlinux
](
https://aur.archlinux.org/packages/acme.sh-git/
)
-
[
opnsense.org
](
https://github.com/opnsense/plugins/tree/master/security/acme-client/src/opnsense/scripts/OPNsense/AcmeClient
)
-
[
opnsense.org
](
https://github.com/opnsense/plugins/tree/master/security/acme-client/src/opnsense/scripts/OPNsense/AcmeClient
)
...
@@ -320,6 +320,7 @@ You don't have to do anything manually!
...
@@ -320,6 +320,7 @@ You don't have to do anything manually!
1.
Loopia.se API
1.
Loopia.se API
1.
acme-dns (https://github.com/joohoi/acme-dns)
1.
acme-dns (https://github.com/joohoi/acme-dns)
1.
TELE3 (https://www.tele3.cz)
1.
TELE3 (https://www.tele3.cz)
1.
EUSERV.EU (https://www.euserv.eu)
And:
And:
...
...
acme.sh
View file @
c38ef902
...
@@ -1607,7 +1607,7 @@ _inithttp() {
...
@@ -1607,7 +1607,7 @@ _inithttp() {
}
}
# body url [needbase64] [POST|PUT] [ContentType]
# body url [needbase64] [POST|PUT
|DELETE
] [ContentType]
_post
()
{
_post
()
{
body
=
"
$1
"
body
=
"
$1
"
_post_url
=
"
$2
"
_post_url
=
"
$2
"
...
@@ -1897,7 +1897,7 @@ _send_signed_request() {
...
@@ -1897,7 +1897,7 @@ _send_signed_request() {
_debug3 _body
"
$_body
"
_debug3 _body
"
$_body
"
fi
fi
if
_contains
"
$_body
"
"JWS has invalid anti-replay nonce"
;
then
if
_contains
"
$_body
"
"JWS has invalid anti-replay
nonce"
||
_contains
"
$_body
"
"JWS has an invalid anti-replay
nonce"
;
then
_info
"It seems the CA server is busy now, let's wait and retry."
_info
"It seems the CA server is busy now, let's wait and retry."
_sleep 5
_sleep 5
continue
continue
...
...
dnsapi/README.md
View file @
c38ef902
...
@@ -876,6 +876,27 @@ acme.sh --issue --dns dns_tele3 -d example.com -d *.example.com
...
@@ -876,6 +876,27 @@ acme.sh --issue --dns dns_tele3 -d example.com -d *.example.com
```
```
The TELE3_Key and TELE3_Secret will be saved in ~/.acme.sh/account.conf and will be reused when needed.
The TELE3_Key and TELE3_Secret will be saved in ~/.acme.sh/account.conf and will be reused when needed.
## 47. Use Euserv.eu API
First you need to login to your euserv.eu account and activate your API Administration (API Verwaltung).
[
https://support.euserv.com
](
https://support.euserv.com
)
Once you've activate, login to your API Admin Interface and create an API account.
Please specify the scope (active groups: domain) and assign the allowed IPs.
```
export EUSERV_Username="99999.user123"
export EUSERV_Password="Asbe54gHde"
```
Ok, let's issue a cert now: (Be aware to use the
`--insecure`
flag, cause euserv.eu is still using self-signed certificates!)
```
acme.sh --issue --dns dns_euserv -d example.com -d *.example.com --insecure
```
The
`EUSERV_Username`
and
`EUSERV_Password`
will be saved in
`~/.acme.sh/account.conf`
and will be reused when needed.
Please report any issues to https://github.com/initit/acme.sh or to
<github@initit.de>
# Use custom API
# Use custom API
If your API is not supported yet, you can write your own DNS API.
If your API is not supported yet, you can write your own DNS API.
...
@@ -896,4 +917,4 @@ See: https://github.com/Neilpang/acme.sh/wiki/DNS-API-Dev-Guide
...
@@ -896,4 +917,4 @@ See: https://github.com/Neilpang/acme.sh/wiki/DNS-API-Dev-Guide
# 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
\ No newline at end of file
dnsapi/dns_euserv.sh
0 → 100644
View file @
c38ef902
#!/usr/bin/env sh
#This is the euserv.eu api wrapper for acme.sh
#
#Author: Michael Brueckner
#Report Bugs: https://www.github.com/initit/acme.sh or mbr@initit.de
#
#EUSERV_Username="username"
#
#EUSERV_Password="password"
#
# Dependencies:
# -------------
# - none -
EUSERV_Api
=
"https://api.euserv.net"
######## Public functions #####################
#Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
dns_euserv_add
()
{
fulldomain
=
"
$(
echo
"
$1
"
| _lower_case
)
"
txtvalue
=
$2
EUSERV_Username
=
"
${
EUSERV_Username
:-
$(
_readaccountconf_mutable EUSERV_Username
)
}
"
EUSERV_Password
=
"
${
EUSERV_Password
:-
$(
_readaccountconf_mutable EUSERV_Password
)
}
"
if
[
-z
"
$EUSERV_Username
"
]
||
[
-z
"
$EUSERV_Password
"
]
;
then
EUSERV_Username
=
""
EUSERV_Password
=
""
_err
"You don't specify euserv user and password yet."
_err
"Please create your key and try again."
return
1
fi
#save the user and email to the account conf file.
_saveaccountconf_mutable EUSERV_Username
"
$EUSERV_Username
"
_saveaccountconf_mutable EUSERV_Password
"
$EUSERV_Password
"
_debug
"First detect the root zone"
if
!
_get_root
"
$fulldomain
"
;
then
_err
"invalid domain"
return
1
fi
_debug
"_sub_domain"
"
$_sub_domain
"
_debug
"_domain"
"
$_domain
"
_info
"Adding record"
if
!
_euserv_add_record
"
$_domain
"
"
$_sub_domain
"
"
$txtvalue
"
;
then
return
1
fi
}
#fulldomain txtvalue
dns_euserv_rm
()
{
fulldomain
=
"
$(
echo
"
$1
"
| _lower_case
)
"
txtvalue
=
$2
EUSERV_Username
=
"
${
EUSERV_Username
:-
$(
_readaccountconf_mutable EUSERV_Username
)
}
"
EUSERV_Password
=
"
${
EUSERV_Password
:-
$(
_readaccountconf_mutable EUSERV_Password
)
}
"
if
[
-z
"
$EUSERV_Username
"
]
||
[
-z
"
$EUSERV_Password
"
]
;
then
EUSERV_Username
=
""
EUSERV_Password
=
""
_err
"You don't specify euserv user and password yet."
_err
"Please create your key and try again."
return
1
fi
#save the user and email to the account conf file.
_saveaccountconf_mutable EUSERV_Username
"
$EUSERV_Username
"
_saveaccountconf_mutable EUSERV_Password
"
$EUSERV_Password
"
_debug
"First detect the root zone"
if
!
_get_root
"
$fulldomain
"
;
then
_err
"invalid domain"
return
1
fi
_debug
"_sub_domain"
"
$_sub_domain
"
_debug
"_domain"
"
$_domain
"
_debug
"Getting txt records"
xml_content
=
$(
printf
'<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
<methodName>domain.dns_get_active_records</methodName>
<params>
<param>
<value>
<struct>
<member>
<name>login</name>
<value>
<string>%s</string>
</value>
</member>
<member>
<name>password</name>
<value>
<string>%s</string>
</value>
</member>
<member>
<name>domain_id</name>
<value>
<int>%s</int>
</value>
</member>
</struct>
</value>
</param>
</params>
</methodCall>'
"
$EUSERV_Username
"
"
$EUSERV_Password
"
"
$_euserv_domain_id
"
)
export
_H1
=
"Content-Type: text/xml"
response
=
"
$(
_post
"
$xml_content
"
"
$EUSERV_Api
"
""
"POST"
)
"
if
!
_contains
"
$response
"
"<member><name>status</name><value><i4>100</i4></value></member>"
;
then
_err
"Error could not get txt records"
_debug
"xml_content"
"
$xml_content
"
_debug
"response"
"
$response
"
return
1
fi
if
!
echo
"
$response
"
|
grep
'>dns_record_content<.*>'
"
$txtvalue
"
'<'
>
/dev/null
;
then
_info
"Do not need to delete record"
else
# find XML block where txtvalue is in. The record_id is allways prior this line!
_endLine
=
$(
echo
"
$response
"
|
grep
-n
'>dns_record_content<.*>'
"
$txtvalue
"
'<'
|
cut
-d
':'
-f
1
)
# record_id is the last <name> Tag with a number before the row _endLine, identified by </name><value><struct>
_record_id
=
$(
echo
"
$response
"
|
sed
-n
'1,'
"
$_endLine
"
'p'
|
grep
'</name><value><struct>'
| _tail_n 1 |
sed
's/.*<name>\([0-9]*\)<\/name>.*/\1/'
)
_info
"Deleting record"
_euserv_delete_record
"
$_record_id
"
fi
}
#################### Private functions below ##################################
_get_root
()
{
domain
=
$1
_debug
"get root"
# Just to read the domain_orders once
domain
=
$1
i
=
2
p
=
1
if
!
_euserv_get_domain_orders
;
then
return
1
fi
# Get saved response with domain_orders
response
=
"
$_euserv_domain_orders
"
while
true
;
do
h
=
$(
echo
"
$domain
"
|
cut
-d
.
-f
$i
-100
)
_debug h
"
$h
"
if
[
-z
"
$h
"
]
;
then
#not valid
return
1
fi
if
_contains
"
$response
"
"
$h
"
;
then
_sub_domain
=
$(
echo
"
$domain
"
|
cut
-d
.
-f
1-
$p
)
_domain
=
"
$h
"
if
!
_euserv_get_domain_id
"
$_domain
"
;
then
_err
"invalid domain"
return
1
fi
return
0
fi
p
=
$i
i
=
$(
_math
"
$i
"
+ 1
)
done
return
1
}
_euserv_get_domain_orders
()
{
# returns: _euserv_domain_orders
_debug
"get domain_orders"
xml_content
=
$(
printf
'<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
<methodName>domain.get_domain_orders</methodName>
<params>
<param>
<value>
<struct>
<member>
<name>login</name>
<value><string>%s</string></value>
</member>
<member>
<name>password</name>
<value><string>%s</string></value>
</member>
</struct>
</value>
</param>
</params>
</methodCall>'
"
$EUSERV_Username
"
"
$EUSERV_Password
"
)
export
_H1
=
"Content-Type: text/xml"
response
=
"
$(
_post
"
$xml_content
"
"
$EUSERV_Api
"
""
"POST"
)
"
if
!
_contains
"
$response
"
"<member><name>status</name><value><i4>100</i4></value></member>"
;
then
_err
"Error could not get domain orders"
_debug
"xml_content"
"
$xml_content
"
_debug
"response"
"
$response
"
return
1
fi
# save response to reduce API calls
_euserv_domain_orders
=
"
$response
"
return
0
}
_euserv_get_domain_id
()
{
# returns: _euserv_domain_id
domain
=
$1
_debug
"get domain_id"
# find line where the domain name is within the $response
_startLine
=
$(
echo
"
$_euserv_domain_orders
"
|
grep
-n
'>domain_name<.*>'
"
$domain
"
'<'
|
cut
-d
':'
-f
1
)
# next occurency of domain_id after the domain_name is the correct one
_euserv_domain_id
=
$(
echo
"
$_euserv_domain_orders
"
|
sed
-n
"
$_startLine
"
',$p'
|
grep
'>domain_id<'
| _head_n 1 |
sed
's/.*<i4>\([0-9]*\)<\/i4>.*/\1/'
)
if
[
-z
"
$_euserv_domain_id
"
]
;
then
_err
"Could not find domain_id for domain
$domain
"
_debug
"_euserv_domain_orders"
"
$_euserv_domain_orders
"
return
1
fi
return
0
}
_euserv_delete_record
()
{
record_id
=
$1
xml_content
=
$(
printf
'<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
<methodName>domain.dns_delete_record</methodName>
<params>
<param>
<value>
<struct>
<member>
<name>login</name>
<value>
<string>%s</string>
</value>
</member>
<member>
<name>password</name>
<value>
<string>%s</string>
</value>
</member>
<member>
<name>dns_record_id</name>
<value>
<int>%s</int>
</value>
</member>
</struct>
</value>
</param>
</params>
</methodCall>'
"
$EUSERV_Username
"
"
$EUSERV_Password
"
"
$record_id
"
)
export
_H1
=
"Content-Type: text/xml"
response
=
"
$(
_post
"
$xml_content
"
"
$EUSERV_Api
"
""
"POST"
)
"
if
!
_contains
"
$response
"
"<member><name>status</name><value><i4>100</i4></value></member>"
;
then
_err
"Error deleting record"
_debug
"xml_content"
"
$xml_content
"
_debug
"response"
"
$response
"
return
1
fi
return
0
}
_euserv_add_record
()
{
domain
=
$1
sub_domain
=
$2
txtval
=
$3
xml_content
=
$(
printf
'<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
<methodName>domain.dns_create_record</methodName>
<params>
<param>
<value>
<struct>
<member>
<name>login</name>
<value>
<string>%s</string>
</value>
</member>
<member>
<name>password</name>
<value>
<string>%s</string></value>
</member>
<member>
<name>domain_id</name>
<value>
<int>%s</int>
</value>
</member>
<member>
<name>dns_record_subdomain</name>
<value>
<string>%s</string>
</value>
</member>
<member>
<name>dns_record_type</name>
<value>
<string>TXT</string>
</value>
</member>
<member>
<name>dns_record_value</name>
<value>
<string>%s</string>
</value>
</member>
<member>
<name>dns_record_ttl</name>
<value>
<int>300</int>
</value>
</member>
</struct>
</value>
</param>
</params>
</methodCall>'
"
$EUSERV_Username
"
"
$EUSERV_Password
"
"
$_euserv_domain_id
"
"
$sub_domain
"
"
$txtval
"
)
export
_H1
=
"Content-Type: text/xml"
response
=
"
$(
_post
"
$xml_content
"
"
$EUSERV_Api
"
""
"POST"
)
"
if
!
_contains
"
$response
"
"<member><name>status</name><value><i4>100</i4></value></member>"
;
then
_err
"Error could not create record"
_debug
"xml_content"
"
$xml_content
"
_debug
"response"
"
$response
"
return
1
fi
return
0
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment