{"_id":"@anjianshi/ssl","_rev":"2-c6a849c284b526c3b82edfd1d03778cf","name":"@anjianshi/ssl","dist-tags":{"latest":"1.1.0"},"versions":{"1.0.0":{"name":"@anjianshi/ssl","version":"1.0.0","author":{"name":"anjianshi","email":"anjianshi@gmail.com"},"license":"MIT","_id":"@anjianshi/ssl@1.0.0","maintainers":[{"name":"anjianshi","email":"anjianshi@gmail.com"}],"homepage":"https://github.com/anjianshi/ssl","bugs":{"url":"https://github.com/anjianshi/ssl","email":"anjianshi@gmail.com"},"bin":{"ssl":"dist/index.js"},"dist":{"shasum":"4257c588e995975842061f45d7aef900541e533c","tarball":"https://registry.npmjs.org/@anjianshi/ssl/-/ssl-1.0.0.tgz","fileCount":58,"integrity":"sha512-U5WMcqg/hy+fA+sk6PRUCGHqP/Mu6A3oL9/Ej46s5tAq1C3ec2y06EW7czBqSXGWgm9bx2OEGBagQ/eYpXpVpw==","signatures":[{"sig":"MEUCIFhiIrMUbG5eLHvVScRk44Ui4LuRuGPgiEdLj6RB7NHSAiEA/3+nzkB2An3knqlX/Wo9TSDzX/ZSWCA3MsnHtMeUxhE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":143391},"main":"dist/index.js","type":"module","_from":"file:anjianshi-ssl-1.0.0.tgz","types":"./dist/index.d.ts","scripts":{"build":"rm -rf dist && tsc","start":"node dist/index.js","watch":"rm -rf dist && tsc --watch"},"_npmUser":{"name":"anjianshi","email":"anjianshi@gmail.com"},"prettier":"@anjianshi/presets-prettier/prettierrc.js","_resolved":"/private/var/folders/8z/71pjdbvj2lsbf7bvv0w0c1180000gn/T/f2a96b57e751e1d13fafc5f185f6558e/anjianshi-ssl-1.0.0.tgz","_integrity":"sha512-U5WMcqg/hy+fA+sk6PRUCGHqP/Mu6A3oL9/Ej46s5tAq1C3ec2y06EW7czBqSXGWgm9bx2OEGBagQ/eYpXpVpw==","repository":{"url":"git+https://github.com/anjianshi/ssl.git","type":"git"},"_npmVersion":"10.5.0","description":"Auto request and deploy SSL certificate","directories":{},"_nodeVersion":"21.7.1","dependencies":{"chalk":"^5.3.0","dayjs":"^1.11.13","lodash":"^4.17.21","node-scp":"^0.0.23","acme-client":"^5.4.0","@types/lodash":"^4.17.13","@anjianshi/utils":"^2.4.16"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.3","@types/node":"^22.9.0","@types/ssh2":"^1.15.1","@anjianshi/presets-prettier":"^3.0.1","@anjianshi/presets-typescript":"^3.2.3","@anjianshi/presets-eslint-node":"^4.0.15"},"_npmOperationalInternal":{"tmp":"tmp/ssl_1.0.0_1732004590868_0.843283541934543","host":"s3://npm-registry-packages"}},"1.0.1":{"name":"@anjianshi/ssl","version":"1.0.1","author":{"name":"anjianshi","email":"anjianshi@gmail.com"},"license":"MIT","_id":"@anjianshi/ssl@1.0.1","maintainers":[{"name":"anjianshi","email":"anjianshi@gmail.com"}],"homepage":"https://github.com/anjianshi/ssl","bugs":{"url":"https://github.com/anjianshi/ssl","email":"anjianshi@gmail.com"},"bin":{"ssl":"dist/index.js"},"dist":{"shasum":"c55ff19aca97c6fdf732b6af6c36eba1334898c0","tarball":"https://registry.npmjs.org/@anjianshi/ssl/-/ssl-1.0.1.tgz","fileCount":61,"integrity":"sha512-gw9iZva79Y8k/Hr4mL40gqisxzTnBksbnY9y74OH5JoYXpWUc/Q5l7eTCPDyBNUpMKJUvXZNrNG4swSX02HhQg==","signatures":[{"sig":"MEUCIHws69M+Ifebra8gjuHgrlUk+X2O2mwq/dqzEgS0dBeZAiEAiMDntFPJYXQOT/rVzFmx1d5dVfyNcS8+zUDJKo0DYlU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145168},"main":"dist/index.js","type":"module","_from":"file:anjianshi-ssl-1.0.1.tgz","types":"./dist/index.d.ts","scripts":{"build":"rm -rf dist && tsc","start":"node dist/index.js","watch":"rm -rf dist && tsc --watch"},"_npmUser":{"name":"anjianshi","email":"anjianshi@gmail.com"},"prettier":"@anjianshi/presets-prettier/prettierrc.js","_resolved":"/private/var/folders/8z/71pjdbvj2lsbf7bvv0w0c1180000gn/T/f064471ae6825b053ea9149811d7906c/anjianshi-ssl-1.0.1.tgz","_integrity":"sha512-gw9iZva79Y8k/Hr4mL40gqisxzTnBksbnY9y74OH5JoYXpWUc/Q5l7eTCPDyBNUpMKJUvXZNrNG4swSX02HhQg==","repository":{"url":"git+https://github.com/anjianshi/ssl.git","type":"git"},"_npmVersion":"10.5.0","description":"Auto request and deploy SSL certificate","directories":{},"_nodeVersion":"21.7.1","dependencies":{"chalk":"^5.3.0","dayjs":"^1.11.13","lodash":"^4.17.21","node-scp":"^0.0.23","acme-client":"^5.4.0","@types/lodash":"^4.17.13","@anjianshi/utils":"^2.4.16"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.3","@types/node":"^22.9.0","@types/ssh2":"^1.15.1","@anjianshi/presets-prettier":"^3.0.1","@anjianshi/presets-typescript":"^3.2.3","@anjianshi/presets-eslint-node":"^4.0.15"},"_npmOperationalInternal":{"tmp":"tmp/ssl_1.0.1_1732097144746_0.17441435340241007","host":"s3://npm-registry-packages"}},"1.1.0":{"name":"@anjianshi/ssl","version":"1.1.0","description":"Auto request and deploy SSL certificate","homepage":"https://github.com/anjianshi/ssl","bugs":{"url":"https://github.com/anjianshi/ssl","email":"anjianshi@gmail.com"},"license":"MIT","author":{"name":"anjianshi","email":"anjianshi@gmail.com"},"repository":{"type":"git","url":"git+https://github.com/anjianshi/ssl.git"},"publishConfig":{"registry":"https://registry.npmjs.org/","access":"public"},"type":"module","main":"dist/index.js","bin":{"ssl":"dist/index.js"},"dependencies":{"@anjianshi/utils":"^2.4.16","@types/lodash":"^4.17.13","acme-client":"^5.4.0","chalk":"^5.4.1","dayjs":"^1.11.13","json5":"^2.2.3","lodash":"^4.17.21","node-scp":"^0.0.23"},"devDependencies":{"@anjianshi/presets-eslint-node":"^4.0.15","@anjianshi/presets-prettier":"^3.0.2","@anjianshi/presets-typescript":"^3.2.3","@types/node":"^22.10.2","@types/ssh2":"^1.15.1","typescript":"^5.7.2"},"prettier":"@anjianshi/presets-prettier/prettierrc.js","scripts":{"watch":"rm -rf dist && tsc --watch","build":"rm -rf dist && tsc","start":"node ./dist/index.js --work-directory=./var","confirm":"node ./dist/index.js confirm --work-directory=./var"},"types":"./dist/index.d.ts","_id":"@anjianshi/ssl@1.1.0","_integrity":"sha512-chgyoZfKdG9bmHcJbieLogwBx5eQo/p3TNqBHN58HuOs22fpWq+r6u9ehE4PwasZlX/TNWJ690u2K70ssLCFFQ==","_resolved":"/private/var/folders/8z/71pjdbvj2lsbf7bvv0w0c1180000gn/T/e2d9194f8fc40cff14124c8e2b263e66/anjianshi-ssl-1.1.0.tgz","_from":"file:anjianshi-ssl-1.1.0.tgz","_nodeVersion":"21.7.1","_npmVersion":"10.5.0","dist":{"integrity":"sha512-chgyoZfKdG9bmHcJbieLogwBx5eQo/p3TNqBHN58HuOs22fpWq+r6u9ehE4PwasZlX/TNWJ690u2K70ssLCFFQ==","shasum":"3fb6b9a672ccde04eaa1b4f28c380c1880bd2880","tarball":"https://registry.npmjs.org/@anjianshi/ssl/-/ssl-1.1.0.tgz","fileCount":64,"unpackedSize":151139,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBy4nZb30ZVMpm55FFbPni47MTdqo7F59cuqHI7deSBVAiB140aiNI7XddNs2pS1libQZiahbLhlCUZP10xJ/AejOA=="}]},"_npmUser":{"name":"anjianshi","email":"anjianshi@gmail.com"},"directories":{},"maintainers":[{"name":"anjianshi","email":"anjianshi@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ssl_1.1.0_1735494662740_0.8292914384068248"},"_hasShrinkwrap":false}},"time":{"created":"2024-11-19T08:23:10.729Z","modified":"2024-12-29T17:51:03.202Z","1.0.0":"2024-11-19T08:23:11.081Z","1.0.1":"2024-11-20T10:05:44.965Z","1.1.0":"2024-12-29T17:51:03.032Z"},"bugs":{"url":"https://github.com/anjianshi/ssl","email":"anjianshi@gmail.com"},"author":{"name":"anjianshi","email":"anjianshi@gmail.com"},"license":"MIT","homepage":"https://github.com/anjianshi/ssl","repository":{"type":"git","url":"git+https://github.com/anjianshi/ssl.git"},"description":"Auto request and deploy SSL certificate","maintainers":[{"name":"anjianshi","email":"anjianshi@gmail.com"}],"readme":"# 一站式申请、部署 SSL 证书\n\n## 功能\n\n### 申请证书\n\n通过 [Let's Encrypt](https://letsencrypt.org/) 申请免费的 SSL 证书，有效期三个月，支持通配符（wildcard）。  \n支持对接 `腾讯云` 和 `阿里云` 的域名解析功能完成 SSL 证书的 DNS 验证（HTTP 验证方式不支持 wildcard 证书，未做支持）。\n\n### 部署证书\n\n支持以下部署方式：\n\n1. 通过 SSH 部署到服务器\n2. 通过 API 部署到云服务：\n   - 腾讯云\n   - 阿里云\n   - 七牛云\n\n### 定期更新\n\n可以配置 crontab 定期运行。\n\n---\n\n## 使用方法\n\n1. 新建一个工作目录，用来存放配置文件和申请得到的证书\n2. 建立配置文件（`config.json5` 或 `config.json`），包含 DNS 验证配置、部署目标等内容\n3. 在工作目录下执行 `npx @anjianshi/ssl@latest`，或在任意位置执行 `npx @anjianshi/ssl@latest --work-directory=工作目录路径`\n4. 也可执行 `npx @anjianshi/ssl@latest confirm` 来确认配置文件和工作目录是否正常，但并不执行证书申请和部署\n\n---\n\n## 工作目录文件结构\n\n```yaml\n# 日志\nlogs/\n\n# 已生成的证书\ncertificates/\n  ${first_domain}-${san_hash}/\n    fullchain.pem # 证书内容\n    privkey.pem # 证书私钥\n\n# 自动创建的 CA 账号的信息（优先使用 config.json 里的 account 配置）\naccount.json\n\n# 功能配置，例如要签发证书的域名列表\nconfig.json5\n```\n\n---\n\n## 配置文件格式\n\n配置文件支持 JSON5 或者标准的 JSON 格式，分别使用 `config.json5` 和 `config.json` 作为文件名。\n\n```typescript\ninterface Config {\n  // 通过 Let's Encrypt 的正式环境还是测试环境来申请证书\n  // 为 true 代表走测试环境，此时证书申请成功后，不会执行部署\n  // 默认为 false\n  staging?: boolean\n\n  // 指定已有 Let's Encrypt 账号的私钥（string），或创建新账号所需的信息（CreateAccountConfig）\n  // 若不指定，则会创建一个不指定邮箱的新账号（多次运行只会创建一次）\n  account?: string | CreateAccountConfig\n\n  // 预定义的证书验证配置\n  // 例如多个域名的 DNS 解析都挂在同一个腾讯云账号下，则可以把此账号的 API 凭证定义在这里，然后在这些域名的证书配置里引用\n  challenges?: Record<string, DNSChallengeConfig>\n\n  // 预定义的部署配置\n  // 例如多个证书都要部署到同一个服务器上，可以把服务器信息定义在这里，然后在这些证书的部署配置里引用\n  targets?: Record<string, TargetPreset>\n\n  // 证书配置\n  certificates: CertificateConfig[]\n}\n\ninterface CreateAccountConfig {\n  email?: string\n}\n\ninterface DNSChallengeConfig {\n  provider: 'tencent-cloud' | 'aliyun' // DNS 服务提供商\n  secretId: string // 服务商 OpenAPI 的 secretId\n  secretKey: string // 服务商 OpenAPI 的 secretKey\n  ttl?: number // 域名记录的 ttl（需服务商支持）\n}\n```\n\nTODO: 待补充\n\n---\n\n## 证书申请步骤\n\n1. 创建 CA 账号，例如 [Let's Encrypt](https://letsencrypt.org/) 的。CA 要基于账号来控制请求频率。\n2. 生成用于给 [CSR](https://letsencrypt.org/docs/glossary/#def-CSR) 签名的秘钥。\n3. 提供 CSR 信息（证书域名、证书申请者等），配合上一步的秘钥，生成 CSR。\n4. 用给定的方式完成域名验证。[各验证方式流程](https://letsencrypt.org/docs/challenge-types/)。\n5. 生成证书\n","readmeFilename":"README.md"}