#!/usr/bin/env sh # Script to deploy a certificate to FortiGate via API and set it as the current web GUI certificate. # # FortiGate's native ACME integration does not support wildcard certificates or domain validation, # and is not supported if you have a custom management web port (eg. DNAT web traffic). # # REQUIRED: # export FGT_HOST="fortigate_hostname-or-ip" # export FGT_TOKEN="fortigate_api_token" # # OPTIONAL: # export FGT_PORT="10443" # Custom HTTPS port (defaults to 443 if not set) # # Run `acme.sh --deploy -d example.com --deploy-hook fortigate --insecure` to use this script. # `--insecure` is required on first run if not already using a valid SSL certificate on firewall. # Function to parse a FortiGate API response _fortigate_parse_response() { _fortigate_response="$1" _fortigate_func="$2" _fortigate_status=$(echo "$_fortigate_response" | _egrep_o '"status":[ ]*"[^"]*"' | cut -d '"' -f 4) if [ "$_fortigate_status" != "success" ]; then _err "[$_fortigate_func] Operation failed. Deploy with --insecure if current certificate is invalid. Try deploying with --debug to troubleshoot." return 1 fi _debug "[$_fortigate_func] Operation successful." return 0 } # Function to deploy a base64-encoded certificate to the firewall _fortigate_deployer() { _fortigate_cert_base64=$(_base64 <"$_fortigate_cfullchain" | tr -d '\n') _fortigate_key_base64=$(_base64 <"$_fortigate_ckey" | tr -d '\n') _fortigate_payload=$( cat <