cert.sh 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363
  1. #!/bin/bash
  2. #====FUNCIONES==========
  3. cert_install(){
  4. #apt install socat netcat -y
  5. if [[ ! -e $HOME/.acme.sh/acme.sh ]];then
  6. msg -bar3
  7. msg -ama " Instalando script acme.sh"
  8. curl -s "https://get.acme.sh" | sh &>/dev/null
  9. fi
  10. if [[ ! -z "${mail}" ]]; then
  11. title "LOGEANDO EN Zerossl"
  12. sleep 3
  13. $HOME/.acme.sh/acme.sh --register-account -m ${mail} --server zerossl
  14. $HOME/.acme.sh/acme.sh --set-default-ca --server zerossl
  15. enter
  16. else
  17. title "APLICANDO SERVIDOR letsencrypt"
  18. sleep 3
  19. $HOME/.acme.sh/acme.sh --set-default-ca --server letsencrypt
  20. enter
  21. fi
  22. title "GENERANDO CERTIFICADO SSL"
  23. sleep 3
  24. if "$HOME"/.acme.sh/acme.sh --issue -d "${domain}" --standalone -k ec-256 --force; then
  25. "$HOME"/.acme.sh/acme.sh --installcert -d "${domain}" --fullchainpath ${ADM_crt}/${domain}.crt --keypath ${ADM_crt}/${domain}.key --ecc --force &>/dev/null
  26. rm -rf $HOME/.acme.sh/${domain}_ecc
  27. msg -bar
  28. print_center -verd "Certificado SSL se genero con éxito"
  29. enter
  30. return 1
  31. else
  32. rm -rf "$HOME/.acme.sh/${domain}_ecc"
  33. msg -bar
  34. print_center -verm2 "Error al generar el certificado SSL"
  35. msg -bar
  36. msg -ama " verifique los posibles error"
  37. msg -ama " e intente de nuevo"
  38. enter
  39. return 1
  40. fi
  41. }
  42. ext_cert(){
  43. unset cert
  44. declare -A cert
  45. title "INTALADOR DE CERTIFICADO EXTERNO"
  46. print_center -azu "Requiere tener a mano su certificado ssl"
  47. print_center -azu "junto a su correspondiente clave privada"
  48. msg -bar
  49. msg -ne " Continuar...[S/N]: "
  50. read opcion
  51. [[ $opcion != @(S|s|Y|y) ]] && return 1
  52. title "INGRESE EL CONTENIDO DE SU CERTIFICADO SSL"
  53. msg -ama ' a continuacion se abrira el editor de texto nano
  54. ingrese el contenido de su certificado
  55. guardar precionando "CTRL+x"
  56. luego "S o Y" segun el idioma
  57. y por ultimo "enter"'
  58. msg -bar
  59. msg -ne " Continuar...[S/N]: "
  60. read opcion
  61. [[ $opcion != @(S|s|Y|y) ]] && return 1
  62. rm -rf ${ADM_tmp}/tmp.crt
  63. clear
  64. nano ${ADM_tmp}/tmp.crt
  65. title "INGRESE EL CONTENIDO DE CLAVE PRIVADA"
  66. msg -ama ' a continuacion se abrira el editor de texto nano
  67. ingrese el contenido de su clave privada.
  68. guardar precionando "CTRL+x"
  69. luego "S o Y" segun el idioma
  70. y por ultimo "enter"'
  71. msg -bar
  72. msg -ne " Continuar...[S/N]: "
  73. read opcion
  74. [[ $opcion != @(S|s|Y|y) ]] && return 1
  75. ${ADM_tmp}/tmp.key
  76. clear
  77. nano ${ADM_tmp}/tmp.key
  78. if openssl x509 -in ${ADM_tmp}/tmp.crt -text -noout &>/dev/null ; then
  79. DNS=$(openssl x509 -in ${ADM_tmp}/tmp.crt -text -noout | grep 'DNS:'|sed 's/, /\n/g'|sed 's/DNS:\| //g')
  80. rm -rf ${ADM_crt}/*
  81. if [[ $(echo "$DNS"|wc -l) -gt "1" ]]; then
  82. DNS="multi-domain"
  83. fi
  84. mv ${ADM_tmp}/tmp.crt ${ADM_crt}/$DNS.crt
  85. mv ${ADM_tmp}/tmp.key ${ADM_crt}/$DNS.key
  86. title "INSTALACION COMPLETA"
  87. echo -e "$(msg -verm2 "Domi: ")$(msg -ama "$DNS")"
  88. echo -e "$(msg -verm2 "Emit: ")$(msg -ama "$(openssl x509 -noout -in ${ADM_crt}/$DNS.crt -startdate|sed 's/notBefore=//g')")"
  89. echo -e "$(msg -verm2 "Expi: ")$(msg -ama "$(openssl x509 -noout -in ${ADM_crt}/$DNS.crt -enddate|sed 's/notAfter=//g')")"
  90. echo -e "$(msg -verm2 "Cert: ")$(msg -ama "$(openssl x509 -noout -in ${ADM_crt}/$DNS.crt -issuer|sed 's/issuer=//g'|sed 's/ = /=/g'|sed 's/, /\n /g')")"
  91. msg -bar
  92. echo "$DNS" > ${ADM_src}/dominio.txt
  93. read foo
  94. else
  95. rm -rf ${ADM_tmp}/tmp.crt
  96. rm -rf ${ADM_tmp}/tmp.key
  97. clear
  98. msg -bar
  99. print_center -verm2 "ERROR DE DATOS"
  100. msg -bar
  101. msg -ama " Los datos ingresados no son validos.\n por favor verifique.\n e intente de nuevo!!"
  102. msg -bar
  103. read foo
  104. fi
  105. return 1
  106. }
  107. stop_port(){
  108. msg -bar3
  109. msg -ama " Comprovando puertos..."
  110. ports=('80' '443')
  111. for i in ${ports[@]}; do
  112. if [[ 0 -ne $(lsof -i:$i | grep -i -c "listen") ]]; then
  113. msg -bar3
  114. echo -ne "$(msg -ama " Liberando puerto: $i")"
  115. lsof -i:$i | awk '{print $2}' | grep -v "PID" | xargs kill -9
  116. sleep 2s
  117. if [[ 0 -ne $(lsof -i:$i | grep -i -c "listen") ]];then
  118. tput cuu1 && tput dl1
  119. print_center -verm2 "ERROR AL LIBERAR PURTO $i"
  120. msg -bar3
  121. msg -ama " Puerto $i en uso."
  122. msg -ama " auto-liberacion fallida"
  123. msg -ama " detenga el puerto $i manualmente"
  124. msg -ama " e intentar nuevamente..."
  125. msg -bar
  126. read foo
  127. return 1
  128. fi
  129. fi
  130. done
  131. }
  132. ger_cert(){
  133. clear
  134. case $1 in
  135. 1)title "Generador De Certificado Let's Encrypt";;
  136. 2)title "Generador De Certificado Zerossl";;
  137. esac
  138. print_center -ama "Requiere ingresar un dominio."
  139. print_center -ama "el mismo solo deve resolver DNS, y apuntar"
  140. print_center -ama "a la direccion ip de este servidor."
  141. msg -bar3
  142. print_center -ama "Temporalmente requiere tener"
  143. print_center -ama "los puertos 80 y 443 libres."
  144. if [[ $1 = 2 ]]; then
  145. msg -bar3
  146. print_center -ama "Requiere tener una cuenta Zerossl."
  147. fi
  148. msg -bar
  149. msg -ne " Continuar [S/N]: "
  150. read opcion
  151. [[ $opcion != @(s|S|y|Y) ]] && return 1
  152. if [[ $1 = 2 ]]; then
  153. while [[ -z $mail ]]; do
  154. clear
  155. msg -bar
  156. print_center -ama "ingresa tu correo usado en zerossl"
  157. msg -bar3
  158. msg -ne " >>> "
  159. read mail
  160. done
  161. fi
  162. if [[ -e ${ADM_src}/dominio.txt ]]; then
  163. domain=$(cat ${ADM_src}/dominio.txt)
  164. [[ $domain = "multi-domain" ]] && unset domain
  165. if [[ ! -z $domain ]]; then
  166. clear
  167. msg -bar
  168. print_center -azu "Dominio asociado a esta ip"
  169. msg -bar3
  170. echo -e "$(msg -verm2 " >>> ") $(msg -ama "$domain")"
  171. msg -ne "Continuar, usando este dominio? [S/N]: "
  172. read opcion
  173. tput cuu1 && tput dl1
  174. [[ $opcion != @(S|s|Y|y) ]] && unset domain
  175. fi
  176. fi
  177. while [[ -z $domain ]]; do
  178. clear
  179. msg -bar
  180. print_center -ama "ingresa tu dominio"
  181. msg -bar3
  182. msg -ne " >>> "
  183. read domain
  184. done
  185. msg -bar3
  186. msg -ama " Comprovando direccion IP ..."
  187. local_ip=$(wget -qO- ipv4.icanhazip.com)
  188. domain_ip=$(ping "${domain}" -c 1 | sed '1{s/[^(]*(//;s/).*//;q}')
  189. sleep 3
  190. [[ -z "${domain_ip}" ]] && domain_ip="ip no encontrada"
  191. if [[ $(echo "${local_ip}" | tr '.' '+' | bc) -ne $(echo "${domain_ip}" | tr '.' '+' | bc) ]]; then
  192. clear
  193. msg -bar
  194. print_center -verm2 "ERROR DE DIRECCION IP"
  195. msg -bar
  196. msg -ama " La direccion ip de su dominio\n no coincide con la de su servidor."
  197. msg -bar3
  198. echo -e " $(msg -azu "IP dominio: ")$(msg -verm2 "${domain_ip}")"
  199. echo -e " $(msg -azu "IP servidor: ")$(msg -verm2 "${local_ip}")"
  200. msg -bar3
  201. msg -ama " Verifique su dominio, e intente de nuevo."
  202. msg -bar
  203. read foo
  204. return 1
  205. fi
  206. stop_port
  207. cert_install
  208. echo "$domain" > ${ADM_src}/dominio.txt
  209. return 1
  210. }
  211. gen_domi(){
  212. title "GENERADOR DE SUB-DOMINIOS"
  213. msg -ama " Verificando direccion ip..."
  214. sleep 2
  215. ls_dom=$(curl -s -X GET "$url/$_dns/dns_records?per_page=100" \
  216. -H "Authorization: Bearer $apikey" \
  217. -H "Content-Type: application/json" | jq '.')
  218. num_line=$(echo $ls_dom | jq '.result | length')
  219. ls_domi=$(echo $ls_dom | jq -r '.result[].name')
  220. ls_ip=$(echo $ls_dom | jq -r '.result[].content')
  221. my_ip=$(wget -qO- ipv4.icanhazip.com)
  222. if [[ $(echo "$ls_ip"|grep -w "$my_ip") = "$my_ip" ]];then
  223. for (( i = 0; i < $num_line; i++ )); do
  224. if [[ $(echo "$ls_dom" | jq -r ".result[$i].content"|grep -w "$my_ip") = "$my_ip" ]]; then
  225. domain=$(echo "$ls_dom" | jq -r ".result[$i].name")
  226. echo "$domain" > ${ADM_src}/dominio.txt
  227. break
  228. fi
  229. done
  230. tput cuu1 && tput dl1
  231. print_center -azu "ya existe un sub-dominio asociado a esta IP"
  232. msg -bar
  233. echo -e " $(msg -verm2 "sub-dominio:") $(msg -ama "$domain")"
  234. enter
  235. return 1
  236. fi
  237. if [[ -z $name ]]; then
  238. tput cuu1 && tput dl1
  239. echo -e " $(msg -azu "El dominio principal es:") $(msg -ama "$_domain")\n $(msg -azu "El sub-dominio sera:") $(msg -ama "ejemplo.$_domain")"
  240. msg -bar
  241. while [[ -z "$name" ]]; do
  242. msg -ne " Nombre (ej: vpsfull) >>> "
  243. read name
  244. tput cuu1 && tput dl1
  245. name=$(echo "$name" | tr -d '[[:space:]]')
  246. if [[ -z $name ]]; then
  247. msg -verm2 " ingresar un nombre...!"
  248. unset name
  249. sleep 2
  250. tput cuu1 && tput dl1
  251. continue
  252. elif [[ ! $name =~ $tx_num ]]; then
  253. msg -verm2 " ingresa solo letras y numeros...!"
  254. unset name
  255. sleep 2
  256. tput cuu1 && tput dl1
  257. continue
  258. elif [[ "${#name}" -lt "4" ]]; then
  259. msg -verm2 " nombre demaciado corto!"
  260. sleep 2
  261. tput cuu1 && tput dl1
  262. unset name
  263. continue
  264. else
  265. domain="$name.$_domain"
  266. msg -ama " Verificando disponibiliad..."
  267. sleep 2
  268. tput cuu1 && tput dl1
  269. if [[ $(echo "$ls_domi" | grep "$domain") = "" ]]; then
  270. echo -e " $(msg -verd "[ok]") $(msg -azu "sub-dominio disponible")"
  271. sleep 2
  272. else
  273. echo -e " $(msg -verm2 "[fail]") $(msg -azu "sub-dominio NO disponible")"
  274. unset name
  275. sleep 2
  276. tput cuu1 && tput dl1
  277. continue
  278. fi
  279. fi
  280. done
  281. fi
  282. tput cuu1 && tput dl1
  283. echo -e " $(msg -azu "El sub-dominio sera:") $(msg -verd "$domain")"
  284. msg -bar
  285. msg -ne " Continuar...[S/N]: "
  286. read opcion
  287. [[ $opcion = @(n|N) ]] && return 1
  288. tput cuu1 && tput dl1
  289. print_center -azu "Creando sub-dominio"
  290. sleep 1
  291. var=$(cat <<EOF
  292. {
  293. "type": "A",
  294. "name": "$name",
  295. "content": "$my_ip",
  296. "ttl": 1,
  297. "priority": 10,
  298. "proxied": false
  299. }
  300. EOF
  301. )
  302. chek_domain=$(curl -s -X POST "$url/$_dns/dns_records" \
  303. -H "Authorization: Bearer $apikey" \
  304. -H "Content-Type: application/json" \
  305. -d $(echo $var|jq -c '.')|jq '.')
  306. tput cuu1 && tput dl1
  307. if [[ "$(echo $chek_domain|jq -r '.success')" = "true" ]]; then
  308. echo "$(echo $chek_domain|jq -r '.result.name')" > ${ADM_src}/dominio.txt
  309. print_center -verd "Sub-dominio creado con exito!"
  310. else
  311. echo "" > ${ADM_src}/dominio.txt
  312. print_center -ama "Falla al crear Sub-dominio!"
  313. fi
  314. enter
  315. return 1
  316. }
  317. ger_cert_z(){
  318. echo ""
  319. }
  320. #======MENU======
  321. menu_cert(){
  322. title "SUB-DOMINIO Y CERTIFICADO SSL"
  323. menu_func "GENERAR CERT SSL (Let's Encrypt)" "GENERAR CERT SSL (Zerossl)" "INGRESAR CERT SSL EXTERNO" "GENERAR SUB-DOMINIO"
  324. back
  325. in_opcion "Opcion"
  326. case $opcion in
  327. 1)ger_cert 1;;
  328. 2)ger_cert 2;;
  329. 3)ext_cert;;
  330. 4)gen_domi;;
  331. 0)return 1;;
  332. esac
  333. }
  334. menu_cert