用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/lukemcqueen/hermes-cortex --skill tls-cert-preflight命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
正在显示 SKILL.md
| name | tls-cert-preflight |
| description | Use when validating TLS certs before deploying an endpoint. |
| version | 1.0.0 |
| category | devops |
| triggers | ["certs were handed over or dropped in and need verification","nginx -t fails with cannot load certificate / PEM_read_bio_PrivateKey","TLS clients reject a deployed endpoint","verifying Let's Encrypt or self-signed cert material before a restart"] |
"A cert file exists at the configured path" is NOT a working cert. Placeholder and broken drops are
common — hand-copied intermediates, headerless DER keys, mismatched key/cert. Validate the pair
BEFORE nginx -t / reload / restart: an endpoint that starts and silently rejects every TLS handshake
wastes a whole debug cycle.
bash ~/.hermes/skills/devops/tls-cert-preflight/scripts/verify-ssl-pair.sh <fullchain.pem> <privkey.pem>
Exit 0 = usable server pair; 1 = failures found, each named. Reproduce the checks by hand with:
openssl x509 -in fullchain.pem -noout -subject -issuer -datesopenssl x509 -in fullchain.pem -noout -ext subjectAltName
(empty or "No extensions" = dead — modern clients reject)openssl x509 -in fullchain.pem -noout -text | grep CA:TRUE
(a CA/intermediate cert can never serve a hostname)openssl pkey -in privkey.pem -noout
(fails on headerless DER: a ~100-200-byte file with no -----BEGIN line)| Symptom | Meaning |
|---|---|
Basic Constraints: CA:TRUE + no SAN | PEM is an intermediate/CA cert (e.g. CN=YE1 / "Root YE" test chain), not a server leaf |
| ~3-year validity | Real Let's Encrypt leaves = 90 days; multi-year = hand-made/copied placeholder |
nginx -t: cannot load certificate key ... PEM_read_bio_PrivateKey() failed | key is headerless DER (missing PEM armor) — re-armor or replace |
| key parses but different curve/size than cert (e.g. P-256 key beside P-384 cert) | mismatched pair — replace both files |
No /etc/letsencrypt/renewal/<domain>.conf, no archive/, live files owned by a user | certbot never issued it; cert is not managed or renewable |
nginx -t. A pair issue shows up as either cannot load certificate key
(unarmored/mismatched key) or as a config that tests clean but serves a broken handshake.nginx-web-app-deployment skill.Keep the proxy layer testable via curl -k with a SAN-correct self-signed pair:
openssl req -x509 -newkey rsa:2048 -keyout privkey.pem -out fullchain.pem -days 90 -nodes \
-subj "/CN=DOMAIN" -addext "subjectAltName=DNS:DOMAIN,DNS:localhost"
Verify with the probe, swap into the live dir, restart. Real certs drop in later with just a reload.
.env pointed at .org while the user referenced .com certs — check the actual URL the client uses.command not found). Policy presence is not binary presence.cert.pem/chain.pem/
privkey.pem quartet → hand-placed, not certbot-managed.