@t0mer/n8n-nodes-ssllabs 2026.9.0 → 2026.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,16 +1,20 @@
1
1
  # @t0mer/n8n-nodes-ssllabs
2
2
 
3
+ [![npm version](https://img.shields.io/npm/v/@t0mer/n8n-nodes-ssllabs)](https://www.npmjs.com/package/@t0mer/n8n-nodes-ssllabs)
4
+ [![CI](https://github.com/t0mer/n8n-nodes-ssllabs/actions/workflows/ci.yml/badge.svg)](https://github.com/t0mer/n8n-nodes-ssllabs/actions/workflows/ci.yml)
5
+ [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/t0mer/n8n-nodes-ssllabs/blob/main/LICENSE)
6
+
3
7
  An [n8n](https://n8n.io/) community node for the [Qualys SSL Labs API v4](https://github.com/ssllabs/ssllabs-scan/blob/master/ssllabs-api-docs-v4.md). It runs SSL/TLS server assessments, returns grades, endpoint details and certificate data, and watches your hosts for grade or certificate changes.
4
8
 
5
9
  It ships two nodes and one credential:
6
10
 
7
11
  | | |
8
12
  |---|---|
9
- | **SSL Labs** | Action node: run assessments, read endpoint details, get service info, and register your email |
13
+ | **SSL Labs** | Action node: run assessments, read endpoint details, get service info, and register your email. It can also be used as a tool by an n8n AI Agent. |
10
14
  | **SSL Labs Trigger** | Polling trigger: grade changed, grade below a threshold, or certificate expiring |
11
15
  | **SSL Labs API** | Credential: your registered email address and the API base URL |
12
16
 
13
- > **Not affiliated with Qualys.** This is an unofficial, community-maintained node. SSL Labs is a free service provided by Qualys; use it according to the [SSL Labs terms](https://www.ssllabs.com/about/terms.html). **Only assess hosts you own or are authorized to test.**
17
+ > **Unofficial. Not affiliated with, endorsed by, or supported by Qualys.** This is a community-maintained node. SSL Labs is a free service provided by Qualys; use it according to the [SSL Labs terms and conditions](https://www.ssllabs.com/about/terms.html). **Only assess hosts you own or are authorized to test.** See [Terms of use and privacy](#terms-of-use-and-privacy).
14
18
 
15
19
  - [Demo](#demo)
16
20
  - [Installation](#installation)
@@ -18,15 +22,22 @@ It ships two nodes and one credential:
18
22
  - [Credentials](#credentials)
19
23
  - [SSL Labs node](#ssl-labs-node)
20
24
  - [SSL Labs Trigger](#ssl-labs-trigger)
25
+ - [Example workflows](#example-workflows)
21
26
  - [Rate limits and timing](#rate-limits-and-timing)
27
+ - [Terms of use and privacy](#terms-of-use-and-privacy)
28
+ - [Security notes](#security-notes)
22
29
  - [Compatibility](#compatibility)
30
+ - [Development](#development)
31
+ - [Contributing](#contributing)
23
32
  - [Resources](#resources)
33
+ - [License](#license)
24
34
 
25
35
  ## Demo
26
36
 
27
- [![SSL Labs for n8n demo: credential, registration, Analyze and the trigger's test event](https://raw.githubusercontent.com/t0mer/n8n-nodes-ssllabs/main/assets/demo/ssllabs-demo.png)](https://github.com/t0mer/n8n-nodes-ssllabs/raw/main/assets/demo/ssllabs-demo.mp4)
37
+ [![SSL Labs for n8n demo: credential, registration, Analyze and the trigger's test event](https://raw.githubusercontent.com/t0mer/n8n-nodes-ssllabs/main/assets/demo/ssllabs-demo.png)](https://github.com/t0mer/n8n-nodes-ssllabs/blob/main/assets/demo/ssllabs-demo.mp4)
38
+
39
+ ▶️ [Watch the demo video](https://github.com/t0mer/n8n-nodes-ssllabs/blob/main/assets/demo/ssllabs-demo.mp4) (2½ min). It shows:
28
40
 
29
- ▶️ [Watch the demo video](https://github.com/t0mer/n8n-nodes-ssllabs/raw/main/assets/demo/ssllabs-demo.mp4) (2½ min). It shows:
30
41
  - the credential
31
42
  - a free-mailbox registration being rejected (email addresses are blurred)
32
43
  - Get Info, then Analyze of `www.ssllabs.com`, with cache on and publish off
@@ -36,13 +47,14 @@ It ships two nodes and one credential:
36
47
 
37
48
  **From the n8n UI** (self-hosted): go to **Settings → Community Nodes → Install**, enter `@t0mer/n8n-nodes-ssllabs`, and confirm.
38
49
 
39
- **From npm**, in your n8n custom nodes folder (usually `~/.n8n/nodes`):
50
+ **Manually from npm**, in your n8n custom nodes folder (usually `~/.n8n/nodes`):
40
51
 
41
52
  ```bash
53
+ mkdir -p ~/.n8n/nodes && cd ~/.n8n/nodes
42
54
  npm install @t0mer/n8n-nodes-ssllabs
43
55
  ```
44
56
 
45
- Then restart n8n. See the [community nodes installation guide](https://docs.n8n.io/integrations/community-nodes/installation/) for details.
57
+ Then restart n8n. See the [community nodes installation guide](https://docs.n8n.io/integrations/community-nodes/installation-and-management/) for details, including installs in Docker.
46
58
 
47
59
  ## Registration
48
60
 
@@ -50,7 +62,7 @@ API v4 requires every caller to register an email address once. Qualys rejects f
50
62
 
51
63
  You can register in either of two ways:
52
64
 
53
- - **With this node:** add an **SSL Labs** node and choose **Resource: Registration → Register**. Fill in first name, last name, email and organization, then run it. This operation does not need a credential; if you attach one, its base URL is used. Any rejection message from SSL Labs is shown as-is.
65
+ - **With this node:** add an **SSL Labs** node and choose **Resource: Registration → Register**. Fill in first name, last name, email and organization, then run it. This operation does not need a credential; if you attach one, its base URL is used. If SSL Labs rejects the request with HTTP 400 (for example, for a free mailbox address), the node fails with *"SSL Labs rejected the request parameters: …"* followed by the field and reason SSL Labs gave, such as `email: …`. If SSL Labs answers with HTTP 200 but a `failure` status, the node fails with *"SSL Labs registration failed: …"* and the reason.
54
66
  - **With the official CLI:** build and run `ssllabs-scan-v4-register` from the [ssllabs-scan](https://github.com/ssllabs/ssllabs-scan) repository. Its README lists the flags it takes.
55
67
 
56
68
  You only register once per email address.
@@ -59,18 +71,25 @@ You only register once per email address.
59
71
 
60
72
  Create an **SSL Labs API** credential:
61
73
 
62
- | Field | Description |
63
- |---|---|
64
- | **Email** | The address you registered. It is sent as the `email` header on every call. |
65
- | **Base URL** | Defaults to `https://api.ssllabs.com/api/v4`. Use `https://api.dev.ssllabs.com/api/v4` for the development server, which has lower limits and no availability guarantee. |
74
+ | Field | Default | Description |
75
+ |---|---|---|
76
+ | **Email** | — (required) | The address you registered. It is sent as the `email` header on every call. |
77
+ | **Base URL** | `https://api.ssllabs.com/api/v4` | Use an `https://` URL. The node's operations and the trigger refuse any other URL with *"Base URL must start with https://"*, but the credential test does not check it: an `http://` URL would be tested over cleartext, with your email in the header. Use `https://api.dev.ssllabs.com/api/v4` for the development server, which has lower limits and no availability guarantee. |
66
78
 
67
79
  The credential test calls `/info`, so it only proves that the API is reachable. An unregistered email fails on the first assessment with *"Email is not registered with SSL Labs v4 — use the Register operation first"*.
68
80
 
69
81
  ## SSL Labs node
70
82
 
83
+ | Resource | Operations |
84
+ |---|---|
85
+ | **Assessment** | Analyze |
86
+ | **Endpoint** | Get |
87
+ | **Registration** | Register |
88
+ | **Service** | Get Info, Get Root Certificates, Get Status Codes |
89
+
71
90
  ### Assessment → Analyze
72
91
 
73
- This operation assesses a host. The **Host** field takes a bare hostname; if you paste a URL such as `https://Example.com:443/path`, it is reduced to `example.com`.
92
+ This operation assesses a host. The **Host** field takes a bare hostname; if you paste a URL such as `https://Example.com:443/path`, it is reduced to `example.com`. Input that leaves no valid hostname fails with *"… is not a valid hostname"*.
74
93
 
75
94
  | Mode | What it does |
76
95
  |---|---|
@@ -83,21 +102,21 @@ This operation assesses a host. The **Host** field takes a bare hostname; if you
83
102
  | Parameter | Default | Notes |
84
103
  |---|---|---|
85
104
  | Use Cache | on | Accept a cached report (`fromCache=on`). |
86
- | Max Cache Age (Hours) | 24 | Only accept cached reports up to this old. `0` accepts any age. |
87
- | Force New Scan | off | Only shown when Use Cache is off. Sends `startNew=on`. SSL Labs does not allow both flags at once, and the node rejects that combination too. |
105
+ | Max Cache Age (Hours) | 24 | Only shown when Use Cache is on. Only accept cached reports up to this old. `0` accepts any age. |
106
+ | Force New Scan | off | Only shown when Use Cache is off and Mode is Wait for Result or Start Only. Sends `startNew=on` on the first call only, because repeating it while polling would restart the assessment. SSL Labs does not allow `startNew` and `fromCache` together, so the node never sends both. |
88
107
 
89
108
  **Options**
90
109
 
91
110
  | Option | Default | Notes |
92
111
  |---|---|---|
93
- | Batch Concurrency | 3 | Maximum parallel assessments when there are several input items (max 10). |
112
+ | Batch Concurrency | 3 | Maximum parallel assessments when there are several input items (1–10). |
94
113
  | Detail Level | Summary | **Summary** returns the compact shape below. **Full** returns the raw SSL Labs `Host` object plus `reportUrl`. |
95
- | Fail on Assessment Error | on | When off, an assessment that ends in ERROR is returned as an item instead of failing the node. |
96
- | Ignore Certificate Mismatch | off | Continue even when the certificate does not match the hostname. |
97
- | Initial Poll Interval (Seconds) | 5 | How often to poll while the status is `DNS` (minimum 5). |
98
- | Poll Interval (Seconds) | 10 | How often to poll once the status is `IN_PROGRESS` (minimum 5). |
114
+ | Fail on Assessment Error | on | When off, an assessment that ends in ERROR is returned as an item instead of failing the node with *"Assessment of … failed: …"*. |
115
+ | Ignore Certificate Mismatch | off | Continue even when the certificate does not match the hostname (`ignoreMismatch=on`). |
116
+ | Initial Poll Interval (Seconds) | 5 | Wait for Result only. How often to poll while the status is `DNS` (minimum 5). |
117
+ | Poll Interval (Seconds) | 10 | Wait for Result only. How often to poll once the status is `IN_PROGRESS` (minimum 5). |
99
118
  | Publish Results | **off** | ⚠️ **Published results appear on the public SSL Labs boards.** Leave this off unless you really want that. |
100
- | Timeout (Minutes) | 15 | How long Wait for Result keeps polling before it fails. |
119
+ | Timeout (Minutes) | 15 | Wait for Result only. How long to keep polling before failing with *"Assessment of … did not finish within … minutes"* (minimum 1). |
101
120
 
102
121
  **Summary output** (one item per host):
103
122
 
@@ -111,8 +130,10 @@ This operation assesses a host. The **Host** field takes a bare hostname; if you
111
130
  "bestGrade": "A+",
112
131
  "hasWarnings": true,
113
132
  "endpoints": [
114
- { "ipAddress": "93.184.216.34", "serverName": "example.com", "grade": "A", "gradeTrustIgnored": "A",
115
- "hasWarnings": false, "isExceptional": false, "statusMessage": "Ready" }
133
+ { "ipAddress": "93.184.216.34", "serverName": "example.com", "grade": "A+", "gradeTrustIgnored": "A+",
134
+ "hasWarnings": false, "isExceptional": true, "statusMessage": "Ready" },
135
+ { "ipAddress": "2606:2800:220:1:248:1893:25c8:1946", "serverName": "example.com", "grade": "B", "gradeTrustIgnored": "B",
136
+ "hasWarnings": true, "isExceptional": false, "statusMessage": "Ready" }
116
137
  ],
117
138
  "certificate": {
118
139
  "subject": "CN=example.com", "issuer": "CN=R11, O=Let's Encrypt, C=US",
@@ -128,11 +149,13 @@ This operation assesses a host. The **Host** field takes a bare hostname; if you
128
149
 
129
150
  A few details about these fields:
130
151
 
131
- - `grade` is the **worst** grade across all endpoints that have one. That makes it the conservative value to alert on. Endpoints that could not be tested have no grade and are ignored.
152
+ - `grade` is the **worst** grade across all endpoints that have one. That makes it the conservative value to alert on. Endpoints that could not be tested have no grade and are ignored; when no endpoint has a grade, `grade` is `null`.
153
+ - `hasWarnings` is `true` when any endpoint has warnings.
154
+ - `certificate` is the leaf certificate: the first certificate chain leaf, across endpoints in order, that matches a certificate in the result. When none matches, it falls back to the first certificate. `fingerprint` is its SHA-256 hash (or SHA-1, serial number or ID when that is missing), and `daysUntilExpiry` is computed when the item is produced.
132
155
  - Grades rank from best to worst as `A+ > A > A- > B > C > D > E > F > T > M`. `T` (trust issues) and `M` (certificate name mismatch) rank below `F`.
133
156
  - All timestamps are ISO-8601 strings.
134
157
 
135
- **Several input items:** the node reads `/info` once, then runs at most `min(Batch Concurrency, maxAssessments − currentAssessments)` assessments at a time, and never fewer than 1. It spaces new assessments by SSL Labs' `newAssessmentCoolOff`.
158
+ **Several input items:** the node reads `/info` once, then runs at most `min(Batch Concurrency, maxAssessments − currentAssessments)` assessments at a time, and never fewer than 1. It spaces new assessments by SSL Labs' `newAssessmentCoolOff` plus a small margin (1.1 seconds when `/info` does not report one). If `/info` cannot be read, it runs one assessment at a time.
136
159
 
137
160
  - With **Continue On Fail**, a failed item becomes `{ "error": "…", "host": "…" }` and the other items keep going.
138
161
  - Without it, the first failure cancels the rest of the batch.
@@ -146,7 +169,7 @@ Example: check your own hosts and alert if the grade is below A.
146
169
 
147
170
  ### Endpoint → Get
148
171
 
149
- This operation returns the full SSL Labs `Endpoint` object for one IP address of an assessed host (`getEndpointData`). Set **Host** and **IP Address**; the IP address is listed in the `endpoints` of an Analyze result. **Use Cache** (default on) returns the cached data. This operation never starts a new assessment.
172
+ This operation returns the full SSL Labs `Endpoint` object for one IP address of an assessed host (`getEndpointData`). Set **Host** and **IP Address**; the IP address is listed in the `endpoints` of an Analyze result (brackets around an IPv6 address are removed). **Use Cache** (default on) returns the cached data. This operation never starts a new assessment.
150
173
 
151
174
  ### Service
152
175
 
@@ -154,7 +177,7 @@ This operation returns the full SSL Labs `Endpoint` object for one IP address of
154
177
  |---|---|
155
178
  | **Get Info** | Availability, engine and criteria versions, `maxAssessments`, `currentAssessments`, `newAssessmentCoolOff`, and messages |
156
179
  | **Get Status Codes** | The `statusDetails` code → English message map |
157
- | **Get Root Certificates** | `{ trustStoreId, trustStore, certificates }` where `certificates` is the raw PEM text. Trust stores: 1 Mozilla, 2 Apple MacOS, 3 Android, 4 Java, 5 Windows. |
180
+ | **Get Root Certificates** | `{ trustStoreId, trustStore, certificates }` where `certificates` is the raw PEM text. Choose the **Trust Store**: Mozilla (1, default), Apple MacOS (2), Android (3), Java (4) or Windows (5). |
158
181
 
159
182
  ### Registration → Register
160
183
 
@@ -166,16 +189,16 @@ The trigger polls SSL Labs on the schedule you set in n8n. It **never waits for
166
189
 
167
190
  | Parameter | Default | Notes |
168
191
  |---|---|---|
169
- | Hosts | — | The hostnames to watch. Add one per value; comma-separated values also work. |
192
+ | Hosts | — | The hostnames to watch. Add one per value; comma- or space-separated values also work. URLs are reduced to their hostname, and duplicates are removed. An invalid hostname fails the poll. |
170
193
  | Event | Grade Changed | See the table below. |
171
194
  | Threshold Grade | A | For **Grade Below Threshold**. |
172
195
  | Days Before Expiry | 21 | For **Certificate Expiring**. |
173
- | Max Result Age (Hours) | 24 | Cached results up to this old are reused, so each host is re-assessed at most this often. |
174
- | Emit Errors (option) | off | Emit an `assessmentError` item when a host's assessment ends in ERROR. |
196
+ | Max Result Age (Hours) | 24 | Cached results up to this old are reused, so each host is re-assessed at most this often (minimum 1). |
197
+ | Emit Errors (option) | off | Emit an item with `event: "assessmentError"` when a host's assessment ends in ERROR. |
175
198
 
176
199
  | Event | Fires when |
177
200
  |---|---|
178
- | **Grade Changed** | A host's grade differs from the last grade seen. The output includes `previousGrade`. |
201
+ | **Grade Changed** | A host's grade differs from the last grade seen. The output includes `previousGrade`. A result without a grade does not count as a change. |
179
202
  | **Grade Below Threshold** | The grade becomes worse than the threshold. It fires **once** when the grade crosses the threshold, and re-arms when the grade recovers. The output includes `previousGrade` and `thresholdGrade`. |
180
203
  | **Certificate Expiring** | `daysUntilExpiry` is at or below the limit. It fires **once per certificate**, keyed on its fingerprint, and a renewed certificate re-arms it. The output includes `previousCertificate` when the certificate changed. |
181
204
 
@@ -189,32 +212,64 @@ How the trigger behaves:
189
212
  - Grade Below Threshold starts tracking at the first graded result after the event or threshold is selected, so it also begins with a silent baseline.
190
213
  - Grade Changed compares against the last grade seen, whichever event was selected at the time.
191
214
  - Certificate Expiring alerts on the next poll for a certificate already inside the window, even right after you switch to this event.
192
- - **Fetch Test Event** (manual mode) returns the current summary of each host with `event: "test"`, so you can map fields. It does not change the stored state.
215
+ - **Fetch Test Event** (manual mode) returns the current summary of each host with `event: "test"`, so you can map fields. It does not change the stored state. A host with no fresh cached result comes back with its in-progress status, because SSL Labs starts an assessment for it.
193
216
  - Hosts whose assessment is still running are marked as pending and checked again on the next poll.
217
+ - Hosts are checked least recently checked first. A poll stops starting new checks once it has used 80% of n8n's poll time budget; the remaining hosts go first on the next poll.
194
218
  - Days until expiry are recomputed on every poll from the certificate's `notAfter` date.
219
+ - **Emit Errors** only fires for a host that already had a result, and only when the error message changes, so a host that keeps failing with the same error alerts once.
195
220
  - How the trigger handles errors:
196
221
  - **SSL Labs busy (429, 503 or 529):** the poll stops quietly. The remaining hosts are checked first on the next poll.
197
- - **Server error or network trouble:** that host is skipped until the next poll.
222
+ - **Server error or network trouble:** that host is skipped until the next poll. If it happens for **every** host, the poll fails, since that usually means a wrong base URL or an outage.
198
223
  - **400 for a host:** recorded as that host's error.
199
224
  - **Configuration problems** (unregistered email, a non-https base URL, 401/403/404): the trigger fails, so you see the problem.
200
- - After a call that starts a new assessment, the trigger waits SSL Labs' `newAssessmentCoolOff` before checking the next host.
225
+ - After a call that probably started a new assessment (the host was not already pending and the result is not finished), the trigger waits SSL Labs' `newAssessmentCoolOff` plus a small margin (1.1 seconds by default) before checking the next host.
226
+ - Hosts removed from the list are dropped from the stored state.
201
227
  - The stored state is versioned (`stateVersion: 1`).
202
228
 
229
+ ## Example workflows
230
+
231
+ Import any of these from [`examples/`](https://github.com/t0mer/n8n-nodes-ssllabs/tree/main/examples) with **Workflows → Import from File** (or import from URL, using the file's raw link). The hostnames are placeholders; replace them with hosts you own or are authorized to test, and register your email first (see [Registration](#registration)).
232
+
233
+ | File | What it does |
234
+ |---|---|
235
+ | [`weekly-ssl-grade-report.json`](https://github.com/t0mer/n8n-nodes-ssllabs/blob/main/examples/weekly-ssl-grade-report.json) | Every Monday, assesses a list of hosts and appends grades and certificate expiry dates to Google Sheets. It also emails a summary. |
236
+ | [`alert-on-grade-drop-or-expiring-certificate.json`](https://github.com/t0mer/n8n-nodes-ssllabs/blob/main/examples/alert-on-grade-drop-or-expiring-certificate.json) | Two triggers: send a Slack alert when a grade drops below A or a certificate expires within 21 days. |
237
+ | [`on-demand-scan-webhook.json`](https://github.com/t0mer/n8n-nodes-ssllabs/blob/main/examples/on-demand-scan-webhook.json) | A webhook that returns the grade of a posted host, or the assessment's progress so the caller can poll again. |
238
+ | [`ai-agent-ssl-tool.json`](https://github.com/t0mer/n8n-nodes-ssllabs/blob/main/examples/ai-agent-ssl-tool.json) | An AI Agent that uses the node as a tool to answer "what grade does my site get?" and "when does my certificate expire?" |
239
+
203
240
  ## Rate limits and timing
204
241
 
205
242
  - An assessment usually takes **1–5 minutes per IP address**, and some hosts have several. That is why **Wait for Result** can run for minutes. Raise **Timeout (Minutes)**, or use **Start Only** and later **Get Status**.
206
243
  - SSL Labs limits how many assessments you may run at once (`maxAssessments`) and how quickly you may start new ones (`newAssessmentCoolOff`). The node respects both.
207
- - How the node handles errors:
244
+ - Prefer **Use Cache** unless you really need a fresh scan. Cached reports are fast and don't use up assessment slots.
245
+
246
+ How the action node handles HTTP errors from SSL Labs:
208
247
 
209
248
  | Status | Meaning | What the node does |
210
249
  |---|---|---|
211
- | **429** | Too many assessments | Waits and retries up to 3 times |
212
- | **503** | Maintenance | Waits a minute and retries twice, then fails with a clear message. SSL Labs recommends waiting 15–30 minutes before trying again. |
250
+ | **429** | Too many assessments | Retries up to 3 times, waiting about 15, 30 and 45 seconds |
251
+ | **503** | Maintenance | Retries twice, waiting about 1 and 2 minutes, then fails with a clear message. SSL Labs recommends waiting 15–30 minutes before trying again. |
213
252
  | **529** | Overloaded | Same as 503 |
214
- | **500** | Server error | Retried once |
253
+ | **500** | Server error | Retried once after about 5 seconds. A call that started a new scan (`startNew`) is never repeated. |
215
254
  | **400** | Invalid parameters | Not retried |
255
+ | **441** (or a 400 about the email) | Email not registered | Fails with *"Email is not registered with SSL Labs v4 — use the Register operation first"* |
216
256
 
217
- - Prefer **Use Cache** unless you really need a fresh scan. Cached reports are fast and don't use up assessment slots.
257
+ Waits are randomized by ±25%. In **Wait for Result** mode, no retry wait runs past the timeout. The Register operation and the trigger do not retry.
258
+
259
+ ## Terms of use and privacy
260
+
261
+ - SSL Labs APIs are free to use, subject to the [Qualys SSL Labs terms and conditions](https://www.ssllabs.com/about/terms.html). The API documentation says the spirit of the license is that operators test **their own** infrastructure. Read the full terms before you automate scans.
262
+ - **Only assess hosts you own or are authorized to test.**
263
+ - Assessments are carried out by Qualys's servers, not by your n8n instance. The hostnames you submit and your registered email are sent to Qualys.
264
+ - Results are **not** published by default. Turning on **Publish Results** lists them on the public SSL Labs boards. <!-- TODO: verify whether unpublished results can still be viewed by others through the report URL -->
265
+ - This project is unofficial and is not affiliated with, endorsed by, or supported by Qualys.
266
+
267
+ ## Security notes
268
+
269
+ - Store your registered email in the **SSL Labs API** credential, not in node parameters, so it stays in n8n's encrypted credential store.
270
+ - Use an `https://` Base URL. The node's operations and the trigger refuse any other URL, but the credential test does not check it, so an `http://` URL would send your email header in cleartext during the test.
271
+ - Keep **Publish Results** off unless you intend to make a host's results public.
272
+ - When you expose the on-demand webhook example, protect it (for example with webhook authentication) so others can't use your registration to scan arbitrary hosts.
218
273
 
219
274
  ## Compatibility
220
275
 
@@ -222,13 +277,42 @@ How the trigger behaves:
222
277
  - Node.js 24
223
278
  - No runtime dependencies
224
279
 
280
+ ## Development
281
+
282
+ ```bash
283
+ git clone https://github.com/t0mer/n8n-nodes-ssllabs.git
284
+ cd n8n-nodes-ssllabs
285
+ npm ci
286
+ npm run lint # n8n-node lint
287
+ npm run build # n8n-node build → dist/
288
+ npm test # vitest, no calls to the real API
289
+ npm run dev # starts a local n8n with the nodes loaded
290
+ ```
291
+
292
+ CI (`.github/workflows/ci.yml`) runs lint, build and tests on Node 24, then runs the n8n Creator Portal scanner on the source and the packed tarball (`scripts/scan-package.mjs`). Releases are published to npm with provenance by `.github/workflows/publish.yml` when a `YYYY.M.PATCH` tag is pushed; see the [changelog](https://github.com/t0mer/n8n-nodes-ssllabs/blob/main/CHANGELOG.md).
293
+
294
+ Project layout:
295
+
296
+ | Path | Contents |
297
+ |---|---|
298
+ | `credentials/` | The SSL Labs API credential |
299
+ | `nodes/SslLabs/` | The action node and one module per resource |
300
+ | `nodes/SslLabsTrigger/` | The polling trigger and its stored state |
301
+ | `shared/` | Transport and retries, polling, batching, hostname parsing, grades and the summary mapper |
302
+ | `test/` | Vitest tests and API fixtures |
303
+ | `examples/` | Importable example workflows |
304
+
305
+ ## Contributing
306
+
307
+ Issues and pull requests are welcome at [github.com/t0mer/n8n-nodes-ssllabs](https://github.com/t0mer/n8n-nodes-ssllabs/issues). Please run `npm run lint`, `npm run build` and `npm test` before opening a pull request, and never point tests at the live SSL Labs API.
308
+
225
309
  ## Resources
226
310
 
227
311
  - [SSL Labs API v4 documentation](https://github.com/ssllabs/ssllabs-scan/blob/master/ssllabs-api-docs-v4.md)
228
312
  - [SSL Labs API v4 announcement](https://notifications.qualys.com/api/2023/09/28/introduction-of-api-v4-for-qualys-ssllabs-and-deprecation-of-api-v3)
229
313
  - [SSL Labs Server Test](https://www.ssllabs.com/ssltest/)
230
- - [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
314
+ - [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)
231
315
 
232
316
  ## License
233
317
 
234
- [MIT](LICENSE)
318
+ [MIT](https://github.com/t0mer/n8n-nodes-ssllabs/blob/main/LICENSE) © 2026 t0mer
@@ -2,7 +2,7 @@
2
2
  "node": "@t0mer/n8n-nodes-ssllabs.sslLabs",
3
3
  "nodeVersion": "1.0",
4
4
  "codexVersion": "1.0",
5
- "categories": ["Development", "Developer Tools"],
5
+ "categories": ["Development"],
6
6
  "resources": {
7
7
  "credentialDocumentation": [
8
8
  {
@@ -2,7 +2,7 @@
2
2
  "node": "@t0mer/n8n-nodes-ssllabs.sslLabsTrigger",
3
3
  "nodeVersion": "1.0",
4
4
  "codexVersion": "1.0",
5
- "categories": ["Development", "Developer Tools"],
5
+ "categories": ["Development"],
6
6
  "resources": {
7
7
  "credentialDocumentation": [
8
8
  {
package/dist/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@t0mer/n8n-nodes-ssllabs",
3
- "version": "2026.9.0",
4
- "description": "n8n community node for the Qualys SSL Labs API v4: run SSL/TLS assessments, fetch grades, and watch for grade or certificate changes.",
3
+ "version": "2026.10.0",
4
+ "description": "n8n community nodes for the Qualys SSL Labs API v4: run SSL/TLS server assessments, get grades and certificate details, and get alerts on grade drops or expiring certificates.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/t0mer/n8n-nodes-ssllabs#readme",
7
7
  "bugs": {
@@ -15,9 +15,13 @@
15
15
  "n8n-community-node-package",
16
16
  "n8n",
17
17
  "ssllabs",
18
+ "ssl-labs",
19
+ "qualys",
18
20
  "ssl",
19
21
  "tls",
22
+ "ssl-test",
20
23
  "certificate",
24
+ "certificate-monitoring",
21
25
  "security"
22
26
  ],
23
27
  "author": {