A pure Unix shell script ACME client for SSL / TLS certificate automation
This report summarizes scanner evidence for acmesh-official/acme.sh, a Shell project with 47,805 GitHub stars. SynthScan examined 71,037 lines of code across 329 source files, recording 190 pattern matches distributed across 9 syntactic categories. The legacy adjusted pattern signal is 4.6 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 156 finding(s).
Are imports declared and package/API names verified? 3 finding(s).
Are wrappers, guards, and repeated structures necessary? 31 finding(s).
Which changes need focused human review? 190 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 190 distinct pattern matches across 9 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | deploy/truenas_websocat.sh | 18 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | deploy/truenas_websocat.sh | 20 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | deploy/truenas_websocat.sh | 40 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | deploy/truenas_ws.sh | 15 | # ------------------------------------------------ | COMMENT |
| MEDIUM⚡ | deploy/byteplus_alb.sh | 49 | # ══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM⚡ | deploy/byteplus_alb.sh | 51 | # ══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM⚡ | deploy/byteplus_alb.sh | 56 | # ══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM⚡ | deploy/byteplus_alb.sh | 58 | # ══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM⚡ | deploy/byteplus_alb.sh | 190 | # ── 5. Save new CertificateId for next renewal ─────────────────────────────── | COMMENT |
| MEDIUM⚡ | deploy/byteplus_alb.sh | 198 | # ══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM⚡ | deploy/byteplus_alb.sh | 200 | # ══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM⚡ | deploy/byteplus_alb.sh | 212 | # ══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM⚡ | deploy/byteplus_alb.sh | 214 | # ══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM⚡ | deploy/byteplus_alb.sh | 224 | # ══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM⚡ | deploy/byteplus_alb.sh | 226 | # ══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | deploy/byteplus_alb.sh | 12 | # ┌─────────────────────────────────────────────────────────────────────┐ | COMMENT |
| MEDIUM | deploy/byteplus_alb.sh | 23 | # └─────────────────────────────────────────────────────────────────────┘ | COMMENT |
| MEDIUM | deploy/byteplus_alb.sh | 73 | # ── 1. Load & validate credentials ────────────────────────────────────────── | COMMENT |
| MEDIUM | deploy/byteplus_alb.sh | 138 | # ── 2. Build certificate name ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | deploy/byteplus_alb.sh | 163 | # ── 3. Read cert and key ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | deploy/byteplus_alb.sh | 174 | # ── 4. Deploy: first-time upload or renewal replace ───────────────────────── | COMMENT |
| MEDIUM | deploy/byteplus_alb.sh | 254 | # ══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | deploy/byteplus_alb.sh | 256 | # ══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | deploy/byteplus_alb.sh | 274 | # ══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | deploy/byteplus_alb.sh | 276 | # ══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | deploy/byteplus_alb.sh | 388 | # ══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | deploy/byteplus_alb.sh | 390 | # ══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | dnsapi/dns_inwx.sh | 13 | # ------------- | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | acme.sh | 2541 | #Is this status the CA's front end failing rather than its ACME | COMMENT |
| LOW | acme.sh | 2561 | #was serving that morning. Waiting is the answer, not abandoning an order | COMMENT |
| LOW | acme.sh | 6441 | COMMENT | |
| LOW | acme.sh | 6581 | . "$DOMAIN_CONF" | COMMENT |
| LOW | notify/smtp.sh | 1 | #!/usr/bin/env sh | COMMENT |
| LOW | notify/bark.sh | 1 | #!/usr/bin/env sh | COMMENT |
| LOW | notify/dingtalk.sh | 41 | # DINGTALK_SIGNING_KEY="" | COMMENT |
| LOW | notify/aws_ses.sh | 1 | #!/usr/bin/env sh | COMMENT |
| LOW | deploy/jetkvm.sh | 1 | #!/usr/bin/env sh | COMMENT |
| LOW | deploy/jetkvm.sh | 21 | # JetKVM's "Custom" TLS mode (device web UI: Settings > Network > HTTPS | COMMENT |
| LOW | deploy/jetkvm.sh | 41 | # | COMMENT |
| LOW | deploy/jetkvm.sh | 61 | # The following variables exported from environment will be used. If not | COMMENT |
| LOW | deploy/jetkvm.sh | 221 | return 0 | COMMENT |
| LOW | deploy/vault.sh | 1 | #!/usr/bin/env sh | COMMENT |
| LOW | deploy/directadmin.sh | 1 | #!/usr/bin/env sh | COMMENT |
| LOW | deploy/edgio.sh | 1 | #!/usr/bin/env sh | COMMENT |
| LOW | deploy/unifios.sh | 1 | #!/usr/bin/env sh | COMMENT |
| LOW | deploy/unifios.sh | 21 | # The API is served on the management port, which differs per install: | COMMENT |
| LOW | deploy/unifios.sh | 41 | # Auth: POST /api/auth/login returns a `TOKEN` cookie containing a JWT whose | COMMENT |
| LOW | deploy/unifios.sh | 61 | # the new certificate before it removes any old entries. If a failure | COMMENT |
| LOW | deploy/unifios.sh | 101 | # _normalizeJson collapses the response to one line. This removes extra | COMMENT |
| LOW | deploy/unifios.sh | 201 | if [ -z "$_uos_csrf" ]; then | COMMENT |
| LOW | deploy/unifios.sh | 241 | _create_code="$(_uos_response_code)" | COMMENT |
| LOW | deploy/haproxy.sh | 1 | #!/usr/bin/env sh | COMMENT |
| LOW | deploy/haproxy.sh | 21 | # It is strongly recommended to set this something that makes sense | COMMENT |
| LOW | deploy/haproxy.sh | 41 | # | COMMENT |
| LOW | deploy/consul.sh | 1 | #!/usr/bin/env sh | COMMENT |
| LOW | deploy/vault_cli.sh | 1 | #!/usr/bin/env sh | COMMENT |
| LOW | deploy/multideploy.sh | 1 | #!/usr/bin/env sh | COMMENT |
| LOW | deploy/multideploy.sh | 21 | # Dependencies: | COMMENT |
| LOW | deploy/multideploy.sh | 201 | # Description: | COMMENT |
| LOW | deploy/localcopy.sh | 1 | #!/usr/bin/env sh | COMMENT |
| LOW | deploy/cpanel_uapi.sh | 1 | #!/usr/bin/env sh | COMMENT |
| LOW | deploy/netlify.sh | 1 | #!/usr/bin/env sh | COMMENT |
| LOW | deploy/keyhelp.sh | 1 | #!/usr/bin/env sh | COMMENT |
| LOW | deploy/lighttpd.sh | 1 | #!/usr/bin/env sh | COMMENT |
| LOW | deploy/lighttpd.sh | 21 | # It is strongly recommended to set this something that makes sense | COMMENT |
| LOW | deploy/unifi.sh | 1 | #!/usr/bin/env sh | COMMENT |
| LOW | deploy/unifi.sh | 21 | # The deploy-hook automatically detects standard Unifi installations | COMMENT |
| LOW | deploy/unifi.sh | 41 | # (same setting as above, default is updated when running on Cloud Key Gen1): | COMMENT |
| LOW | deploy/windows_rdp.sh | 1 | #!/usr/bin/env sh | COMMENT |
| LOW | deploy/windows_rdp.sh | 101 | cat <<PSEOF | COMMENT |
| LOW | deploy/ssh.sh | 1 | #!/usr/bin/env sh | COMMENT |
| LOW | deploy/ssh.sh | 21 | # export DEPLOY_SSH_FULLCHAIN="" | COMMENT |
| LOW | deploy/panos.sh | 1 | #!/usr/bin/env sh | COMMENT |
| LOW | deploy/truenas_websocat.sh | 1 | #!/usr/bin/env sh | COMMENT |
| LOW | deploy/truenas_websocat.sh | 21 | # | COMMENT |
| LOW | deploy/truenas_websocat.sh | 41 | COMMENT | |
| LOW | deploy/zyxel_gs1900.sh | 1 | #!/usr/bin/env sh | COMMENT |
| LOW | deploy/zyxel_gs1900.sh | 21 | # Current GS1900 Switch Compatibility: | COMMENT |
| LOW | deploy/zyxel_gs1900.sh | 41 | # | COMMENT |
| LOW | deploy/mydevil.sh | 1 | #!/usr/bin/env sh | COMMENT |
| LOW | deploy/baidu_cdn.sh | 1 | #!/usr/bin/env sh | COMMENT |
| LOW | deploy/truenas_ws.sh | 1 | #!/usr/bin/env sh | COMMENT |
| LOW | deploy/truenas_ws.sh | 21 | # export DEPLOY_TRUENAS_HOSTNAME="<TRUENAS_HOSTNAME_OR_IP>" | COMMENT |
| LOW | deploy/truenas_ws.sh | 101 | # 0: true | COMMENT |
| LOW | deploy/truenas_ws.sh | 141 | done | COMMENT |
| LOW | deploy/synology_dsm.sh | 1 | #!/usr/bin/env sh | COMMENT |
| LOW | deploy/synology_dsm.sh | 21 | # - export SYNO_HOSTNAME="localhost" - defaults to "localhost" | COMMENT |
| LOW | deploy/fortigate.sh | 1 | #!/usr/bin/env sh | COMMENT |
| 36 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | deploy/kemplm.sh | 55 | # Check if certificate is already installed | COMMENT |
| LOW | deploy/haproxy.sh | 259 | # Check if issuer cert is also a root CA cert | COMMENT |
| LOW⚡ | deploy/multideploy.sh | 87 | # Check if yq is installed | COMMENT |
| LOW⚡ | deploy/multideploy.sh | 94 | # Check if deploy file exists | COMMENT |
| LOW | deploy/multideploy.sh | 158 | # Check if extracted services exist in services list | COMMENT |
| LOW | deploy/multideploy.sh | 161 | # Check if service exists | COMMENT |
| LOW | deploy/kong.sh | 61 | #Check if sslcreated (if not => POST else => PATCH) | COMMENT |
| LOW | deploy/lighttpd.sh | 207 | # Check if issuer cert is also a root CA cert | COMMENT |
| LOW | deploy/truenas.sh | 219 | # Check if the app use the same certificate TrueNAS web UI | COMMENT |
| LOW⚡ | deploy/byteplus_alb.sh | 185 | # Check if deploy step set _new_cert_id | COMMENT |
| LOW | dnsapi/dns_sotoon.sh | 63 | # Check if there are existing TXT records for this subdomain | COMMENT |
| LOW | dnsapi/dns_sotoon.sh | 78 | # Check if this exact TXT value already exists (avoid duplicates) | COMMENT |
| LOW | dnsapi/dns_sotoon.sh | 143 | # Check if there are existing TXT records for this subdomain | COMMENT |
| LOW | dnsapi/dns_sotoon.sh | 211 | # Check if the response contains our domain | COMMENT |
| LOW | dnsapi/dns_sotoon.sh | 225 | # Check if the hyphenated name exists in the response | COMMENT |
| LOW | dnsapi/dns_sotoon.sh | 229 | # Check if the origin itself is used as name | COMMENT |
| LOW | dnsapi/dns_infoblox_uddi.sh | 63 | # Check if record already exists | COMMENT |
| LOW | dnsapi/dns_infoblox_uddi.sh | 178 | # Check if response contains results (even if empty) | COMMENT |
| LOW | dnsapi/dns_bunny.sh | 22 | # Check if API Key is set | COMMENT |
| LOW | dnsapi/dns_bunny.sh | 79 | # Check if API Key Exists | COMMENT |
| LOW | dnsapi/dns_subreg.sh | 116 | # Check if the current $response contains a successful status in the ns2:Map format: | COMMENT |
| LOW | dnsapi/dns_cyon.sh | 229 | # Check if we got an error response (JSON) instead of HTML | COMMENT |
| LOW | dnsapi/dns_dgon.sh | 21 | # Check if API Key Exists | COMMENT |
| LOW | dnsapi/dns_dgon.sh | 76 | # Check if API Key Exists | COMMENT |
| LOW | dnsapi/dns_one.sh | 33 | #Check if the TXT exists | COMMENT |
| LOW | dnsapi/dns_one.sh | 71 | #Check if the TXT exists | COMMENT |
| LOW | dnsapi/dns_huaweicloud.sh | 162 | # Check if retry count is reached | COMMENT |
| LOW | dnsapi/dns_huaweicloud.sh | 247 | # Check if record exist | COMMENT |
| LOW | dnsapi/dns_mgwm.sh | 76 | # Check if credentials are set | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | acme.sh | 8234 | # Create the custom cert home now instead of on first issuance, so the | COMMENT |
| MEDIUM | deploy/haproxy.sh | 196 | # Create a temporary PEM file | COMMENT |
| MEDIUM | deploy/lighttpd.sh | 144 | # Create a temporary PEM file | COMMENT |
| MEDIUM | deploy/panos.sh | 27 | # This function is to parse the XML response from the firewall | COMMENT |
| MEDIUM | deploy/panos.sh | 58 | #This function is used to deploy to the firewall | COMMENT |
| MEDIUM | dnsapi/dns_bunny.sh | 14 | ## Create the text record for validation. | COMMENT |
| MEDIUM | dnsapi/dns_bhosted.sh | 349 | # Create a unique config key for cached record ids | COMMENT |
| MEDIUM | dnsapi/dns_dgon.sh | 13 | ## Create the text record for validation. | COMMENT |
| MEDIUM | dnsapi/dns_ali.sh | 13 | # This file is referenced by Alibaba Cloud Services deploy hooks | COMMENT |
| MEDIUM | dnsapi/dns_online.sh | 159 | # Creating a dummy record in this temporary version, because online.net doesn't accept enabling an empty version | COMMENT |
| MEDIUM | dnsapi/dns_mgwm.sh | 16 | # This function is called by acme.sh to add a TXT record. | COMMENT |
| MEDIUM | dnsapi/dns_mgwm.sh | 36 | # This function is called by acme.sh to remove a TXT record after validation. | COMMENT |
| MEDIUM | dnsapi/dns_mgwm.sh | 87 | # Create the Basic Auth Header. acme.sh's _base64 function is used for encoding. | COMMENT |
| MEDIUM | dnsapi/dns_hw.sh | 38 | # Create a TXT record set: https://support.huaweicloud.com/api-dns/dns_api_64001.html | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | deploy/multideploy.sh | 84 | # Usage: | COMMENT |
| LOW | deploy/multideploy.sh | 132 | # Usage: | COMMENT |
| LOW | deploy/multideploy.sh | 186 | # Usage: | COMMENT |
| LOW | deploy/multideploy.sh | 214 | # Usage: | COMMENT |
| LOW | deploy/multideploy.sh | 234 | # Usage: | COMMENT |
| LOW | deploy/multideploy.sh | 276 | # Usage: | COMMENT |
| LOW | deploy/zyxel_gs1900.sh | 37 | # Usage: | COMMENT |
| LOW | deploy/truenas_ws.sh | 30 | # Usage: | COMMENT |
| LOW | deploy/truenas_ws.sh | 92 | # Usage: | COMMENT |
| LOW | deploy/truenas_ws.sh | 113 | # Usage: | COMMENT |
| LOW | dnsapi/dns_bookmyname.sh | 25 | # Usage: | COMMENT |
| LOW | dnsapi/dns_eurodns.sh | 20 | # Usage: | COMMENT |
| LOW | dnsapi/dns_glesys.sh | 20 | # Usage: | COMMENT |
| LOW | dnsapi/dns_glesys.sh | 71 | # Usage: | COMMENT |
| LOW | dnsapi/dns_laodc.sh | 12 | # Usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | dnsapi/dns_ipprojects.sh | 54 | _err "e.g.: export IPP_Apikey=\"your_api_key\"" | CODE |
| HIGH | dnsapi/dns_eurodns.sh | 22 | # export EURODNS_API_KEY="your-api-key" | COMMENT |
| HIGH | dnsapi/dns_laodc.sh | 13 | # export LaoDC_Key="your-api-key" | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | acme.sh | 3146 | except Exception: | CODE |
| MEDIUM | notify/smtp.sh | 344 | print("Error sending: %r" % err) | CODE |
| MEDIUM | notify/smtp.sh | 348 | print("Error connecting to %s:%d: %r" % (smtp_host, smtp_port, err)) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | deploy/unifios.sh | 35 | # code path the UI uses, so it's far more robust than editing settings.yaml, | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | dnsapi/dns_namecheap.sh | 15 | # Due to Namecheap's API limitation all the records of your domain will be read and re applied, make sure to have a back | COMMENT |