@ -1,6 +1,6 @@
#!/usr/bin/env sh
VER = 2.4.3
VER = 2.4.4
PROJECT_NAME = "acme.sh"
@ -463,6 +463,60 @@ _signcsr() {
return $_ret
}
#_csrfile
_readSubjectFromCSR( ) {
_csrfile = " $1 "
if [ -z " $_csrfile " ] ; then
_usage "_readSubjectFromCSR mycsr.csr"
return 1
fi
openssl req -noout -in " $_csrfile " -subject | _egrep_o "CN=.*" | cut -d = -f 2 | cut -d / -f 1
}
#_csrfile
#echo comma separated domain list
_readSubjectAltNamesFromCSR( ) {
_csrfile = " $1 "
if [ -z " $_csrfile " ] ; then
_usage "_readSubjectAltNamesFromCSR mycsr.csr"
return 1
fi
_csrsubj = " $( _readSubjectFromCSR " $_csrfile " ) "
_debug _csrsubj " $_csrsubj "
_dnsAltnames = " $( openssl req -noout -text -in " $_csrfile " | grep "^ *DNS:.*" | tr -d ' ' ) "
_debug _dnsAltnames " $_dnsAltnames "
if _contains " $_dnsAltnames , " " DNS: $_csrsubj , " ; then
_debug "AltNames contains subject"
_dnsAltnames = " $( echo " $_dnsAltnames , " | sed " s/DNS: $_csrsubj ,//g " ) "
else
_debug "AltNames doesn't contain subject"
fi
echo " $_dnsAltnames " | sed "s/DNS://g"
}
#_csrfile
_readKeyLengthFromCSR( ) {
_csrfile = " $1 "
if [ -z " $_csrfile " ] ; then
_usage "_readAllDomainListFromCSR mycsr.csr"
return 1
fi
_outcsr = " $( openssl req -noout -text -in " $_csrfile " ) "
if _contains " $_outcsr " "Public Key Algorithm: id-ecPublicKey" ; then
_debug "ECC CSR"
echo " $_outcsr " | _egrep_o "^ *ASN1 OID:.*" | cut -d ':' -f 2 | tr -d ' '
else
_debug "RSA CSR"
echo " $_outcsr " | _egrep_o "^ *Public-Key:.*" | cut -d '(' -f 2 | cut -d ' ' -f 1
fi
}
_ss( ) {
_port = " $1 "
@ -1478,6 +1532,7 @@ _clearupwebbroot() {
}
#webroot, domain domainlist keylength
issue( ) {
if [ -z " $2 " ] ; then
_usage " Usage: $PROJECT_ENTRY --issue -d a.com -w /path/to/webroot/a.com/ "
@ -1631,25 +1686,29 @@ issue() {
Le_Keylength = ""
fi
_key = $( _readdomainconf Le_Keylength)
_debug " Read key length: $_key "
if [ ! -f " $CERT_KEY_PATH " ] || [ " $Le_Keylength " != " $_key " ] ; then
if ! createDomainKey $Le_Domain $Le_Keylength ; then
_err "Create domain key error."
if [ -f " $CSR_PATH " ] && [ ! -f " $CERT_KEY_PATH " ] ; then
_info "Signing from existing CSR."
else
_key = $( _readdomainconf Le_Keylength)
_debug " Read key length: $_key "
if [ ! -f " $CERT_KEY_PATH " ] || [ " $Le_Keylength " != " $_key " ] ; then
if ! createDomainKey $Le_Domain $Le_Keylength ; then
_err "Create domain key error."
_clearup
return 1
fi
fi
if ! _createcsr " $Le_Domain " " $Le_Alt " " $CERT_KEY_PATH " " $CSR_PATH " " $DOMAIN_SSL_CONF " ; then
_err "Create CSR error."
_clearup
return 1
fi
fi
_savedomainconf "Le_Keylength" " $Le_Keylength "
if ! _createcsr " $Le_Domain " " $Le_Alt " " $CERT_KEY_PATH " " $CSR_PATH " " $DOMAIN_SSL_CONF " ; then
_err "Create CSR error."
_clearup
return 1
fi
vlist = " $Le_Vlist "
# verify each domain
_info "Verify each domain"
@ -2169,6 +2228,82 @@ renewAll() {
}
#csr webroot
signcsr( ) {
_csrfile = " $1 "
_csrW = " $2 "
if [ -z " $_csrfile " ] || [ -z " $_csrW " ] ; then
_usage " Usage: $PROJECT_ENTRY --signcsr --csr mycsr.csr -w /path/to/webroot/a.com/ "
return 1
fi
_initpath
_csrsubj = $( _readSubjectFromCSR " $_csrfile " )
if [ " $? " != "0" ] || [ -z " $_csrsubj " ] ; then
_err " Can not read subject from csr: $_csrfile "
return 1
fi
_csrdomainlist = $( _readSubjectAltNamesFromCSR " $_csrfile " )
if [ " $? " != "0" ] ; then
_err " Can not read domain list from csr: $_csrfile "
return 1
fi
_debug "_csrdomainlist" " $_csrdomainlist "
_csrkeylength = $( _readKeyLengthFromCSR " $_csrfile " )
if [ " $? " != "0" ] || [ -z " $_csrkeylength " ] ; then
_err " Can not read key length from csr: $_csrfile "
return 1
fi
_initpath " $_csrsubj " " $_csrkeylength "
mkdir -p " $DOMAIN_PATH "
_info " Copy csr to: $CSR_PATH "
cp " $_csrfile " " $CSR_PATH "
issue " $_csrW " " $_csrsubj " " $_csrdomainlist " " $_csrkeylength "
}
showcsr( ) {
_csrfile = " $1 "
_csrd = " $2 "
if [ -z " $_csrfile " ] && [ -z " $_csrd " ] ; then
_usage " Usage: $PROJECT_ENTRY --showcsr --csr mycsr.csr "
return 1
fi
_initpath
_csrsubj = $( _readSubjectFromCSR " $_csrfile " )
if [ " $? " != "0" ] || [ -z " $_csrsubj " ] ; then
_err " Can not read subject from csr: $_csrfile "
return 1
fi
_info " Subject= $_csrsubj "
_csrdomainlist = $( _readSubjectAltNamesFromCSR " $_csrfile " )
if [ " $? " != "0" ] ; then
_err " Can not read domain list from csr: $_csrfile "
return 1
fi
_debug "_csrdomainlist" " $_csrdomainlist "
_info " SubjectAltNames= $_csrdomainlist "
_csrkeylength = $( _readKeyLengthFromCSR " $_csrfile " )
if [ " $? " != "0" ] || [ -z " $_csrkeylength " ] ; then
_err " Can not read key length from csr: $_csrfile "
return 1
fi
_info " KeyLength= $_csrkeylength "
}
list( ) {
_raw = " $1 "
_initpath
@ -2741,13 +2876,15 @@ Commands:
--version, -v Show version info.
--install Install $PROJECT_NAME to your system.
--uninstall Uninstall $PROJECT_NAME , and uninstall the cron job.
--upgrade Upgrade $PROJECT_NAME to the latest code from $PROJECT
--upgrade Upgrade $PROJECT_NAME to the latest code from $PROJECT .
--issue Issue a cert.
--signcsr Issue a cert from an existing csr.
--installcert Install the issued cert to apache/nginx or any other server.
--renew, -r Renew a cert.
--renewAll Renew all the certs
--renewAll Renew all the certs.
--revoke Revoke a cert.
--list List all the certs
--list List all the certs.
--showcsr Show the content of a csr.
--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.
--cron Run cron job to renew all the certs.
@ -2796,6 +2933,7 @@ Parameters:
--ca-bundle Specifices the path to the CA certificate bundle to verify api server' s certificate.
--nocron Only valid for '--install' command, which means: do not install the default cron job. In this case , the certs will not be renewed automatically.
--ecc Specifies to use the ECC cert. Valid for '--installcert' , '--renew' , '--revoke' , '--toPkcs' and '--createCSR'
--csr Specifies the input csr.
"
}
@ -2871,6 +3009,7 @@ _process() {
_ca_bundle = ""
_nocron = ""
_ecc = ""
_csr = ""
while [ ${# } -gt 0 ] ; do
case " ${ 1 } " in
@ -2894,6 +3033,12 @@ _process() {
--issue)
_CMD = "issue"
; ;
--signcsr)
_CMD = "signcsr"
; ;
--showcsr)
_CMD = "showcsr"
; ;
--installcert| -i)
_CMD = "installcert"
; ;
@ -3122,7 +3267,10 @@ _process() {
--ecc)
_ecc = "isEcc"
; ;
--csr)
_csr = " $2 "
shift
; ;
*)
_err " Unknown parameter : $1 "
return 1
@ -3143,6 +3291,12 @@ _process() {
issue)
issue " $_webroot " " $_domain " " $_altdomains " " $_keylength " " $_certpath " " $_keypath " " $_capath " " $_reloadcmd " " $_fullchainpath "
; ;
signcsr)
signcsr " $_csr " " $_webroot "
; ;
showcsr)
showcsr " $_csr " " $_domain "
; ;
installcert)
installcert " $_domain " " $_certpath " " $_keypath " " $_capath " " $_reloadcmd " " $_fullchainpath " " $_ecc "
; ;