diff --git a/acme.sh b/acme.sh index 72bf0700..87351680 100755 --- a/acme.sh +++ b/acme.sh @@ -1093,6 +1093,27 @@ _idn() { fi } +_dns2ip() { + ripv4='\([0-9]\{1,3\}\.\)\{1,3\}[0-9]\{1,3\}' + # some domain has ip prefix such as 127.0.0.1.16clouds.com + ip_detect="s/DNS:\\($ripv4,\\)/IP:\\1/g;s/DNS:\\($ripv4\\)\$/IP:\\1/g" + + IPV6SEG='[0-9a-fA-F]\{1,4\}' + r0="\\($IPV6SEG:\\)\\{7,7\\}$IPV6SEG" + r1="\\($IPV6SEG:\\)\\{1,7\\}:" + r2="\\($IPV6SEG:\\)\\{1,6\\}:$IPV6SEG" + r3="\\($IPV6SEG:\\)\\{1,5\\}\\(:$IPV6SEG\\)\\{1,2\\}" + r4="\\($IPV6SEG:\\)\\{1,4\\}\\(:$IPV6SEG\\)\\{1,3\\}" + r5="\\($IPV6SEG:\\)\\{1,3\\}\\(:$IPV6SEG\\)\\{1,4\\}" + r6="\\($IPV6SEG:\\)\\{1,2\\}\\(:$IPV6SEG\\)\\{1,5\\}" + r7="$IPV6SEG:\\(:$IPV6SEG\\)\\{1,6\\}" + r8=":\\(:$IPV6SEG\\)\\{1,7\\}" + r9="::" + ip_detect="$ip_detect;s/DNS:\\($r0,\\)/IP:\\1/g;s/DNS:\\($r1,\\)/IP:\\1/g;s/DNS:\\($r2,\\)/IP:\\1/g;s/DNS:\\($r3,\\)/IP:\\1/g;s/DNS:\\($r4,\\)/IP:\\1/g;s/DNS:\\($r5,\\)/IP:\\1/g;s/DNS:\\($r6,\\)/IP:\\1/g;s/DNS:\\($r7,\\)/IP:\\1/g;s/DNS:\\($r8,\\)/IP:\\1/g;s/DNS:\\($r9,\\)/IP:\\1/g" + ip_detect="$ip_detect;s/DNS:\\($r0\\)\$/IP:\\1/g;s/DNS:\\($r1\\)\$/IP:\\1/g;s/DNS:\\($r2\\)\$/IP:\\1/g;s/DNS:\\($r3\\)\$/IP:\\1/g;s/DNS:\\($r4\\)\$/IP:\\1/g;s/DNS:\\($r5\\)\$/IP:\\1/g;s/DNS:\\($r6\\)\$/IP:\\1/g;s/DNS:\\($r7\\)\$/IP:\\1/g;s/DNS:\\($r8\\)\$/IP:\\1/g;s/DNS:\\($r9\\)\$/IP:\\1/g" + sed "$ip_detect" +} + #_createcsr cn san_list keyfile csrfile conf acmeValidationv1 _createcsr() { _debug _createcsr @@ -1112,11 +1133,11 @@ _createcsr() { if [ "$acmeValidationv1" ]; then domainlist="$(_idn "$domainlist")" - printf -- "\nsubjectAltName=DNS:$domainlist" >>"$csrconf" + printf -- "\nsubjectAltName=DNS:$domainlist" | _dns2ip >>"$csrconf" elif [ -z "$domainlist" ] || [ "$domainlist" = "$NO_VALUE" ]; then #single domain _info "Single domain" "$domain" - printf -- "\nsubjectAltName=DNS:$(_idn "$domain")" >>"$csrconf" + printf -- "\nsubjectAltName=DNS:$(_idn "$domain")" | _dns2ip >>"$csrconf" else domainlist="$(_idn "$domainlist")" _debug2 domainlist "$domainlist" @@ -1125,6 +1146,7 @@ _createcsr() { else alt="DNS:$(_idn "$domain"),DNS:$domainlist" fi + alt="$(echo "$alt" | _dns2ip)" #multi _info "Multi domain" "$alt" printf -- "\nsubjectAltName=$alt" >>"$csrconf" @@ -1185,6 +1207,9 @@ _readSubjectAltNamesFromCSR() { _debug _csrsubj "$_csrsubj" _dnsAltnames="$(${ACME_OPENSSL_BIN:-openssl} req -noout -text -in "$_csrfile" | grep "^ *DNS:.*" | tr -d ' \n')" + if [ -z "$_dnsAltnames" ]; then + _dnsAltnames="$(${ACME_OPENSSL_BIN:-openssl} req -noout -text -in "$_csrfile" | grep "^ *IP Address:.*" | tr -d ' \n')" + fi _debug _dnsAltnames "$_dnsAltnames" if _contains "$_dnsAltnames," "DNS:$_csrsubj,"; then @@ -1199,7 +1224,7 @@ _readSubjectAltNamesFromCSR() { _debug "AltNames doesn't contain subject" fi - echo "$_dnsAltnames" | sed "s/DNS://g" + echo "$_dnsAltnames" | sed "s/DNS://g;s/IP \{0,\}Address://g" } #_csrfile