{"_id":"greenlock-store-fs","_rev":"5-273a4f0aadf68d0ad58a250c03b2e7ef","name":"greenlock-store-fs","dist-tags":{"latest":"3.2.2","next":"3.2.0"},"versions":{"3.0.0":{"name":"greenlock-store-fs","version":"3.0.0","description":"A file-based certificate store for greenlock that supports wildcards.","homepage":"https://git.coolaj86.com/coolaj86/le-store-fs.js","main":"index.js","directories":{"test":"tests"},"scripts":{"test":"node tests"},"repository":{"type":"git","url":"https://git.coolaj86.com/coolaj86/le-store-fs.js.git"},"keywords":["greenlock","json","keypairs","certificates","store","database"],"author":{"name":"AJ ONeal","email":"coolaj86@gmail.com","url":"https://coolaj86.com/"},"license":"MPL-2.0","dependencies":{"mkdirp":"^0.5.1","safe-replace":"^1.1.0"},"gitHead":"602a4c012a76a2a9950bb255c06eb6d5c9148f5b","_id":"greenlock-store-fs@3.0.0","_npmVersion":"6.4.1","_nodeVersion":"10.13.0","_npmUser":{"name":"coolaj86","email":"coolaj86@gmail.com"},"dist":{"integrity":"sha512-LngMK+RAR+puo53pmqzcSrKinqcYwAKQGyvILuLDJXA4KJ+IUUfqk/GW2J0VDArw3iIsZkTxgXDwoIGCteO6oA==","shasum":"396542810bb9ace358aaa99e552c94aaee8d8751","tarball":"https://registry.npmjs.org/greenlock-store-fs/-/greenlock-store-fs-3.0.0.tgz","fileCount":5,"unpackedSize":23229,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcqvvACRA9TVsSAnZWagAA/U8QAJzGCK3or2WFOJcEsQBs\n9DdjeJfy4by4RJzPPdeGBBUZQiF4yhDIrHFiU+9rGgi7a/se4ckrRxv+sSEf\n4nCN9F/LaFu3ye0qGjP4yhvi3VXzlaEOlin/1a6Act9C5qFMx84ykQyAaZNk\nr63Su7ZknbbQIuNltsF8sAHJAj5U+y0jyUBht2yWHyLh5xR/SKmOr/sFwATB\nEd2W3CJsceu0SQC+vVEo7DA44vfvnXcagluH5/XnzhQMdhis/+pRGP/a5CVu\nVzmxT9CGK5STIGwoI998nnQlnb9MSqEICChRvk8oXhePLB2YkouAHLZsMyO4\nhsTRHgo5U3bUjbhMbirhDE/nCJdLQdDImm5oecFThjKw/mRTnujIkNivaArE\ndhkRLatiMGdwGgavWZJY+9zru9kmdrlx3FmIbGdra/iss1EBFXkXn3oIFlsx\n001UX6yH49mgntZiqupAdyrdhCxtMsO6Yenta6RvjEkT3CIDmO3HX1aMhhIm\nnbFHk+/rWJhFCM+/giPBJATv74jq6Ee7a0fWS6MnAIB67QU+PcbTsKOn8KH7\nO++rKWtO3yPRBo8JzijuiRsS2FY5QRL0H64S/UmGEm/FW+vCx7+wYGt8f9GW\nYWUdUhAs90lcvw3HOpacBfA0EUOR66dZPwCaE4M4XyhtZfH/lG7FtUat3LU3\nPDOx\r\n=FlHf\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICDQA3kC7ft0hLudq8H3JzVZPQmg6lqkLcI0pLTpNrPSAiEA/u8Gu9nGxv4mDRlVwW4kB2GE41SG7u064FaOl/FlJPc="}]},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/greenlock-store-fs_3.0.0_1554709439651_0.4889320731790592"},"_hasShrinkwrap":false},"3.0.1":{"name":"greenlock-store-fs","version":"3.0.1","description":"A file-based certificate store for greenlock that supports wildcards.","homepage":"https://git.rootprojects.org/root/greenlock-store-fs.js","main":"index.js","directories":{"test":"tests"},"scripts":{"test":"node tests"},"repository":{"type":"git","url":"https://git.rootprojects.org/root/greenlock-store-fs.js.git"},"keywords":["greenlock","json","keypairs","certificates","store","database"],"author":{"name":"AJ ONeal","email":"solderjs@gmail.com","url":"https://solderjs.com/"},"license":"MPL-2.0","dependencies":{"@root/mkdirp":"^1.0.0","safe-replace":"^1.1.0"},"gitHead":"aeca3c069ae756111d9a424fa4cc53be50f0ec2f","_id":"greenlock-store-fs@3.0.1","_npmVersion":"6.4.1","_nodeVersion":"10.13.0","_npmUser":{"name":"coolaj86","email":"coolaj86@gmail.com"},"dist":{"integrity":"sha512-dYsKS4eLttUNQ9OZEjnSaKPq6sBuCcY7x8F/zJmKXIuCJFcHWWj5pex76UQgDneSss388Ndt3eKeVstTR1yGHA==","shasum":"d47504e31a613d352f1013cc34f8025ead2485cc","tarball":"https://registry.npmjs.org/greenlock-store-fs/-/greenlock-store-fs-3.0.1.tgz","fileCount":5,"unpackedSize":23252,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJctWuLCRA9TVsSAnZWagAACwIP/0h8ii71IfnX/bVTDQlL\nzaElrmhRMgEHTs0yIpRWKOHlUyvulVn9pDQpHoCNja+F4bgJwuI7ur9XouS3\nlXbZBEw1llXZJEh/FHxBnUF7RpkJLZosxgetXF4XngK3LzPPZPjUd3/0J2Sb\n+Cwwyw2TpEZBM7Q84dNNhIlDw0iSZ70v4X5tw45vjBmfnABGl8KgM9WYbkR6\nYo2wQMaX9opwPVaenvssv0RYXwxdZE7RmZoUhmHrgYZxDJmKFba9tzoJkAAT\nOFmsndv8vvDcHw5c+45u9LvjIUE58f+TtxHL4DDisUdp/gTlZlj4vF84sVF6\n0XxXQNuyKDHiGZ9xUsuga/KOYPL3fc50kp17HlopyHdPGMUwQkODNabKSHaD\n7k3ppgjg1zDAwUQKoLCdmMUiZx5HvQHCuZNbrAy8fs1PD4nKatx/G6n/HUoL\nQop1v3JdgQm4DcgCgsNHIDSvP1rsQuVfxQxiUEOh2ppClkLbqkjhKT0Svkky\nROG50vQQ9Pem7NRovENg5FocUOSjVPjswLXrVZythvPaSFIqbLpPhsa7UkLH\nlTNkbloaA1vFWYZ1yJgw0U5TV3x/jm8q+1vSutlbr8krBHCcdTcB6YclccMd\nQUuItvpJbG1+phSd3tQZC9kaL+ziryTtyhWKHzxKhraT1JjrN339E7cRNXK+\noCYq\r\n=NvFh\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCpDD97DxQfGahV6U7r+2WRtP+0OOKjjbXWNLN1w7mE3gIgLHuewmftxPUX9ywGgwKOWTafSaXx1ac1nY99luFJgSg="}]},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/greenlock-store-fs_3.0.1_1555393418876_0.7110523844666665"},"_hasShrinkwrap":false},"3.0.2":{"name":"greenlock-store-fs","version":"3.0.2","description":"A file-based certificate store for greenlock that supports wildcards.","homepage":"https://git.rootprojects.org/root/greenlock-store-fs.js","main":"index.js","directories":{"test":"tests"},"scripts":{"test":"node tests"},"repository":{"type":"git","url":"https://git.rootprojects.org/root/greenlock-store-fs.js.git"},"keywords":["greenlock","json","keypairs","certificates","store","database"],"author":{"name":"AJ ONeal","email":"solderjs@gmail.com","url":"https://solderjs.com/"},"license":"MPL-2.0","dependencies":{"@root/mkdirp":"^1.0.0","safe-replace":"^1.1.0"},"gitHead":"a4aae8647d9e39db2f2cbddb1790fbbd0cf942eb","_id":"greenlock-store-fs@3.0.2","_npmVersion":"6.4.1","_nodeVersion":"10.13.0","_npmUser":{"name":"coolaj86","email":"coolaj86@gmail.com"},"dist":{"integrity":"sha512-t4So75yKs1+7TqmxD5UKdf+zOQU0/4o0lb2auf5zUcAo7fwwNLOAXyWnnZRL3WuFBUiBGh1qXWleuMua0d3LPg==","shasum":"54efe8f4977e6e62840b114361584ec34622b80a","tarball":"https://registry.npmjs.org/greenlock-store-fs/-/greenlock-store-fs-3.0.2.tgz","fileCount":5,"unpackedSize":23252,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJctWv4CRA9TVsSAnZWagAAfAAP/Ar6+lygJBD4pY2JEGFw\nE28EqWkpiw7SG8ykmvV9QeMpVnW41n4E2tVf/hmfgzF4sLVAkG3vFjNZxFxS\n2TFx3rz7zhjyuQ7rJWg1sKjbVEpNkWZbEHzoiQB0N+no540qlmLvDlK+zLTz\ncJ1JVQmpME4lHbOkawvozoNv49FjVn8lUk/FnPHPyplEJX0x8k3DeaHq+k8g\nR5yMLSIuoyxg/mqD2EJ2VcqACcsRQNhLwMyX3WsBetEmRv/0+JuN51+q8hSe\nmV1Wy0f2pSuzzWI7I1a9iBIJ1nyvt6Hg+oyhI7mx9NeXJDflI5z2Mvpv9wjj\nDQFLnzNSN2JOP2H+z6sAFzezKQTpgoqw9IzAzjbQfDM1kTHj0I+2pE8maRfV\nX+BQHxf815x8+C5Y6bBPjAQn/VGCpCHTdHlpztcij1ukGhPeysISZ5Ha1UYP\nzNCQV80NvHTySxrAZG2EcW6yOugJ/9SlNsN3AUcjoUoul1u3XrVff8HUYAmw\n0YssAUqe+cWinYq3iMZ3HpiAzmMwti3JgupXyjitC2HCXkoozrSMMvlriNft\n7977BdxbzKnVIi7NdGth2SpSIwjyoefSK2I1VF7r0pXPZ2byMOYj+KQoVmpg\nKge+ivmGtzV0R4mY2ASaqD4onN10K0hwOG2yFMSw1OUC2t7Ms8r4cPtzwRYD\n3syc\r\n=ZCz1\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCZnYqi4t9KhpKx/MLXny4BrWxnSBzCpL2wUxCa0uPSigIhALa+WM9I7iu5mnrCPgw7cU/uct/DHdqUn3cWyal2bR5B"}]},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/greenlock-store-fs_3.0.2_1555393527746_0.1108836679103633"},"_hasShrinkwrap":false},"3.2.0":{"name":"greenlock-store-fs","version":"3.2.0","description":"A file-based certificate store for greenlock that supports wildcards.","homepage":"https://git.rootprojects.org/root/greenlock-store-fs.js","main":"index.js","directories":{"test":"tests"},"scripts":{"test":"node tests"},"repository":{"type":"git","url":"https://git.rootprojects.org/root/greenlock-store-fs.js.git"},"keywords":["greenlock","json","keypairs","certificates","store","database"],"author":{"name":"AJ ONeal","email":"solderjs@gmail.com","url":"https://solderjs.com/"},"license":"MPL-2.0","dependencies":{"@root/mkdirp":"^1.0.0","safe-replace":"^1.1.0"},"readme":"# [greenlock-store-fs](https://git.rootprojects.org/root/greenlock-store-fs.js) | A [Root](https://rootprojects.org) project\n\nA keypair and certificate storage strategy for Greenlock v2.7+ (and v3).\nThe (much simpler) successor to le-store-certbot.\n\nWorks with all ACME (Let's Encrypt) SSL certificate sytles:\n* [x] single domains\n* [x] multiple domains (SANs, AltNames)\n* [x] wildcards\n* [x] private / localhost domains\n\n# Usage\n\n```js\nvar greenlock = require('greenlock');\nvar gl = greenlock.create({\n  configDir: '~/.config/acme'\n, store: require('greenlock-store-fs')\n, approveDomains: approveDomains\n, ...\n});\n```\n\n# File System\n\nThe default file system layout mirrors that of le-store-certbot in order to make transitioning effortless,\nin most situations:\n\n```\nacme\n├── accounts\n│   └── acme-staging-v02.api.letsencrypt.org\n│       └── directory\n│           └── sites@example.com.json\n└── live\n    ├── example.com\n    │   ├── bundle.pem\n    │   ├── cert.pem\n    │   ├── chain.pem\n    │   ├── fullchain.pem\n    │   └── privkey.pem\n    └── www.example.com\n        ├── bundle.pem\n        ├── cert.pem\n        ├── chain.pem\n        ├── fullchain.pem\n        └── privkey.pem\n```\n\n# Wildcards & AltNames\n\nWorking with wildcards and multiple altnames requires greenlock >= v2.7 (or v3).\n\nTo do so you must return `{ subject: '...', altnames: ['...', ...] }` within the `approveDomains()` callback.\n\n`subject` refers to \"the subject of the ssl certificate\" as opposed to `domain` which indicates \"the domain servername\nused in the current request\". For single-domain certificates they're always the same, but for multiple-domain\ncertificates `subject` must be the name no matter what `domain` is receiving a request. `subject` is used as\npart of the name of the file storage path where the certificate will be saved (or retrieved).\n\n`altnames` should be the list of SubjectAlternativeNames (SANs) on the certificate.\nThe subject and the first altname must be an exact match: `subject === altnames[0]`.\n\n## Simple Example\n\n```js\nfunction approveDomains(opts) {\n  // Allow only example.com and *.example.com (such as foo.example.com)\n\n  // foo.example.com => *.example.com\n  var wild = '*.' + opts.domain.split('.').slice(1).join('.');\n\n  if ('example.com' !== opts.domain && '*.example.com' !== wild) {\n    cb(new Error(opts.domain + \" is not allowed\"));\n  }\n\n  var result = { subject: 'example.com', altnames: [ 'example.com', '*.example.com' ] };\n  return Promise.resolve(result);\n}\n```\n\n## Realistic Example\n\n```js\nfunction approveDomains(opts, certs, cb) {\n  var related = getRelated(opts.domain);\n  if (!related) { cb(new Error(opts.domain + \" is not allowed\")); };\n\n  opts.subject = related.subject;\n  opts.domains = related.domains;\n\n  cb({ options: opts, certs: certs });\n}\n```\n\n```js\nfunction getRelated(domain) {\n  var related;\n  var wild = '*.' + domain.split('.').slice(1).join('.');\n  if (Object.keys(allAllowedDomains).some(function (k) {\n    return allAllowedDomains[k].some(function (name) {\n      if (domain === name || wild === name) {\n        related = { subject: k, altnames: allAllowedDomains[k] };\n        return true;\n      }\n    });\n  })) {\n    return related;\n  }\n}\n```\n\n```js\nvar allAllowedDomains = {\n  'example.com': ['example.com', '*.example.com']\n, 'example.net': ['example.net', '*.example.net']\n}\n```\n","readmeFilename":"README.md","gitHead":"de0f4d25b431a1793d52fccb7e90b5c0f982f84a","_id":"greenlock-store-fs@3.2.0","_nodeVersion":"10.13.0","_npmVersion":"6.10.1","_npmUser":{"name":"coolaj86","email":"coolaj86@gmail.com"},"dist":{"integrity":"sha512-zqcPnF+173oYq5qU7FoGtuqeG8dmmvAiSnz98kEHAHyvgRF9pE1T0MM0AuqDdj45I3kXlCj2gZBwutnRi37J3g==","shasum":"827735e8c0659dbb7ea5c47be68e65c519919e5d","tarball":"https://registry.npmjs.org/greenlock-store-fs/-/greenlock-store-fs-3.2.0.tgz","fileCount":9,"unpackedSize":25400,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdtrPjCRA9TVsSAnZWagAAkGgP/12Ddcpac75bSzl23un+\nKX6l6oXG9dOhmxO20lYn/90or9oV3ZuYAOeY8HqtRkbmluItQX5D9FYptOCo\nPQzuTR/U0sX/8qCEqJEELbS/U7VdeliU/3o1RfW46SzjiZ4mA1O6PkXz/m7m\nOYQTFK+fsnkORnF3AjG/8Tnfud3THApfNdUU+LVcZSLV9+2Jtb6V/yf+AeKK\nKpkyMpZRzts7b9a5VGNobUzrvTClimDvPoQH96IlmFhu3+lyeaWDct6uCHij\nJwMKB6FLMnVC+2T2tDrZ53RO4jXTA/dKdQ3AR41rqJU8sx4NCnI5EZm/vcZW\nkXhdCGJhdB3Cgn6wi0GE57JmydOG+LCDqwzZq23f16mh9PfxJCrGIliCMcT6\n1z/wq+XHZ00UMW+nrgie4F23X3zWy9HHGvzBWSihl/Q2hfPq2UVaNpKBw5H4\n87NqYKYhmeV3N8wTFOiNKoPL8gkDT1J7I4uj4y1D6p1PqYMFe3pD3TyGDJhb\nRbe6xCZZ3CaBsbXkVr/yZh18IOdnuSsWjDyG1S/DB09myHYdsBw2ndFCeBwH\nWQiRnCWZgRw97dO0YOZBs1NWvb3kf/RiTtRFin5++zhRNDZ2Bpqx8sp+9HJ6\n78krTVr7fZJ9NxmLcTOVBSRsN6YpVnoQ7yZCPDgZvB6I2xWPa/4PgXaXQnqd\n3aCB\r\n=9GPv\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCtyu0g8uH0bZkaI8q/FZpIxSjvOCrXjdYANiJs3QsDmAIhAIyGpv/NFU0J074eg2wDyZKJrC1+mhU4nzwcpI2+EQe6"}]},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/greenlock-store-fs_3.2.0_1572254690693_0.9889847750342355"},"_hasShrinkwrap":false},"3.2.2":{"name":"greenlock-store-fs","version":"3.2.2","description":"A file-based certificate store for greenlock that supports wildcards.","homepage":"https://git.rootprojects.org/root/greenlock-store-fs.js","main":"index.js","directories":{"test":"tests"},"scripts":{"test":"node tests"},"repository":{"type":"git","url":"https://git.rootprojects.org/root/greenlock-store-fs.js.git"},"keywords":["greenlock","json","keypairs","certificates","store","database"],"author":{"name":"AJ ONeal","email":"solderjs@gmail.com","url":"https://solderjs.com/"},"license":"MPL-2.0","dependencies":{"@root/mkdirp":"^1.0.0","safe-replace":"^1.1.0"},"gitHead":"5490a194eb947b09269cc005a7a79a8c924e6527","_id":"greenlock-store-fs@3.2.2","_nodeVersion":"10.13.0","_npmVersion":"6.10.1","_npmUser":{"name":"coolaj86","email":"coolaj86@gmail.com"},"dist":{"integrity":"sha512-92ejLB4DyV4qv/2b6VLGF2nKfYQeIfg3o+e/1cIoYLjlIaUFdbBXkzLTRozFlHsQPZt2ALi5qYrpC9IwH7GK8A==","shasum":"e404d3cc1fbaf88dec6914ea2c10d4b31256faa2","tarball":"https://registry.npmjs.org/greenlock-store-fs/-/greenlock-store-fs-3.2.2.tgz","fileCount":10,"unpackedSize":29989,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdvdh5CRA9TVsSAnZWagAAog8P/ArgjFVBSiQxnLPovDrM\nCN6+PCSdtZ3r9DUY4uTYZiB4PeIayjmed/offABphd7SR2ntN/U7LhpfvrOj\nE+dfr6C0qWuND6KzYHaTZGH+PU2bzqS3Ia1Plcv1wm+q9/FwLAycaM5zBT6S\nL8zLBahu5F64VVZN/ChK6mn7BCzzxN65fLk4W2YbWvF7rrIqaBOwFUoOS4gE\nTsIPDZNFpY4YSpJYbW2gwLcDOfniZ04YYDDzh75PVSbLl78qJQtvOdynhsrO\nxVzbE4lbbVd91LHn2QGJKQj6PCIhT5GlKBC1neml54hMwe2RQdB0kwncfZmt\n8UuJ4T+Qbkhz+iiR2KzyiHJbFS10ArzeI3ifWJ354hFp51/wBs4Kzv+/ZZhM\n6jivkb3RWAiPecZabfDhOoYX4g0fqfaKcp7edPuwEmf3qnuG6igNfATH0M4T\nfxErw33Jbp4uU+qihsOpwdGSOg6Wzj68RWD7qrWeC6zozkiEInLPG1IzNYwL\noZe4c927NETn+qACjgbY6X8c3UeqHhC6p8yRsuxiE2EUesbpDEMFXKA4HmJN\naNEP0GbfExHxMYF/Go0IM8rTyd4X1cdbp+bEoi9807D2cf0sEag3nuqrtPU6\nwE6rlj0VwzAKxMrciEgUddNBY7g26c68BH/5s8X4iEJ9B1Db/GA6osCwSo5A\n2ngP\r\n=s/aD\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEZN39cO49tuW3ThZND5D5fvAP9TDxQymr0rCFeRnBGIAiEA8SDrFX/Q1vZNUwkM29/pJtozPbjwR15GuAlBXQ3NLXw="}]},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/greenlock-store-fs_3.2.2_1572722808835_0.8630977281124279"},"_hasShrinkwrap":false}},"time":{"created":"2019-04-08T07:43:59.650Z","3.0.0":"2019-04-08T07:43:59.812Z","modified":"2022-05-04T03:51:15.707Z","3.0.1":"2019-04-16T05:43:39.075Z","3.0.2":"2019-04-16T05:45:27.855Z","3.2.0":"2019-10-28T09:24:50.820Z","3.2.2":"2019-11-02T19:26:49.093Z"},"maintainers":[{"name":"coolaj86","email":"coolaj86@gmail.com"}],"description":"A file-based certificate store for greenlock that supports wildcards.","homepage":"https://git.rootprojects.org/root/greenlock-store-fs.js","keywords":["greenlock","json","keypairs","certificates","store","database"],"repository":{"type":"git","url":"https://git.rootprojects.org/root/greenlock-store-fs.js.git"},"author":{"name":"AJ ONeal","email":"solderjs@gmail.com","url":"https://solderjs.com/"},"license":"MPL-2.0","readme":"# [greenlock-store-fs](https://git.rootprojects.org/root/greenlock-store-fs.js) | A [Root](https://rootprojects.org) project\n\nA keypair and certificate storage strategy for Greenlock v2.7+ (and v3).\nThe (much simpler) successor to le-store-certbot.\n\nWorks with all ACME (Let's Encrypt) SSL certificate sytles:\n\n-   [x] single domains\n-   [x] multiple domains (SANs, AltNames)\n-   [x] wildcards\n-   [x] private / localhost domains\n\n# Usage\n\n**Global** config:\n\n```js\ngreenlock.manager.defaults({\n    store: {\n        module: \"greenlock-store-fs\",\n        basePath: \"~/.config/greenlock\"\n    }\n});\n```\n\n**Per-site** config:\n\n```js\ngreenlock.add({\n    subject: \"example.com\",\n    altnames: [\"example.com\", \"www.example.com\"],\n    store: {\n        module: \"greenlock-store-fs\",\n        basePath: \"~/.config/greenlock\"\n    }\n});\n```\n\n# File System\n\nThe default file system layout mirrors that of certbot (python Let's Encrypt implementation) and\nthe prior le-store-certbot in order to make transitioning effortless.\n\nThe default structure looks like this:\n\n```txt\n.config\n└── greenlock\n    ├── accounts\n    │   └── acme-staging-v02.api.letsencrypt.org\n    │       └── directory\n    │           └── sites@example.com.json\n    ├── staging\n    │   └── (same as live)\n    └── live\n        ├── example.com\n        │   ├── bundle.pem\n        │   ├── cert.pem\n        │   ├── chain.pem\n        │   ├── fullchain.pem\n        │   └── privkey.pem\n        └── www.example.com\n            ├── bundle.pem\n            ├── cert.pem\n            ├── chain.pem\n            ├── fullchain.pem\n            └── privkey.pem\n```\n\n# Internal Implementation Details\n\nYou **DO NOT NEED TO KNOW** these details.\n\nThey're provided for the sake of understanding what happens \"under the hood\"\nto help you make better choices \"in the seat\".\n\n# Parameters\n\n| parameters        | example                                                  | notes            |\n| ----------------- | -------------------------------------------------------- | ---------------- |\n| `env`             | `staging` or `live`                                      | -                |\n| `directoryUrl`    | `https://acme-staging-v02.api.letsencrypt.org/directory` | -                |\n| `keypair`         | `{ privateKeyPem, privateKeyJwk }`                       |                  |\n| `account`         | `{ id: \"an-arbitrary-id\" }`                              | account only     |\n| `subscriberEmail` | `webhost@example.com`                                    | account only     |\n| `certificate`     | `{ id: \"an-arbitrary-id\" }`                              | certificate only |\n| `subject`         | `example.com`                                            | certificate only |\n| `pems`            | `{ privkey, cert, chain, issuedAt, expiresAt }`          | certificate only |\n\n### Account Keypair\n\n```js\naccounts.setKeypair = async function({\n    env,\n    basePath,\n    directoryUrl,\n    email,\n    account\n}) {\n    var id = account.id || email;\n    var serverDir = directoryUrl.replace(\"https://\", \"\");\n};\n```\n\n```js\naccounts.checkKeypair = async function({\n    env,\n    basePath,\n    directoryUrl,\n    email,\n    account\n}) {\n    var id = account.id || email;\n    var serverDir = directoryUrl.replace(\"https://\", \"\");\n\n    return {\n        privateKeyPem,\n        privateKeyJwk\n    };\n};\n```\n\n### Certificate Keypair\n\n```js\ncertificate.setKeypair = async function({\n    env,\n    basePath,\n    directoryUrl,\n    subject,\n    certificate\n}) {\n    var id = account.id || email;\n    env = env || directoryUrl.replace(\"https://\", \"\");\n};\n```\n\n```js\ncertificate.checkKeypair = async function({\n    env,\n    basePath,\n    directoryUrl,\n    subject,\n    certificate\n}) {\n    var id = account.id || email;\n    env = env || directoryUrl.replace(\"https://\", \"\");\n\n    return {\n        privateKeyPem,\n        privateKeyJwk\n    };\n};\n```\n\n### Certificate PEMs\n\n```js\ncertificate.set = async function({\n    env,\n    basePath,\n    directoryUrl,\n    subject,\n    certificate,\n    pems\n}) {\n    var id = account.id || email;\n    env = env || directoryUrl.replace(\"https://\", \"\");\n};\n```\n\n```js\ncertificate.check = async function({\n    env,\n    basePath,\n    directoryUrl,\n    subject,\n    certificate\n}) {\n    var id = account.id || email;\n    env = env || directoryUrl.replace(\"https://\", \"\");\n\n    return {\n        privkey,\n        cert,\n        chain,\n        issuedAt,\n        expiresAt\n    };\n};\n```\n","readmeFilename":"README.md"}