├── .gitignore ├── registry ├── storage │ └── .gitkeepme └── conf │ ├── htpasswd │ └── config.yml ├── docker-compose.yml ├── README.md ├── certs ├── registry.crt ├── registry.key └── README.md └── LICENSE /.gitignore: -------------------------------------------------------------------------------- 1 | *~ 2 | -------------------------------------------------------------------------------- /registry/storage/.gitkeepme: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /registry/conf/htpasswd: -------------------------------------------------------------------------------- 1 | healthchecker:$2y$05$BffRoopxmr5u6Zs.CbBDweVgTHwzapbwb.o8JyAn2U4vABE67PVsy 2 | john:$2y$05$H2Qm/MHQyDGcYWSj8/Ij6e3vclQDE9UAHbcv0XfO7JuSmk3BJaBbS 3 | foo:$2y$05$To5lO8X/h95smHnf.oTMyuU9g8BOecVhIS1qSfDHaQFSZph20oQsK 4 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | registry: 2 | image: registry:2 3 | restart: always 4 | ports: 5 | - "0.0.0.0:443:5000" 6 | # For registry debug server 7 | #- "0.0.0.0:5001:5001" 8 | volumes: 9 | - "./certs:/certs:ro" 10 | - "./registry/conf:/etc/docker/registry:ro" 11 | - "./registry/storage:/var/lib/registry:rw" 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Docker Registry Htpasswd 2 | 3 | This provides a ready to use setup for a docker registry running with htpasswd 4 | authentication. 5 | 6 | You only need to replace the `certs/registry.crt` and `certs/registry.key` 7 | with your own certificate and key file and generate your own `bcrypt` username 8 | and password combinations and put them in `registry/conf/htpasswd` using: 9 | 10 | ```bash 11 | htpasswd -B registry/conf/htpasswd jane 12 | New password: 13 | Re-type new password: 14 | Adding password for user jane 15 | ``` 16 | 17 | By default these users are configured: 18 | 19 | ``` 20 | john:doe 21 | foo:bar 22 | healthchecker:healthchecker 23 | ``` 24 | 25 | You can remove any of these users **but** if you remove the `healthchecker` 26 | you have to adjust the `health` section in `registry/conf/config.yml`. 27 | 28 | # Logging in 29 | 30 | You have to call `docker login 0.0.0.0:443` with whatever URL you have 31 | configure your registry to run on. 32 | 33 | If you don't want to interactively enter a username and password, you can 34 | store it in `~/.docker/config.json` like so: 35 | 36 | ```json 37 | { 38 | "auths": { 39 | "0.0.0.0:443": { 40 | "auth": "Zm9vOmJhcg==", 41 | "email": "foo@bar.com" 42 | } 43 | } 44 | } 45 | ``` 46 | 47 | # Test Docker v2 HTTP API 48 | 49 | To manaully test the Docker v2 HTTP API you can run this command: 50 | 51 | ``` 52 | curl -k -v -H "Authorization: Basic Zm9vOmJhcg==" https://0.0.0.0:443/v2/ 53 | ``` 54 | 55 | It should give you an `HTTP 200 OK`. 56 | 57 | Have fun! 58 | -------------------------------------------------------------------------------- /registry/conf/config.yml: -------------------------------------------------------------------------------- 1 | # See https://github.com/docker/distribution/blob/master/docs/configuration.md 2 | version: 0.1 3 | http: 4 | addr: :5000 5 | net: tcp 6 | prefix: / 7 | tls: 8 | certificate: /certs/registry.crt 9 | key: /certs/registry.key 10 | debug: 11 | addr: :5001 12 | secret: asecretforlocaldevelopment 13 | headers: 14 | X-Content-Type-Options: [nosniff] 15 | storage: 16 | cache: 17 | blobdescriptor: inmemory 18 | filesystem: 19 | rootdirectory: /var/lib/registry 20 | maintenance: 21 | uploadpurging: 22 | enabled: true 23 | age: 168h 24 | interval: 60m 25 | dryrun: false 26 | auth: 27 | htpasswd: 28 | realm: docker-registry-realm 29 | path: /etc/docker/registry/htpasswd 30 | log: 31 | level: info 32 | formatter: text 33 | fields: 34 | service: registry 35 | environment: production 36 | hooks: 37 | - type: mail 38 | disabled: false 39 | levels: 40 | - error 41 | options: 42 | smtp: 43 | addr: your.mail.host:25 44 | insecure: true 45 | from: no-reply@your-docker-registry.com 46 | to: 47 | - sombody@in-your-company.com 48 | health: 49 | storagedriver: 50 | enabled: true 51 | interval: 10s 52 | threshold: 3 53 | http: 54 | - uri: https://0.0.0.0:5000/v2/ 55 | headers: 56 | # Make sure you have the user "healthchecker" in the /etc/docker/registry/htpasswd 57 | # file and update this basic auth string using this command: 58 | # 59 | # echo "Basic $(echo -n "healthchecker:healthchecker" | base64)" 60 | # 61 | # Note that /etc/docker/registry/htpasswd is mounted into the docker container. 62 | Authorization: [Basic aGVhbHRoY2hlY2tlcjpoZWFsdGhjaGVja2Vy] 63 | statuscode: 200 64 | timeout: 3s 65 | interval: 10s 66 | threshold: 3 67 | 68 | 69 | -------------------------------------------------------------------------------- /certs/registry.crt: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIGXTCCBEWgAwIBAgIJANVnO5yiq+RlMA0GCSqGSIb3DQEBCwUAMIHEMQswCQYD 3 | VQQGEwJERTEWMBQGA1UECAwNRXhhbXBsZSBTdGF0ZTEVMBMGA1UEBwwMRXhhbXBs 4 | ZSBDaXR5MRgwFgYDVQQKDA9FeGFtcGxlIENvbXBhbnkxIjAgBgNVBAsMGUV4YW1w 5 | bGUgT3JnYW5pemF0aW9uIFVuaXQxHTAbBgNVBAMMFHJlZ2lzdHJ5LmV4YW1wbGUu 6 | Y29tMSkwJwYJKoZIhvcNAQkBFhphZG1pbkByZWdpc3RyeS5leGFtcGxlLmNvbTAe 7 | Fw0xNTEwMjYxMTAyNThaFw0xNjEwMjUxMTAyNThaMIHEMQswCQYDVQQGEwJERTEW 8 | MBQGA1UECAwNRXhhbXBsZSBTdGF0ZTEVMBMGA1UEBwwMRXhhbXBsZSBDaXR5MRgw 9 | FgYDVQQKDA9FeGFtcGxlIENvbXBhbnkxIjAgBgNVBAsMGUV4YW1wbGUgT3JnYW5p 10 | emF0aW9uIFVuaXQxHTAbBgNVBAMMFHJlZ2lzdHJ5LmV4YW1wbGUuY29tMSkwJwYJ 11 | KoZIhvcNAQkBFhphZG1pbkByZWdpc3RyeS5leGFtcGxlLmNvbTCCAiIwDQYJKoZI 12 | hvcNAQEBBQADggIPADCCAgoCggIBALOQJJZn3laq47V9J100Tc5gvc+baJ6v5olt 13 | lXSePsYnj7Y0UrqLngLcpnyphGtA4a1bwBn0jT2Bdi3p8S/UIH1QFW3Lts2T6/fS 14 | nJmQG7aZ2K2let+SL6uOuASpzDR/0CFqRomg1StG+EFK7irXVwShM8g//aQQgRtb 15 | W5HJDgyRDur+Ni7zx74BL/T8sKxXO9KTqAytI4EHce86fm+kUsPcun7bmTzF4GaI 16 | jdL2KWylrJy6p90toIutVLL/oMYmkBUM+S/42YAnWlIIjuuEXST+rQXpwm7i8gPO 17 | /C03fs/F7G1F0QXtlxH5a4lm3cxM/bcYcb71x6zhaqVqeKtmFQ5lawhHiwYxmau7 18 | cFCOL6nWmoY5yHnvtmTWACuNecLFxm8CW1BWZE5+9HRjT4BtslUTTpWTHmYbKJxs 19 | axxiY/uaiu0IyOBcBPPdu8DF0lQjuL2qlTBi/ydoQbtovlv4ae8+b4H7CKT3+weC 20 | yVMJ065IAkfb72Cx175twdEt7FAnsimeQ7TmKruZIxtLJ4nEuGQwM6Q7tKH7ZXv/ 21 | UDIOaOre4l+xEeM86bJwqn9ufAENAPn5AmX8hAOqeGYWBK4xugK/PIz2KwvspeL5 22 | 65rOMcwXPkllOXeUaGDYVl5hTVuvEh34uHulMguZxLrL07Qsk5e5/JaF2CcM0pyB 23 | ToVw8KBpAgMBAAGjUDBOMB0GA1UdDgQWBBQcG/wMOTZydkgGsJAm9+PkXRw9FDAf 24 | BgNVHSMEGDAWgBQcG/wMOTZydkgGsJAm9+PkXRw9FDAMBgNVHRMEBTADAQH/MA0G 25 | CSqGSIb3DQEBCwUAA4ICAQCO0hgHsfnxTWBFmOClZI53TT39MT8UKr01yfWTqABj 26 | BVRBRGz+8KvoBLizWOJv3GNYkmO7aswtg3EAF4eR1SSIEY5H0GXpFsH+kuKJbVbw 27 | aTM0w+IfVwBvWDxhL6S/dJNf9HIuWWEZWAAMEwykrSqBtXhP0u09TICoZWZmlZ9a 28 | n6mFBSxL5ct05qNMPytPz/lTsqARsFXUelUwANipMJXxBlgAA5bFzNFOsfhXh3nQ 29 | sc67lSdaltH7SxVeYDerHUFLwvcTKsC7D7i5HxYogHaWH3zatNie7S/ngOdjvE3k 30 | KiA8xMw0isyPxQrEypDmMq+2vSp0hs5yPPABaRVXQRFOVdEmg5t89K1nu69KQzdP 31 | lJOSAPIIuGUYStsPBiq34k0tsGKcRUqdjbMl0JnH7SHgM0vcPhV3eVSuDDEbHdaP 32 | fB4PcGyWbz36YNulPqk6vewu0UmP7NIsBeZVjVVXuKazfIqoobURUCHbffnLJNvo 33 | IAPryqxfFHmt5v8e1B41bA8VtLjCq0Ar5iWkFBsC5xYnqDpvX3mWEbNKd238zU3Q 34 | Fn/DC5761gxNvZLdQ1R/tygnWxQmctJVZmwc4KweEUHSi4wOxpfYssFeBY9mVdXQ 35 | sDjeFqQ41GXv27piRI2IGJNyp1wU1u0OoiXoRdEKOywdIZS+HjzivmzjwyZBX/Br 36 | Ww== 37 | -----END CERTIFICATE----- 38 | -------------------------------------------------------------------------------- /certs/registry.key: -------------------------------------------------------------------------------- 1 | -----BEGIN PRIVATE KEY----- 2 | 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 51 | GDJ0k/7Jc0+g7M8Gof7SKU2ItNBjxxQ= 52 | -----END PRIVATE KEY----- 53 | -------------------------------------------------------------------------------- /certs/README.md: -------------------------------------------------------------------------------- 1 | # Creation of example certificates 2 | 3 | **NOTE:** You should replace these files with your own!!! 4 | 5 | # Certificate and key for the registry 6 | 7 | The `registry.crt` and `registry.key` files have been created using this command: 8 | 9 | ``` 10 | openssl req -newkey rsa:4096 -nodes -sha256 -keyout registry.key -x509 -days 365 -out registry.crt 11 | Generating a 4096 bit RSA private key 12 | ............................................................................................++ 13 | ........................................................................................++ 14 | writing new private key to 'registry.key' 15 | ----- 16 | You are about to be asked to enter information that will be incorporated 17 | into your certificate request. 18 | What you are about to enter is what is called a Distinguished Name or a DN. 19 | There are quite a few fields but you can leave some blank 20 | For some fields there will be a default value, 21 | If you enter '.', the field will be left blank. 22 | ----- 23 | Country Name (2 letter code) [AU]:DE 24 | State or Province Name (full name) [Some-State]:Example State 25 | Locality Name (eg, city) []:Example City 26 | Organization Name (eg, company) [Internet Widgits Pty Ltd]:Example Company 27 | Organizational Unit Name (eg, section) []:Example Organization Unit 28 | Common Name (e.g. server FQDN or YOUR name) []:registry.example.com 29 | Email Address []:admin@registry.example.com 30 | ``` 31 | 32 | # How to list the contents of one of the certificates 33 | 34 | ```bash 35 | openssl x509 -in registry.crt -text 36 | ``` 37 | 38 | Output 39 | 40 | ``` 41 | Certificate: 42 | Data: 43 | Version: 3 (0x2) 44 | Serial Number: 15377324996609959013 (0xd5673b9ca2abe465) 45 | Signature Algorithm: sha256WithRSAEncryption 46 | Issuer: C=DE, ST=Example State, L=Example City, O=Example Company, OU=Example Organization Unit, CN=registry.example.com/emailAddress=admin@registry.example.com 47 | Validity 48 | Not Before: Oct 26 11:02:58 2015 GMT 49 | Not After : Oct 25 11:02:58 2016 GMT 50 | Subject: C=DE, ST=Example State, L=Example City, O=Example Company, OU=Example Organization Unit, CN=registry.example.com/emailAddress=admin@registry.example.com 51 | Subject Public Key Info: 52 | Public Key Algorithm: rsaEncryption 53 | Public-Key: (4096 bit) 54 | Modulus: 55 | 00:b3:90:24:96:67:de:56:aa:e3:b5:7d:27:5d:34: 56 | 4d:ce:60:bd:cf:9b:68:9e:af:e6:89:6d:95:74:9e: 57 | 3e:c6:27:8f:b6:34:52:ba:8b:9e:02:dc:a6:7c:a9: 58 | 84:6b:40:e1:ad:5b:c0:19:f4:8d:3d:81:76:2d:e9: 59 | f1:2f:d4:20:7d:50:15:6d:cb:b6:cd:93:eb:f7:d2: 60 | 9c:99:90:1b:b6:99:d8:ad:a5:7a:df:92:2f:ab:8e: 61 | b8:04:a9:cc:34:7f:d0:21:6a:46:89:a0:d5:2b:46: 62 | f8:41:4a:ee:2a:d7:57:04:a1:33:c8:3f:fd:a4:10: 63 | 81:1b:5b:5b:91:c9:0e:0c:91:0e:ea:fe:36:2e:f3: 64 | c7:be:01:2f:f4:fc:b0:ac:57:3b:d2:93:a8:0c:ad: 65 | 23:81:07:71:ef:3a:7e:6f:a4:52:c3:dc:ba:7e:db: 66 | 99:3c:c5:e0:66:88:8d:d2:f6:29:6c:a5:ac:9c:ba: 67 | a7:dd:2d:a0:8b:ad:54:b2:ff:a0:c6:26:90:15:0c: 68 | f9:2f:f8:d9:80:27:5a:52:08:8e:eb:84:5d:24:fe: 69 | ad:05:e9:c2:6e:e2:f2:03:ce:fc:2d:37:7e:cf:c5: 70 | ec:6d:45:d1:05:ed:97:11:f9:6b:89:66:dd:cc:4c: 71 | fd:b7:18:71:be:f5:c7:ac:e1:6a:a5:6a:78:ab:66: 72 | 15:0e:65:6b:08:47:8b:06:31:99:ab:bb:70:50:8e: 73 | 2f:a9:d6:9a:86:39:c8:79:ef:b6:64:d6:00:2b:8d: 74 | 79:c2:c5:c6:6f:02:5b:50:56:64:4e:7e:f4:74:63: 75 | 4f:80:6d:b2:55:13:4e:95:93:1e:66:1b:28:9c:6c: 76 | 6b:1c:62:63:fb:9a:8a:ed:08:c8:e0:5c:04:f3:dd: 77 | bb:c0:c5:d2:54:23:b8:bd:aa:95:30:62:ff:27:68: 78 | 41:bb:68:be:5b:f8:69:ef:3e:6f:81:fb:08:a4:f7: 79 | fb:07:82:c9:53:09:d3:ae:48:02:47:db:ef:60:b1: 80 | d7:be:6d:c1:d1:2d:ec:50:27:b2:29:9e:43:b4:e6: 81 | 2a:bb:99:23:1b:4b:27:89:c4:b8:64:30:33:a4:3b: 82 | b4:a1:fb:65:7b:ff:50:32:0e:68:ea:de:e2:5f:b1: 83 | 11:e3:3c:e9:b2:70:aa:7f:6e:7c:01:0d:00:f9:f9: 84 | 02:65:fc:84:03:aa:78:66:16:04:ae:31:ba:02:bf: 85 | 3c:8c:f6:2b:0b:ec:a5:e2:f9:eb:9a:ce:31:cc:17: 86 | 3e:49:65:39:77:94:68:60:d8:56:5e:61:4d:5b:af: 87 | 12:1d:f8:b8:7b:a5:32:0b:99:c4:ba:cb:d3:b4:2c: 88 | 93:97:b9:fc:96:85:d8:27:0c:d2:9c:81:4e:85:70: 89 | f0:a0:69 90 | Exponent: 65537 (0x10001) 91 | X509v3 extensions: 92 | X509v3 Subject Key Identifier: 93 | 1C:1B:FC:0C:39:36:72:76:48:06:B0:90:26:F7:E3:E4:5D:1C:3D:14 94 | X509v3 Authority Key Identifier: 95 | keyid:1C:1B:FC:0C:39:36:72:76:48:06:B0:90:26:F7:E3:E4:5D:1C:3D:14 96 | 97 | X509v3 Basic Constraints: 98 | CA:TRUE 99 | Signature Algorithm: sha256WithRSAEncryption 100 | 8e:d2:18:07:b1:f9:f1:4d:60:45:98:e0:a5:64:8e:77:4d:3d: 101 | fd:31:3f:14:2a:bd:35:c9:f5:93:a8:00:63:05:54:41:44:6c: 102 | fe:f0:ab:e8:04:b8:b3:58:e2:6f:dc:63:58:92:63:bb:6a:cc: 103 | 2d:83:71:00:17:87:91:d5:24:88:11:8e:47:d0:65:e9:16:c1: 104 | fe:92:e2:89:6d:56:f0:69:33:34:c3:e2:1f:57:00:6f:58:3c: 105 | 61:2f:a4:bf:74:93:5f:f4:72:2e:59:61:19:58:00:0c:13:0c: 106 | a4:ad:2a:81:b5:78:4f:d2:ed:3d:4c:80:a8:65:66:66:95:9f: 107 | 5a:9f:a9:85:05:2c:4b:e5:cb:74:e6:a3:4c:3f:2b:4f:cf:f9: 108 | 53:b2:a0:11:b0:55:d4:7a:55:30:00:d8:a9:30:95:f1:06:58: 109 | 00:03:96:c5:cc:d1:4e:b1:f8:57:87:79:d0:b1:ce:bb:95:27: 110 | 5a:96:d1:fb:4b:15:5e:60:37:ab:1d:41:4b:c2:f7:13:2a:c0: 111 | bb:0f:b8:b9:1f:16:28:80:76:96:1f:7c:da:b4:d8:9e:ed:2f: 112 | e7:80:e7:63:bc:4d:e4:2a:20:3c:c4:cc:34:8a:cc:8f:c5:0a: 113 | c4:ca:90:e6:32:af:b6:bd:2a:74:86:ce:72:3c:f0:01:69:15: 114 | 57:41:11:4e:55:d1:26:83:9b:7c:f4:ad:67:bb:af:4a:43:37: 115 | 4f:94:93:92:00:f2:08:b8:65:18:4a:db:0f:06:2a:b7:e2:4d: 116 | 2d:b0:62:9c:45:4a:9d:8d:b3:25:d0:99:c7:ed:21:e0:33:4b: 117 | dc:3e:15:77:79:54:ae:0c:31:1b:1d:d6:8f:7c:1e:0f:70:6c: 118 | 96:6f:3d:fa:60:db:a5:3e:a9:3a:bd:ec:2e:d1:49:8f:ec:d2: 119 | 2c:05:e6:55:8d:55:57:b8:a6:b3:7c:8a:a8:a1:b5:11:50:21: 120 | db:7d:f9:cb:24:db:e8:20:03:eb:ca:ac:5f:14:79:ad:e6:ff: 121 | 1e:d4:1e:35:6c:0f:15:b4:b8:c2:ab:40:2b:e6:25:a4:14:1b: 122 | 02:e7:16:27:a8:3a:6f:5f:79:96:11:b3:4a:77:6d:fc:cd:4d: 123 | d0:16:7f:c3:0b:9e:fa:d6:0c:4d:bd:92:dd:43:54:7f:b7:28: 124 | 27:5b:14:26:72:d2:55:66:6c:1c:e0:ac:1e:11:41:d2:8b:8c: 125 | 0e:c6:97:d8:b2:c1:5e:05:8f:66:55:d5:d0:b0:38:de:16:a4: 126 | 38:d4:65:ef:db:ba:62:44:8d:88:18:93:72:a7:5c:14:d6:ed: 127 | 0e:a2:25:e8:45:d1:0a:3b:2c:1d:21:94:be:1e:3c:e2:be:6c: 128 | e3:c3:26:41:5f:f0:6b:5b 129 | -----BEGIN CERTIFICATE----- 130 | MIIGXTCCBEWgAwIBAgIJANVnO5yiq+RlMA0GCSqGSIb3DQEBCwUAMIHEMQswCQYD 131 | VQQGEwJERTEWMBQGA1UECAwNRXhhbXBsZSBTdGF0ZTEVMBMGA1UEBwwMRXhhbXBs 132 | ZSBDaXR5MRgwFgYDVQQKDA9FeGFtcGxlIENvbXBhbnkxIjAgBgNVBAsMGUV4YW1w 133 | bGUgT3JnYW5pemF0aW9uIFVuaXQxHTAbBgNVBAMMFHJlZ2lzdHJ5LmV4YW1wbGUu 134 | Y29tMSkwJwYJKoZIhvcNAQkBFhphZG1pbkByZWdpc3RyeS5leGFtcGxlLmNvbTAe 135 | Fw0xNTEwMjYxMTAyNThaFw0xNjEwMjUxMTAyNThaMIHEMQswCQYDVQQGEwJERTEW 136 | MBQGA1UECAwNRXhhbXBsZSBTdGF0ZTEVMBMGA1UEBwwMRXhhbXBsZSBDaXR5MRgw 137 | FgYDVQQKDA9FeGFtcGxlIENvbXBhbnkxIjAgBgNVBAsMGUV4YW1wbGUgT3JnYW5p 138 | emF0aW9uIFVuaXQxHTAbBgNVBAMMFHJlZ2lzdHJ5LmV4YW1wbGUuY29tMSkwJwYJ 139 | KoZIhvcNAQkBFhphZG1pbkByZWdpc3RyeS5leGFtcGxlLmNvbTCCAiIwDQYJKoZI 140 | hvcNAQEBBQADggIPADCCAgoCggIBALOQJJZn3laq47V9J100Tc5gvc+baJ6v5olt 141 | lXSePsYnj7Y0UrqLngLcpnyphGtA4a1bwBn0jT2Bdi3p8S/UIH1QFW3Lts2T6/fS 142 | nJmQG7aZ2K2let+SL6uOuASpzDR/0CFqRomg1StG+EFK7irXVwShM8g//aQQgRtb 143 | W5HJDgyRDur+Ni7zx74BL/T8sKxXO9KTqAytI4EHce86fm+kUsPcun7bmTzF4GaI 144 | jdL2KWylrJy6p90toIutVLL/oMYmkBUM+S/42YAnWlIIjuuEXST+rQXpwm7i8gPO 145 | /C03fs/F7G1F0QXtlxH5a4lm3cxM/bcYcb71x6zhaqVqeKtmFQ5lawhHiwYxmau7 146 | cFCOL6nWmoY5yHnvtmTWACuNecLFxm8CW1BWZE5+9HRjT4BtslUTTpWTHmYbKJxs 147 | axxiY/uaiu0IyOBcBPPdu8DF0lQjuL2qlTBi/ydoQbtovlv4ae8+b4H7CKT3+weC 148 | yVMJ065IAkfb72Cx175twdEt7FAnsimeQ7TmKruZIxtLJ4nEuGQwM6Q7tKH7ZXv/ 149 | UDIOaOre4l+xEeM86bJwqn9ufAENAPn5AmX8hAOqeGYWBK4xugK/PIz2KwvspeL5 150 | 65rOMcwXPkllOXeUaGDYVl5hTVuvEh34uHulMguZxLrL07Qsk5e5/JaF2CcM0pyB 151 | ToVw8KBpAgMBAAGjUDBOMB0GA1UdDgQWBBQcG/wMOTZydkgGsJAm9+PkXRw9FDAf 152 | BgNVHSMEGDAWgBQcG/wMOTZydkgGsJAm9+PkXRw9FDAMBgNVHRMEBTADAQH/MA0G 153 | CSqGSIb3DQEBCwUAA4ICAQCO0hgHsfnxTWBFmOClZI53TT39MT8UKr01yfWTqABj 154 | BVRBRGz+8KvoBLizWOJv3GNYkmO7aswtg3EAF4eR1SSIEY5H0GXpFsH+kuKJbVbw 155 | aTM0w+IfVwBvWDxhL6S/dJNf9HIuWWEZWAAMEwykrSqBtXhP0u09TICoZWZmlZ9a 156 | n6mFBSxL5ct05qNMPytPz/lTsqARsFXUelUwANipMJXxBlgAA5bFzNFOsfhXh3nQ 157 | sc67lSdaltH7SxVeYDerHUFLwvcTKsC7D7i5HxYogHaWH3zatNie7S/ngOdjvE3k 158 | KiA8xMw0isyPxQrEypDmMq+2vSp0hs5yPPABaRVXQRFOVdEmg5t89K1nu69KQzdP 159 | lJOSAPIIuGUYStsPBiq34k0tsGKcRUqdjbMl0JnH7SHgM0vcPhV3eVSuDDEbHdaP 160 | fB4PcGyWbz36YNulPqk6vewu0UmP7NIsBeZVjVVXuKazfIqoobURUCHbffnLJNvo 161 | IAPryqxfFHmt5v8e1B41bA8VtLjCq0Ar5iWkFBsC5xYnqDpvX3mWEbNKd238zU3Q 162 | Fn/DC5761gxNvZLdQ1R/tygnWxQmctJVZmwc4KweEUHSi4wOxpfYssFeBY9mVdXQ 163 | sDjeFqQ41GXv27piRI2IGJNyp1wU1u0OoiXoRdEKOywdIZS+HjzivmzjwyZBX/Br 164 | Ww== 165 | -----END CERTIFICATE----- 166 | 167 | ``` 168 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright {yyyy} {name of copyright owner} 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | 203 | --------------------------------------------------------------------------------