Skip to content

Instantly share code, notes, and snippets.

@relative
Last active July 2, 2024 20:39
Show Gist options
  • Save relative/47b0d11a64e7b4967c84be2481e0971a to your computer and use it in GitHub Desktop.
Save relative/47b0d11a64e7b4967c84be2481e0971a to your computer and use it in GitHub Desktop.
dasfadgdagadhgadgadgadgadkogljdagjdasklhfsadijhuioafjhoikflh

Creating keys

gpg --gen-key

Real name: GitHub Master

Email address: blank

(O)kay

No passphrase

export GH_MASTER=CA010911789A83003C8B0DCE6181ED9B8E06E2A0

Customer

gpg --gen-key

Real name: GitHub Customer

Email address: blank

(O)kay

No passphrase

export GH_CUSTOMER=A5AA7810E4DAE9623F9802A9FF59329AC76273DF

License

gpg --gen-key

Real name: GitHub License

Email address: blank

(O)kay

No passphrase

export GH_LICENSE=E255BAA942069AC9F3DEAE17CA84BDED14B04C46

Package

gpg --gen-key

Real name: GitHub Package

Email address: blank

(O)kay

No passphrase

export GH_PACKAGE=1CAD186F7502D489CA97A16F52965E4AD4A53015

Signing the keys

gpg --default-key $GH_MASTER --sign-key $GH_CUSTOMER # y
gpg --default-key $GH_MASTER --sign-key $GH_LICENSE # y
gpg --default-key $GH_MASTER --sign-key $GH_PACKAGE # y

Exporting the keys

mkdir enterprise && cd enterprise # CWD = enterprise/
gpg --export $GH_MASTER > master.gpg
gpg --export $GH_CUSTOMER > customer.gpg
gpg --export $GH_LICENSE > license.gpg
gpg --export $GH_PACKAGE > package.gpg
cd .. # CWD = /

Creating your license

uuidgen # save this UUID for your license's customer key (ex: e0619513-9717-4686-9f02-764aff4375e2)

gpg --gen-key

Real name: Company, LLC (e0619513-9717-4686-9f02-764aff4375e2)

Email address: blank

(O)kay

No passphrase

export GH_LICKEY=6B4546EB2A1A5D729B5DA4427B3A5F9BC9ABED2D
gpg --default-key $GH_CUSTOMER --sign-key $GH_LICKEY # y

Doing the license key thing

mkdir license && cd license # CWD = /license/
mkdir gpg && cd gpg # CWD = /license/gpg
gpg --armor --export-secret-keys $GH_LICKEY > secring.gpg
gpg --armor --export $GH_LICKEY > pubring.gpg

cd .. # CWD = /license/
# Paste the contents of metadata.json in this gist to the file metadata.json at license/
# Add the pubring.gpg and secring.gpg to customer_public_key and customer_private_Key respectively. Use \ns in place of newlines
# you may use
# sed -E ':a;N;$!ba;s/\r{0,1}\n/\\n/g' pubring.gpg
# sed -E ':a;N;$!ba;s/\r{0,1}\n/\\n/g' secring.gpg
# thanks stackoverlofw https://stackoverflow.com/a/38672741

tar -cvf ../license.tar *
cd .. # CWD = /
gpg --default-key $GH_LICENSE --sign license.tar
mv license.tar.gpg license.ghl

Your license is now at /license.ghl

Setting up the GHE instance

Move the files in enterprise/ on your local machine to the GHE instance at /data/enterprise (Overwite them). All of the files are binary so you could upload them to x0.at and curl them on the instance.

Then, edit vault.rb (example in the Gist) with the MASTER_KEY thing

Change the contents at

  • /data/enterprise-manage/current/vendor/gems/ruby/2.6.0/gems/enterprise-crypto-0.4.22/lib/enterprise/crypto/vault.rb
  • /data/github/current/vendor/gems/2.6.4/ruby/2.6.0/gems/enterprise-crypto-0.4.22/lib/enterprise/crypto/vault.rb

to the edited contents

Then run

sudo reboot

to restart all services so they pick up the new keys

Activating the GHE instance

Go to https://(ip):8443/setup/upgrade and upload your ghl file you generated, everything should work.

{
"reference_number": "abcdef",
"company": "Company, LLC",
"ssh_allowed": true,
"cluster_support": true,
"croquet_support": true,
"custom_terms": false,
"support_key": null,
"unlimited_seating": true,
"perpetual": true,
"evaluation": false,
"learning_lab_seats": 0,
"learning_lab_evaluation_expires": null,
"insights_enabled": true,
"insights_expire_at": null,
"advanced_security_enabled": true,
"seats": 0,
"expire_at": "2030-10-10T23:23:59-07:00",
"customer_private_key": "-----BEGIN PGP PRIVATE KEY BLOCK-----\n\n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\nWFLoUiv+uNY=\n=vora\n-----END PGP PRIVATE KEY BLOCK-----",
"customer_public_key": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQGNBF9xB5sBDADVA08kqu2lUAD4Qh/V2EAWk0d+bhZL/l/gKdCtEMg21O6q7Oip\nFp8YZTLRvMVjDsszEuGam70/xmWsBec1AdW8RjhLZVYru1OIM5jLEgJTky47yyFF\nM2JJElrSaFiHU+oTCqkqgQOEt8yM3u56ZcPoek9HSUQQ8AKL9Xk6O/4lAg4ALU0m\nJ5rMPzxKzz3WE9j2HVwVDLw5nsQ9uB5ljYm1AGhfRn4V/U9S7lwxkOQhYIQaUA0H\nZpX72jc3O1j9CsNPxBKcyQiFrNxyoBOvb6lFVvBEuy0VyYNCRPfky7ihBq5bqaBR\najAaAjS+lVanPPsWGaBP9CE4qeRFqvjzdRl58HNKsxlirmzHwDEMlK19M9FtNjkj\nlhHK55s4mXw6DneVmnRNRlbU+M/XjFWPKTHOdJbtbTsnswoN21oslol3FjEmSIn8\nBdpzGtu/SShLSVVaxWozHM7yGxwp0O984KDmF7JKHmf8XNffl/rEfq6HgXkKXMWa\nUTmgbgpIzB8UOGsAEQEAAbQNR2l0SHViIE1hc3RlcokB1AQTAQoAPhYhBMoBCRF4\nmoMAPIsNzmGB7ZuOBuKgBQJfcQebAhsDBQkDwmcABQsJCAcCBhUKCQgLAgQWAgMB\nAh4BAheAAAoJEGGB7ZuOBuKgEukMAKYbpNSSCwbFfHa5qWgWnnwlnNiRqbUeJrD1\nE/KZExg2gIikiDRO19852nSNKCIG37FYP78/FfkpNsRQeq4zgV2ugeaRC1dTd+XH\nhjoU5Q2P2Q938NQSIZ5yChM9sQpnXCapvVruVKULiMGExnk2jc3Z7nCwSvfEWHvs\nlFxtgEkpy6Carx+cdVGh7OlKpfGSg5wBjBp1X+CQmvl8nfDp8F3OoL9VF14/jvcd\nqgjq9lMNAKs64L2h/4HCfw7NY1uhv3fq5KOXgb3KQucxkBteJ1oR2d6HrnjnP4mO\n1VQ2CZDThQ3MN7gM0oOlHXea0LVM29sIEZ0ZvzyZ44Jhtc968yXhkciIlU5u4lPM\nqVq5Iv4fIFQEws1/DhlXrydR0FOOv4kOrADmmEW3nqbIBm+cmi+uxvPCD0QuB4HS\nOQOHPxYBYaAfklKkuJV7kFe29SS1FoaSdtDFT3boesW1tnY9Xuufng8T454SPtDQ\nIgymYiVGLksA+aniad0xdXisfT5NELkBjQRfcQebAQwArMi1HuIa87w0M5JSVBIH\nVNdvQvBEKO/u9Y3yQuaHL9seDb9nsdL93+D/3qxplZGlnflsGGSp8DiOZN1ImZfL\n32QlKzeFflgbDNueHaQ96NIhb2fL9KRvaatR/iJZdIig7ayK5QwJiaF2jIyJqDVV\nYZj6vb+6KvENU4aG0sRNDm19OP1HGWlVcMz0lTmOXSXdugALngCaTfwTEvBcaoZw\nho0FB5jDlA7A2xLgMiN7mwTTV1nPL+i0tUZ8hBfEHYjKSKp09i2d2Ne7LesF6Noa\nfCvfZQBeWhDTSybj+ojGUL3E0Re8GpQ6rYy3fmdeYbQ5m/w2XmcB2hcNFlQgS//Y\nw7PAZKngMAy9dOZsmioK88Gj+AzvtRg2g1BD4wvKqWvEi0ot1sl5/qXJLGmXoJZr\nKyFMpd7dpRkQz5HBUX+NWMCytHZ3zPmqAp0nMSNHSrl19X2QvSRuReZj+r0LCJcP\nFu6USquGfYDLcJSQj1+UToGo8lkx/U8KqbWk95xvMU89ABEBAAGJAbwEGAEKACYW\nIQTKAQkReJqDADyLDc5hge2bjgbioAUCX3EHmwIbDAUJA8JnAAAKCRBhge2bjgbi\noOCMC/0dW/kDyGphLqrukQ2bvvNVhqRcsYwAKdu53bkIc1IjgsfEg2Ho9ZZxh8Kh\nYoY++wVe4bfWbkhwhTMxz8qi3xfGS+LHIR2+xR9aTLn7gF1Ue9KEe6ocq5MfWU6y\nwdeMb50zcMsYSqsXmJMhU3kKGzxbPCKwiVVNKzj29gaW95UrFzPOc1bxNavS7BPM\nMhb0LmHtcJDen0MB50g9bu9IJ1sYm+ey1KOmWwprZUFp+C4D7zU9IVjLso0+GDWx\ndQF2J2tn6+a3s+pzOMh2zZX0KLQKwAhOmNh9J6zqX8mddFrMaO3a8MGs3/apJZNv\ncM5Of3ZAWgjIW/FCwwmzGadJCft/kr502gQKlqUsHD+mfL9burmAiuM+E+481C9K\nJ4E7vCXXqNRCmq1Dkw+dE/2tl7BfTeNZgJK4GquREU6cFo43jG9eLP/weDCZhJ0J\nXUAOmgZLnXBdFIil8Qo5juE5C3nQZE5kyQ0ho7IXD8KX7Gx64hlaFBbneqaL6DUq\nTKiPGruZAY0EX3EH8AEMAKWABx6tGkuEYpUI9kWjw929l2YdmKFGhya0yCGG67E8\nNCCjlqqyfIdXLJAuqVqtR1CCWfhe017BAQAw19eWw70qb7kSLzlSfC8NotBW9afy\n3f2kNM9KEUA3QYk5jqL9S0TWOviccv4dolky6A/Inixw9OHWggXDyctkVPwEv6/K\nm0tLZxPVoZUuoAI4cqXiEkeQ6KAbuH5B2TEJwrjVtYyklf4GIylx0AQ020sT5Z0W\nBNp8gZzFNv7xstNwsZxdfXNbOUmUyWJTffS9eO8T/O+6hXJk6DKl0JsG2QcFBKCA\noCFKNn6F2w0X2HAQecC4QmI5IzjkMP13o8s78SaqB1j+D0ZKN7O2IdH+N5paBtfo\ngiiDxefPe+8GiS8AE96KhzznX1SODF/VfJXHdDRkGnJS9I68uPKD+RtZdUGdNnLa\ncCto526uWpYgB8n3bsBebsLmeC+PAqPp7XrI5lARsNiq3tmMsb7/EVaPq360W2m/\n7yrx3zgCYaB/KE3yJG+/DwARAQABtA9HaXRIdWIgQ3VzdG9tZXKJAdQEEwEKAD4W\nIQSlqngQ5NrpYj+YAqn/WTKax2Jz3wUCX3EH8AIbAwUJA8JnAAULCQgHAgYVCgkI\nCwIEFgIDAQIeAQIXgAAKCRD/WTKax2Jz386MC/9CAV2BmgzOa2YkjovVvh+jZNub\nvLtp5SlQ8bNY0jD7ZOeVBN2Q/yBxZEt+kHIyS7DbbQiNZ0jJ3jO/OZAUPP87YhSs\nC88qk84qCtWSMCPRUWWKsBsG1wl9mMWuPTlkoPdoyTnZ4LqXhVkepK4JWMXY03qy\nF+SJGBYAi3/5W0PCAGBrReVpLNgdKFr+mPMrrj/CFAtPEUUZOVFZ93zf02bI1sGf\nSY5HaWuBH+493WGFkCBBFnQiKRxisfeJ1ju9Ntg/FmFjMlUYmNwEvMD4RZjehni0\nGl4/4XXwZ+sfogjskRZxmV8Z3r1sk61a+gc+OC1ckPpEHbpi+1G1nEnpZGT04PCL\nLyEre13yrdzUsdri25D0mR8vsoB/bnpML+VXVw551mjsuktcsAZVGxkRRQ3CZceV\nf6xYsT5krweDNOwASqVo2kFbMWocJmcJupa/7TgFxzUv769c/Rf+3b+gr2Zpicbf\niLsd1xnc2JArs5QkY5aELwmr43XBBJqbvX0+giyJAbMEEAEKAB0WIQTKAQkReJqD\nADyLDc5hge2bjgbioAUCX3EI1gAKCRBhge2bjgbioMMzC/9DKnWE8HeHEigpABSu\nCFvH22YOzAbbuo5A5EsOJaux2mN2uKW8S4jWwwpprj+UlofRb3Iqj5yYRlyzcpK3\n+wpM+M2zQgZhU6vkrxrLzWbdXECOp1zIgGGj4c2HaRbfGs30y84g5AmfwSfMLeXv\nco9zQ9/2JibhBcdi4kQZqNGR0vskKQ4Xoi7ZGRrSX+X3JLojuW+EXmBSARDYXSFp\nE2KLOhC/VCx+IFB3lOQW8kdWWCcPkb6Tfy3ibF/7M1LuI5VSYA8xM3lJ8E7tFfN4\n9jAnKwlujiH8GavVojg3Ko6P01h8EL1QJWUjIF4RWSInP0bXX99p0aiEnkuiZcpi\nUFcZz23zMJR//LunYmz/p49uKjcBKo8WYoJxbLfb5f8WiHbi8p47gbqZLCYTz7SQ\nOf26l8hPlhUdUuJngTtrKU1LfhMFNUq7XJlc6SEUSN4BA97fZRUeFq9BJLYvRTqR\nBMr68JhNkMyXPqs0XmXeoOdBMN18Dzr2uuBKAPMFXuakBBy5AY0EX3EH8AEMALkx\nUFIhIjGvTlwiYgWBT4yuLY4g7/JPx7RpM45d/72+iv+1jm89+zlik+WAS+FatBAz\nFwfcohFKBNcKuaPHM6BJ93K7/IQPLIX1M8KBQSlSuvi2uKvzBKdxtbwpnxsWlt1A\nWJc9hzxn1w01jCc6HOD1OC4YLXDACdUnM4N2RXBnnS2Gpy/oxlJsTu8Z48/YgY3s\nlwBkTXJl4YB9eMZpe0z5q/+kIVI+lLZu7YfeJZ7Ah8RE5vcd+/9By8QI2IUQpTXE\nHDV8+Ybgs0WrXPww0PLzfiqmf6R4mqMsr8W3PZbWcVrE9Im2ZwRyaKwmWMej951V\nnZ8rWhwkA0dhPQ+SPEL8D9u7ygdQq0w+kMkq9xtbz9F4G3nGjoPMGRH0LKO0wx7+\nX/3MXyoBemP5BGvF7e3NgNRRHGz94d90I7iUyAVxYofKoX3AALPezbhsgpwILJ45\nhSXRap2awDRagWyyoE8KT45ldOzwnvhIVY7qHWN1eas0D5Xo34nyQZXlwO5UzwAR\nAQABiQG8BBgBCgAmFiEEpap4EOTa6WI/mAKp/1kymsdic98FAl9xB/ACGwwFCQPC\nZwAACgkQ/1kymsdic99PSAwAjOE2WpyKPDOlk7dM6Jx4sDElOWHb97wdCy8DP9N6\n2ZyCDCWo+wIIaqL2R5UqkXo21CPp+VyX7S8bZMgl/KwhYis5Sg/OQeLi5ETkstlR\nV0mSl9kkR3157WQpSIIFh5MKLXf6k8+hOM2YTXrPQHpU8Qz2GXu9NKOEHVf8rP6T\nqu4RUFd4ZyGtl1a5TQugVmqgTdKhvIn3gnd3+J479pbXSGiIKRt7UTazmlfe5AFh\nYbpj/Bi1x8bQhlbAJsrqt9xTMVt33uE8VIyPNbZ61AihkLAmUX1yShJUymFPIMBf\n4KG9LTRVZM1V4z3WW1QP1XFhBOvdqhNLD0p+GAXFS8i6hcs3kGk9VWb0vPazCwT0\nQzcWAdgqs9XVfZ/0iu5l+689PBVF0yJxUeP1vh4/ZZvgzazBejmiqrwvQ1ClBX77\nuW5nJT/U8thKivYbPG3iyTGVXr2qqgykXmmiNB2csoBf/koTIqfo03cI9w0s/qW6\nsync7iOzKtbsXMwlDgiVRlaGmQGNBF9xCB0BDACwbkzRuwh/Yul1U7S6NSK3eKjJ\n9tn8OPhIdLxdtSiSpNBEOA58POm9vTFbYrnIp3YR2zxJbJiXDpGA/kSE/A74i7wn\nEcjXMocFOMfilVjynlnfgwMN8y3EQskrzkovn8psUDncYh6u0TI+arP9247JF0+t\nuRrgHQtGw9q8hMqYrDpSOdr5f1y8UF5bs0saQOshrqrxF7t9L33IPBRtDTl+Jep1\nA7kdnm/igtj65wCIrFAAaRfbx4b3ySqwTnpdfojecNfiege/Z3QRx1WEPjp6LyHr\n6vaaPfBtgw3vtqXt+jqenz3ufY2gyn1YtOFxdqQ7/xd8tFz+XwZYZ7acOIJEVT48\n5ffXq1EgaKuJXenvM2tFviX7olhxtIa1y2Y31nBSBFnOVpjIXkDn8XUiCtQrMiww\nFmATjGHTa/UsDnsaWyha9Pf5uMvneEd64NBbP+pKW/hukZWFES+FRNc7gtpaYrmL\nShWBLz//+n7YiAPDrJXk2C9y0JJTfFs65GJcoE0AEQEAAbQOR2l0SHViIFBhY2th\nZ2WJAdQEEwEKAD4WIQQcrRhvdQLUicqXoW9Sll5K1KUwFQUCX3EIHQIbAwUJA8Jn\nAAULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRBSll5K1KUwFYuzC/0b4+cwS5U6\nJ07TwvqumGpz1nlBQLcu+J7OgEqqqbKqSKdyrnCdn99HRHvHAhWf60Io2YdEsDne\nO024diIqqZwsXnshv5BwNeG4WsFYp2xkQrVtR4tGFsHlZ2m5eWyr7vEFVAU5RrMs\nEomnEH8TkxHFb0uXPLr9pXvdrGIG7nG3J35u3J4pxVJ9ide9/pZDeZ7yJYby5jpb\n9PVAH5jXRAzGqicKJ0Hx8icZMnjZFpU+Jgdp4naLo0cwyeKNp2wLiPOJ5gMn5xPf\nnr6/KxkINxFh5/OtU1kyLtY2+F4SZLB5bZtmhZJmbeXAckZKlDjqIWNroi3bMMh+\nK17Eag+bpGLhug+ClSdJ3HrXNMAYxWRUN2wY621UGAp1XY24NyqMm2ikEbnpUrbE\nqoKN9jIEIYWQKYsUj91iZnF7UD1bB9zxOSoxx+ENnuqc+29OIFECfqEZLismIfmK\nj2VV9617tW0CYSH+M/Df7qktW6r1s0HPiZxSttoC4MfqKBkyU7u1xgCJAbMEEAEK\nAB0WIQTKAQkReJqDADyLDc5hge2bjgbioAUCX3EI+wAKCRBhge2bjgbioHFDC/94\nz+mWqcG4YQZ0YkfNlN/eOlg5VV5JhHb+pwk88IDcQNwnd0VFo2fyqVLIVCmJEiRC\nmTz5hhxAwvqMLTuUf+MIocMWk0r/717yMsyZ3Oj3oZCE0XuiaLkSN9hEmMtTDrdO\nRCr6JuTkdzqnQ+uBj1GmMLFhf9lkv5IivHSfGGK/GIobtpjDJRKMcWCrDXjRbtO3\nbdij6/J/JbfoM9ZeoUa30IUb51HOMtculUaoUTuJZDtiPjmH8spzfGi/ss8x8a51\n5KIqrGiyc55UZ7ZbKhvXIdECLyB3cUaL2LGeo5ARHUFY98pYFtCCb1mwKbWEX6mp\n1aZCjmYVbY6WsAZghLXa7z0jwOYQebAyfS+UCbybAZ2FGEyQVFG0t6ZJO4YygPDz\noO9nCj1GjZ92eG+clBP/axqLYv9uhuyTyT0JW4Y9ZMvljqUUA6mB8zWiodQ164CJ\nH23hmeTq0U4AWLFR+ABirK7Y+J/BwA+4xHkriMV+heKr9GtS9hnSbx7nbjJPwEO5\nAY0EX3EIHQEMANlRCTQ+odCm6dK9CSrgE/3cBe8LyFTP4I7zDUTBDKW0tt/GkXoF\nave8qRDCmJ5gXgIdTw4aqX+SQfrUozov9SB1emzZzU4yHf2UJWitmRcE/TPo7J9C\nhtRnPB7/cepR4+cWNcYqDsB2WDOEhhPSeM870pchwRpslYYEvvb+slQNYR8T2Pj8\nAKaJ58nL81oQsIS3ADXJGkzEpjC4Pm9Lxhoj5sbeIYJTQj7iy2ty6Amph09lVmLf\nfeiJ4PztcnHnoCarP8sOV4o+R1s64c5txfEMcSNqRnU/45dROFflh3ypWH7mUyAE\nbDh7cBlCg/7DYc2W8BEA3tPBF/kIsO16Kh6neVOFGiBfWFQ+49EoRkAMBAaqHOQg\n2ziXIbNjqxMyIgE+qI/fuTAcapkQQsTf+NA9hdoJKD3jB/MkDFwLsBOEibBJ+ndZ\nFYCW/InFyokMKPkMj0tgLYc9RY80M4uQ5I+Uy5R5Pn+3nNYXlL96Yp4Mkj/6qTv8\n9VNfweuXeTpGbQARAQABiQG8BBgBCgAmFiEEHK0Yb3UC1InKl6FvUpZeStSlMBUF\nAl9xCB0CGwwFCQPCZwAACgkQUpZeStSlMBUQNwv+K8ZQJDqqx0elOZ4E9Z08D56i\nSUyGhW6v/hfRhJGQM3LEPmOCy2rj0arNXFb7MY3ocQgQm1t2MNA6vHniNZ92L2cE\ntGICZr0/hQD8/vFECtW0oNvNy9zRQW5f5y3i90P5GBPpcondeDtAr7e0oV2+iVxY\noif39LB8AbT626rlAP5E3TpIfSvDCTkM8ZPKnBQx5j7HkC/5fMuDqwZ8PCW0OHOD\npX/HhFsOJKpt8BvhS4OYb3Xqdl4DT8hLPieQQH7Gpp3nJkZzDOKmLtIIbZYS799L\nW+lj4g2SgNrIvI1lXfb1gHQfvke/1P8g5tS8pDIRsT41GN8Sn+2v7Cg9VXhlnUga\noNmSbJnIDoOmWyTB/csTcw1/gwYXWgBZtJU/QP8DSYnixhPvW5MhMZEme29Jpw4O\n5ryVhg4sNXZ2QWPTaA7amHozLr1XDVJk0YVSzFigOKiiGCsdWB0TslUkikUpgA8c\nYmTAS2gAIn9vnPRQGNQByf8LCSkKJGc9CXMIjdJ7mQGNBF9xCEABDACnmCuCFRPV\nBHxjp2+6YGORZHn4QNI2v7ceJAjHcMK/nByaJnaoQSnC76mVZATN2HJUekq3gENX\nvKxGTtsNX3Gsgae3tndlTFW+tXe5y0SVqUwLDb3igYXqKAOi5oSXK5Pqo85SZ17T\nFMsHSfdLX5+1oZjBSp7ZA6VxoZMweQCld7HZFi/OeE66LOXDsW+bvBmu2VInmHJk\nkgSdVge0ssM4KTciqrvHFJ8hFmuyCDl0GOW3y7Y/++y4JhiIeB6bOTF4BHquHCuE\n9CjVlWgGVsyrAeSaBELZ0bUiGDaOLH5ybQYkmMhwKF2H0DudhZzIBn0kQt1Za7sf\nG416CwhmHSX/A/1Vhjwdw7HKCK+StrTgxVBNqVUX4izIyB/aM6NLrQ3Kdk0RELbc\nkPKTkXxeKn1aZCtTNs/iYyzC6M+o5ytUiWfrqoovtX1LyM5vcPYZS1cAIiBuez1S\nsWMlMaRQLN1F+EOBhdLjdhB47jwuu573MjAMeyp0cjyRkj3L3wZB9jUAEQEAAbQO\nR2l0SHViIExpY2Vuc2WJAdQEEwEKAD4WIQTiVbqpQgaayfPerhfKhL3tFLBMRgUC\nX3EIQAIbAwUJA8JnAAULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRDKhL3tFLBM\nRnjLDACgkOBAfjjalhpZgJbfZZdlNEyWzRgGNryVhlOBTT+N0c0cpuvcV7VMwreL\nIjUC0yPiJyfKYwH6g7TjEmkNsI72X83OWAx8xDYZ2WXHC1FVpGwCfFNl6BUsbJbx\nL0ptj2SbB/VxXb98Q+Lagn18NM41Q4kLatMT+hPAM0uE0olZD5V1sw2hwpTEvg73\neQvmcQ/n9FI73PTtRYV0ev5lnEGEO+B0C6IQ5l5ACfpDHXM+u+Q6AXvtiZ/kWefP\nI6hmeOUQI5IZ388ZRbPbTeq3IvgIjYU79ec0scuHI3J6bKZKzVNwuhml1Z9+FBQ7\nCWmn5wGqOIAXd8p0ZxUQUfy4WoqMYD0ZViHRyrkkxH1vqJyrdovcbm6uVBdqg5n4\nlFtC3k47c6nTGBuZPPZvgyQI9WovMnQBo3XlXrRsA2E68I+5ROi22elpKgTCBHmO\nY3oHt8d9UCCKF/hgnAcOrNpHLPspafXRVWXEsdPNG6jY6+yu1S1N2GFTUfwsemlr\ndtzMYa6JAbMEEAEKAB0WIQTKAQkReJqDADyLDc5hge2bjgbioAUCX3EI8gAKCRBh\nge2bjgbioDilDACHqMdD0j8DB+57qjLt6bJ/A4vbzIBN08uJFb85PrVIEkWFgmN5\njqrd2GXAmi0ZqIWCp7UGthh36Ay1Y01Wbs8Xnhxh+sP1ylSPG5TH6qMwEKk25TtD\nIyMycMm7UImYLMvAl4p+lyXW2feiljRodbSfJP1M21n+dP4QGpapF4yVIU9Zegzh\nyOKuHWNhi8zAIVfsg1p/yYKrzufcwVHLC08mUjy/OJi8ihjRXbveiH9eVe1xhE/E\n7zjEe+Vsz2syI/RX1ILwrNY1vZvpJ0ExKBBi27rbyXL7VeN67RAvyyQPxCBU3AQI\n1slw3KdsQxaXCfZUdnOVWChPXA9ih7xAJ8Xo1q5mc4l0Ws7oyCPu/NJcQxYaAptf\njZVIIIWt/tErxfwDlcHXcRom0tc1Fch775B9ki1iLMy96uNt32c/XnbA/iRHzL/1\n3s+JkyDgkFqAFaVxiSUEpUGSI2c/nZSkGwZsAZ5DBoa+Th5iwbBEL9ldCtHTSIPa\nJcyiZa+/JIChPR65AY0EX3EIQAEMAN8xC+Oo8EzkX1gG0TNLLKxtYkzd35JnOL3E\ndhVVJrB/HkP4C37qJP9lMDi+49bQcLtfTaOki6ywXxSiHYHuK0F3Y6uYT31Lxp9P\nYEVXLh/irSUbV+vkRYap/ufe0yKKwjmPT01jZoCtBz2hzfpBh5rz55JszpAMDT1i\nXJmuUNXFlYm4fnC/mTO3WqGKyUZfnDPaY80bgQggapX3/MHmL5x639S+fngOIfwW\nSfnsFxPz7WI7SlYo8h88SaSwV6boZNGFyAFX/phqVSvwSignAA5vtzDB3BDkt7Qh\nCKWVCubl5OohRWCcjzg//Veyq8HOT4g2VoZeZKDEoRUlAs4aGxWdHtk/0ChqDFLX\nuj6Ep8f4Cn+WFXLgxXWOtPx8yPutVnVa8JwbaPNdk1r6KQEGPLdRo0Vr/AQp7eGl\n9slTkA3zGpJLKGt0+dRfsA85LeSwvMH5Au1ZTZKSvGajvrK08/VTN4lf6MoUozlz\nELQT1o2WOrxRgCLFHsXmgayqczw6CwARAQABiQG8BBgBCgAmFiEE4lW6qUIGmsnz\n3q4XyoS97RSwTEYFAl9xCEACGwwFCQPCZwAACgkQyoS97RSwTEbvtAv/c5gFxwJh\nB0VedsN8im0JzyaODOemtdYTCcKSIHP1Og/rO/dXj7EopAAE9oogkTwxxUH4zkyK\nB5r8GMyARVwXYp8gSQe9G98UrNEhKyL9PfhF65XzGqyymt/+jWBiixYSq6DSeJ0Z\n4d/gfPZyDO90SwBXpNAWOo5lbbyMupwaFQ2NPt+Knr4wGhSEU0BIx6xy9s+3MxKU\nDpe7HwG9SXUDKHzeXnn0xbP2ywOXym8dDSduNFCgiq2u1jjzM1Tw3zl/EQLS5F8C\nbtZmZDYLAFhEjAFPXeGhj3O0YrSK2u+eraXuXqrbhkvwpWgUeJ7J5rg2PraaQZ69\nM5VGx2ZuqygF9eRGenRGBvpgqiRlgBJOMS0uURp0cYJJqjmnSbmtf0PAfUDpYi7d\nTasSU1rUbPzAyUKHDQgg9vozj8dtYmd5kGo3V/Fe+zYryC+OzJGHZnF8qfB0WN99\ntidzM7Hz90i7hBPj09we252FfftK+3dF6dYphWBKcTlL+vkpd/DgxEafmQGNBF9x\nCqwBDADfEifRbtIUQBgR07jydyOsrR2KxENtYB+nWHIUTS3hfOWoRAUpMFtjRtHb\nsePQPy9E7s3rlQx6xUv9TpFLsNsBzAyeqGXYS9np9ziLOLKd4vG/8efuPcAlRF45\nkN/AFcKwGcxiggB2qS0DzxfDmtJofeyjgsGC65Faequf7xG8U8u9PkOP1nr0leWS\nzXV2aqyAD2Czry1T1jK1BD4Yd6Zi0GzwN3HuJ1T6/JGOdkpf1fE3BgmS1M8iLV2b\nhqSnjFX0CONSjburoaGEt2zcAFZY+ojUMs89xhtKw6FT2jOAV/3okwid0vQGTHlW\nk8P7OeLv10LU5Dd+Gr9e3eRJoGdnMyTAjGK7zlHG/oOC3sB1S/2xXvV8ccHojoyT\nBj41cS5FEqfTLaIReFdGtZFDP840nNYelhL27vrh0g9mUlmnBTqHhJcOIBnJARU5\np/E2YiMsw0Ey3sWWtH34ViNqJkyBub4ge15C8NM3Xeje6Co3Kz4I1ZID17WGwnkM\nJEcboecAEQEAAbQzQ29tcGFueSwgTExDIChlMDYxOTUxMy05NzE3LTQ2ODYtOWYw\nMi03NjRhZmY0Mzc1ZTIpiQHUBBMBCgA+FiEEa0VG6yoaXXKbXaRCezpfm8mr7S0F\nAl9xCqwCGwMFCQPCZwAFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AACgkQezpfm8mr\n7S209Av+Jm2PfUkBpWnsVE6J7VT2OpWG0E1x49k1JhmdPA6kydVMRaEVeLRnzfhY\nTWhnGfmhWXfLL7uxhQK6o+hm00C+hDnp1U2eNRFVbpTZtG5TpapIWpGAa9d9YTpw\naOhsYSc2Nuk/EOXUg+N6p5e3Kncurceoh/nfrDV7q/5Q0vIKbBQ8DKdOsBKupJZQ\nvCxrFaV5uZ6s0MtK17aQNdHDoZ9Em4CG0ac6GQybWhcAI+cXwV43W+llmhYeKFHG\nsh3QOl9CNYRmW/wJqXqKbDPk/BcPV7j9WdwM6J0AX7uBzJ87cRIbtHnc2ZCK6qhI\nGJxxqsYTrJK+P/TrutOpFOiYbsNHH0Lw/4GtWjhP3LBi8SR606DgjErQ6QTnjE3C\n6Ja7sgg+ERRZQgUyAjx16LQPlACaenjyzNv+V0aXsB1iOQw+mWNGSkwtxEQBtP+i\n8hrDw6vpvI8XV3uggq/QGpQ2ZaZSbd60yszoLXBKMFQr1fB0VwsF4u+Kj72dRvRL\nOxp35YsTiQGzBBABCgAdFiEEpap4EOTa6WI/mAKp/1kymsdic98FAl9xCt0ACgkQ\n/1kymsdic99QJAv/b+pxF+SIAqiiow+XriRMgOrkNfTqPim/PfkHoOeiIb4FjMdB\n41dmef9kp9cKhPIRTp+NjMC7Z1uc/Rj1zZbW1UNDqGaGrxhke5zSMhiUul9pfKYh\noNl2cO7AjzBPg9wx6gDx2z4H7+u121764/9QUIZ3qBCv3mrJ5D7D3DfYmJDXvjNW\nHri2qY7g60Q+3SQWHjTFuVAAiAT+cCvmQGpAuo3AHwMVaiMQQAp+vEhBlllyektt\nVfK+yIour0M4ht6Y37WC956mnQDkAclxvdExj2YoMlZqZxAWs6PmJ0TB3nZ57I3L\nzV3c0NYnHxCpsRLV4ELTVDIgzm50MlOzO3ykAb/GT2/dF7nwGiQMcXqsFAmGWXIc\nFd/qiBQspuQJabwwlawWX7MsjpgaSXc/P9xnMS82jXoIY/TdfubpHzrbWuO3mKMW\nj4b/ZpIpHeWMFqJGCRjv7wbD1pRdw7HjN35K82zUtwQRWgTUCmyJwGVNg/lpUPl5\n4lPgmEauOdbZsmLquQGNBF9xCqwBDAC7hBrcPNjrHXTAJ/dWxvjkBnthD9EonkIX\nA9Zq0sw6g40SA2pS7AtuDynwVUm+BWZxwaDNUKtakrxj00tW25/GFBAh5cTKkyrs\nEjgeWQIr3xQPk4DPNlu/ej02WEpNpJ8bqPTwAUxtEXdX+HJ9pWSY/ae4c99bmLbs\nBVTxqF6azrVPxXcAE902NyEmWj5c5wjqpDyGRn6z48Gan77xm18VMkqTEa+n+AaG\nbX6Gf6Q5KXlF27dx9lKw7dxpeBRC5j0/308ArBpeyOckJKWZ/vLZtijA+/hRvEbj\nC7sfLe0gNEcVSn3L0r6QKSrjcf0h3/X0uu7R6o+2e04VM+MkMIfZJBNhG/R48Ubl\nriRKNFslOucyeKcz0GH38YoOZUS8sAvLwVZK2XHRXyQBCdAK0MQ9S4dErPuJJ19n\n/1FjktNe/09iJtFj7/WjmdWyYPuxBC6zoBnpDK63O5q59IYL1yN0yxkd3fnU4CqZ\nDAX2wCn25rTZ3kjVxdtoYECnw7WEDX0AEQEAAYkBvAQYAQoAJhYhBGtFRusqGl1y\nm12kQns6X5vJq+0tBQJfcQqsAhsMBQkDwmcAAAoJEHs6X5vJq+0tX4YMAIo+zdZJ\nqekjYUwLnaD1R1I/He98gPiy7FaZY9G+BuG/yOxJUH787DQ9t9LfNnffi9JBhV4g\n/YM8+HrQ2WJSWfrCO86yMrJjFBKiH8CIRKx7slYgZyJz7e9Umlfql466l/R8n9WF\neG6K84s7zNwqK3yV2Q8wu7T6wEIDWNwpUoaVuyf2kSALOkru5bE8VXT5An5t/Lge\nxXI4t34/aLjPdmBj3dmBtF+k2BBORL9F/Rc2F4GSh/nlvajJr8kuSYyl515FcMlL\n15JeHXVOqJABCqsgvuTrMuNZaECsXK7/kSUAxcoVcZ2ZG+3gIZQhxboU09MItVjo\nQC6q7X/QQ07+8xwCMWByl2Qm6TjuCUXz1te4HdFu70Zj4NL30DS8TrWdbxZR3pUZ\nUcYO2Mc6n8mO4QYdAvUtZ81MAdafMYh742bnZMrO+/v+IyaW/kMB6gr8xnQ+eBJs\nHbWMXKVAT+Vv1MLLMk10MUjkUXpXE2AZ8J7ZPqVcI05aIC9YUuhSK/641g==\n=vpc7\n-----END PGP PUBLIC KEY BLOCK-----"
}
module Enterprise
module Crypto
# Base class for a Vault, which consists of 0 or more gpg keys.
# Keys can be public, secret, or a paired public & secret. Secret
# keys must me signed by the master key and public keys must be signed
# by their secret key pair, if it exists.
#
# A vault is used for any cryptographic work, such as generating a new
# customer keypair, creating a license or package, and verifying anything
# signed by a gpg key.
#
class Vault
include SafeDir
MASTER_FINGERPRINT = 'CE502095844D9C760228C545E8D26122D972534D'
attr_accessor :fingerprint
# Raise an error unless the key is signed by the signing_key. Useful
# for asserting that a keypair is signed by the master key.
#
def self.verify_key_signature!(key, signing_key)
subkey = signing_key.subkeys.detect {|sk| sk.fingerprint == signing_key.fingerprint }
unless key.uids.any? {|uid| uid.signatures.any? {|s| s.keyid == subkey.keyid }}
raise(Error, "'#{key.name}' was not not signed by the '#{signing_key.name}' key")
end
end
# Raise an error unless the key's fingerprint matches the provided
# fingerprint. Useful for asserting a keypair.
#
def self.verify_key_fingerprint!(key, fingerprint)
unless key && key.fingerprint == fingerprint
raise(Error, "'#{key.name}' fingerprint is invalid")
end
end
# Create a vault with a homedir and 0 or more (paired) keys.
#
# key_data - An Array of gpg key data as Strings.
#
def initialize(*key_data, blank_password: false)
@blank_password = blank_password
@key_data = key_data
end
# The public key of the Master keypair. Used to verify that other
# keypairs are signed by the Master key.
#
# Note: the private key should never be loaded into this library.
#
def master_key
@master_key ||= find_public_key(MASTER_FINGERPRINT)
end
# The secret key portion for this vault. May be nil.
# Used for signing data. (e.g. new keypairs, licenses,
# packages.)
#
def secret_key
@secret_key ||= begin
find_private_key(fingerprint) unless fingerprint.nil?
end
end
# The public key portion for this vault. May be nil.
# Used to verify signed data.
#
def public_key
@public_key ||= begin
find_public_key(fingerprint) unless fingerprint.nil?
end
end
# Add a new key to the Vault. It must match the fingerprint
# of the existing key(s), if there is one.
#
# key_data - The gpg data of the key as a String.
#
def add_key(key_data)
import_main_key(key_data)
@key_data << key_data
fingerprint
end
# Returns the secret gpg key data as a String.
#
# fingerprint - The fingerprint of the secret key to export.
#
def export_secret(fingerprint)
## GPGME doesn't support exporting secret keys
## http://lists.gnupg.org/pipermail/gnupg-devel/2008-September/024581.html
command = %w[gpg]
command << "--homedir=#{home_dir}"
command << '--batch' << '--yes'
command << '--armor'
command << "--export-secret-key=#{fingerprint}"
command << "2>/dev/null"
%x{#{command.join(' ')}}
end
# Returns the public gpg key data as a String.
#
# fingerprint - The gpg fingerprint of the public key to export.
#
def export_public(fingerprint)
with_context(:armor => true) do |context|
data = context.export(fingerprint)
data.seek(0)
data.read
end
end
# Symmetrically encrypts then signs the data.
# Note: only signs for now.
#
# raw - A String of data.
#
def encrypt_and_sign(raw)
with_context do |context|
raw_data = GPGME::Data.new(raw)
context.add_signer(*secret_key)
signed_data = context.sign(raw_data)
signed_data.seek(0)
signed_data.read
end
end
# Symmetrically decrypts and verifies the object.
# Note: only verifies for now.
#
# object - An encrypted and signed object as a String.
#
def decrypt_and_verify(object)
with_context do |context|
signed_data = new_signed_data(object)
temp_file = Tempfile.new('enterprisecrypto', :encoding => Encoding::BINARY)
raw_data = GPGME::Data.from_io(temp_file)
context.verify(signed_data, nil, raw_data)
check_signatures(context.verify_result.signatures)
temp_file.close
# Return file reference so we don't GC it.
temp_file
end
end
def new_signed_data(object)
GPGME::Data.new(object)
end
def check_signatures(signatures)
if signatures.empty? || !signatures.all? {|sig| sig.valid? }
raise Error, "Invalid signature detected!"
end
end
def find_public_key(fingerprint)
find_key(:public, fingerprint)
end
def find_secret_key(fingerprint)
find_private_key(fingerprint)
end
def find_private_key(fingerprint)
find_key(:private, fingerprint)
end
def find_key(type, fingerprint)
with_context do |context|
context.get_key(fingerprint, type == :private)
end
rescue EOFError
nil
end
def with_context(options = {})
with_vault do
GPGME::Ctx.new(default_context_options.merge(options)) do |ctx|
return yield(ctx)
end
end
rescue GPGME::Error => e
raise Error, e.message
end
def with_vault
if Crypto.current_vault == self
yield
else
Crypto.with_vault(self) { yield }
end
end
def default_context_options
{
:keylist_mode => (
GPGME::KEYLIST_MODE_SIGS |
GPGME::GPGME_KEYLIST_MODE_SIG_NOTATIONS |
GPGME::GPGME_KEYLIST_MODE_VALIDATE |
GPGME::GPGME_KEYLIST_MODE_LOCAL)
}.merge(blank_password_context_options)
end
def blank_password_context_options
return {} unless @blank_password
# Check to see if gpg is at least 2.1.12 (needs to include https://dev.gnupg.org/rGeea139c56ef55081d8cd8df2a35ce507386e0f17)
maj, min, patch = GPGME::Engine.info.first.version.split(".").map(&:to_i)
return {} if maj < 2
return {} if maj == 2 && min < 1
return {} if maj == 2 && min == 1 && patch < 12
{
:pinentry_mode => GPGME::PINENTRY_MODE_LOOPBACK, # bypass prompt
:password => '' # default to no password
}
end
def home_dir
@home_dir ||= mktmpdir.to_path
end
def open!
GPGME::Engine.home_dir = home_dir
write_agent_config
load_master_public_key
load_vault
VaultValidator.validate!(self)
end
def close!
GPGME::Engine.home_dir = nil
end
def cleanup!
close!
FileUtils.rm_rf home_dir
FileUtils.rm_rf tmpdir
@home_dir = nil
end
def import_main_key(key_data)
@fingerprint = import_key(key_data)
if @fingerprint.nil?
@fingerprint = fingerprint
elsif @fingerprint != fingerprint
raise Error, "Can't import #{fingerprint}, doesn't match #{@fingerprint}."
end
end
def load_vault
@key_data.map do |key|
import_main_key(key)
end
Vault.verify_key_fingerprint!(secret_key, public_key.fingerprint) unless secret_key.nil?
Vault.verify_key_signature!(public_key, master_key) unless public_key.nil?
end
def import_key(key_data)
import_results = GPGME::Key.import(key_data)
key = import_results.imports.last
key && key.fingerprint
end
def load_master_public_key
import_key <<-MASTER_PUBLIC_KEY
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
0TFLgOM=
=LdHF
-----END PGP PUBLIC KEY BLOCK-----
MASTER_PUBLIC_KEY
end
def write_agent_config
return if RUBY_PLATFORM !~ /darwin/ || File.exist?(agent_config_path)
File.open(agent_config_path, 'w') do |f|
f.puts agent_config
end
end
def agent_config
# any gpg-agent options should go here
# allow-loopback-pinentry allows the GPGME password option to be set
['allow-loopback-pinentry']
end
def agent_config_path
File.join(home_dir, 'gpg-agent.config')
end
end
end
end
@vteclol
Copy link

vteclol commented Aug 13, 2021

hesitate with caution

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment