├── .gitignore
├── Nginx
├── .dockerignore
├── html
│ ├── index.html
│ └── test.html
├── docker-app
│ ├── Dockerfile
│ ├── Gemfile
│ ├── Gemfile.lock
│ └── app.rb
├── docker-nginx
│ ├── Dockerfile
│ └── nginx.conf
└── bootstrap.sh
├── Nginx-ClientCertAccess
├── .dockerignore
├── docker-nginx
│ ├── CertificateManagement
│ │ ├── serial
│ │ ├── revoked
│ │ │ ├── crlnumber
│ │ │ ├── crlnumber.old
│ │ │ └── crl.pem
│ │ ├── serial.old
│ │ ├── certindex.txt.attr
│ │ ├── certindex.txt.attr.old
│ │ ├── certindex.txt.old
│ │ ├── certindex.txt
│ │ ├── private
│ │ │ ├── ca.key
│ │ │ ├── client.key
│ │ │ └── server.key
│ │ ├── client.csr
│ │ ├── server.csr
│ │ ├── ca.crt
│ │ ├── openssl.cnf
│ │ ├── client.crt
│ │ ├── server.crt
│ │ └── certs
│ │ │ ├── 100001.pem
│ │ │ └── 100002.pem
│ ├── Dockerfile
│ ├── certs
│ │ ├── client.csr
│ │ ├── ca.crt
│ │ ├── client.crt
│ │ ├── server.csr
│ │ ├── server.crt
│ │ ├── client.key
│ │ ├── setup-certs.sh
│ │ ├── server.key
│ │ └── ca.key
│ └── nginx.conf
├── html
│ ├── index.html
│ └── test.html
├── docker-app
│ ├── Dockerfile
│ ├── Gemfile
│ ├── Gemfile.lock
│ └── app.rb
└── README.md
├── Ruby
├── src
│ ├── Gemfile
│ ├── Gemfile.lock
│ └── app.rb
├── README.md
└── Dockerfile
├── Nginx-HTTP2
├── docker-app
│ ├── Dockerfile
│ ├── Gemfile
│ ├── Gemfile.lock
│ └── app.rb
├── docker-nginx
│ ├── nginx.conf
│ └── certs
│ │ ├── setup-certs.sh
│ │ ├── server.csr
│ │ ├── server.crt
│ │ ├── ca.crt
│ │ ├── server.key
│ │ └── ca.key
└── README.md
├── Node
├── src
│ ├── package.json
│ └── index.js
├── README.md
└── Dockerfile
├── provision.sh
├── Vagrantfile
└── README.md
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 |
--------------------------------------------------------------------------------
/Nginx/.dockerignore:
--------------------------------------------------------------------------------
1 | html
2 | nginx.conf
3 |
--------------------------------------------------------------------------------
/Nginx-ClientCertAccess/.dockerignore:
--------------------------------------------------------------------------------
1 | html
2 | nginx.conf
3 |
--------------------------------------------------------------------------------
/Ruby/src/Gemfile:
--------------------------------------------------------------------------------
1 | source 'http://rubygems.org'
2 | gem 'sinatra'
3 |
--------------------------------------------------------------------------------
/Nginx-ClientCertAccess/docker-nginx/CertificateManagement/serial:
--------------------------------------------------------------------------------
1 | 100003
2 |
--------------------------------------------------------------------------------
/Nginx/html/index.html:
--------------------------------------------------------------------------------
1 |
Welcome
2 | This is my home page
3 |
--------------------------------------------------------------------------------
/Nginx-ClientCertAccess/docker-nginx/CertificateManagement/revoked/crlnumber:
--------------------------------------------------------------------------------
1 | 03
2 |
--------------------------------------------------------------------------------
/Nginx-ClientCertAccess/docker-nginx/CertificateManagement/serial.old:
--------------------------------------------------------------------------------
1 | 100002
2 |
--------------------------------------------------------------------------------
/Nginx/docker-app/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM ruby:2.1-onbuild
2 | CMD ["ruby", "app.rb"]
3 |
--------------------------------------------------------------------------------
/Nginx/docker-app/Gemfile:
--------------------------------------------------------------------------------
1 | source "http://rubygems.org/"
2 |
3 | gem "sinatra"
4 |
--------------------------------------------------------------------------------
/Nginx/html/test.html:
--------------------------------------------------------------------------------
1 | Hey there!
2 | Here is my test HTML file
3 |
--------------------------------------------------------------------------------
/Nginx-ClientCertAccess/docker-nginx/CertificateManagement/revoked/crlnumber.old:
--------------------------------------------------------------------------------
1 | 02
2 |
--------------------------------------------------------------------------------
/Nginx-HTTP2/docker-app/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM ruby:2.1-onbuild
2 | CMD ["ruby", "app.rb"]
3 |
--------------------------------------------------------------------------------
/Nginx-ClientCertAccess/html/index.html:
--------------------------------------------------------------------------------
1 | Welcome
2 | This is my home page
3 |
--------------------------------------------------------------------------------
/Nginx-ClientCertAccess/docker-app/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM ruby:2.1-onbuild
2 | CMD ["ruby", "app.rb"]
3 |
--------------------------------------------------------------------------------
/Nginx-ClientCertAccess/html/test.html:
--------------------------------------------------------------------------------
1 | Hey there!
2 | Here is my test HTML file
3 |
--------------------------------------------------------------------------------
/Nginx-ClientCertAccess/docker-nginx/CertificateManagement/certindex.txt.attr:
--------------------------------------------------------------------------------
1 | unique_subject = yes
2 |
--------------------------------------------------------------------------------
/Nginx-HTTP2/docker-app/Gemfile:
--------------------------------------------------------------------------------
1 | source "http://rubygems.org/"
2 |
3 | gem "sinatra"
4 | gem "thin"
5 |
--------------------------------------------------------------------------------
/Nginx-ClientCertAccess/docker-nginx/CertificateManagement/certindex.txt.attr.old:
--------------------------------------------------------------------------------
1 | unique_subject = yes
2 |
--------------------------------------------------------------------------------
/Nginx-ClientCertAccess/docker-app/Gemfile:
--------------------------------------------------------------------------------
1 | source "http://rubygems.org/"
2 |
3 | gem "sinatra"
4 | gem "thin"
5 |
--------------------------------------------------------------------------------
/Nginx-ClientCertAccess/docker-nginx/CertificateManagement/certindex.txt.old:
--------------------------------------------------------------------------------
1 | V 161002141423Z 100001 unknown /C=UK/CN=TheServer/emailAddress=server@integralist.com
2 | V 161002142307Z 100002 unknown /C=UK/CN=TheClient/emailAddress=client@integralist.com
3 |
--------------------------------------------------------------------------------
/Nginx-ClientCertAccess/docker-nginx/CertificateManagement/certindex.txt:
--------------------------------------------------------------------------------
1 | V 161002141423Z 100001 unknown /C=UK/CN=TheServer/emailAddress=server@integralist.com
2 | R 161002142307Z 151003151428Z 100002 unknown /C=UK/CN=TheClient/emailAddress=client@integralist.com
3 |
--------------------------------------------------------------------------------
/Node/src/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "docker-centos-hello",
3 | "private": true,
4 | "version": "0.0.1",
5 | "description": "Node.js Hello World app on CentOS using docker",
6 | "author": "Daniel Gasienica ",
7 | "dependencies": {
8 | "express": "3.2.4"
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/Node/src/index.js:
--------------------------------------------------------------------------------
1 | var express = require('express');
2 |
3 | // Constants
4 | var PORT = 8080;
5 |
6 | // App
7 | var app = express();
8 | app.get('/', function (req, res) {
9 | res.send('Hello World (from NodeJS)\n');
10 | });
11 |
12 | app.listen(PORT);
13 | console.log('Running on http://localhost:' + PORT);
14 |
--------------------------------------------------------------------------------
/Ruby/src/Gemfile.lock:
--------------------------------------------------------------------------------
1 | GEM
2 | remote: http://rubygems.org/
3 | specs:
4 | rack (1.5.2)
5 | rack-protection (1.5.3)
6 | rack
7 | sinatra (1.4.5)
8 | rack (~> 1.4)
9 | rack-protection (~> 1.4)
10 | tilt (~> 1.3, >= 1.3.4)
11 | tilt (1.4.1)
12 |
13 | PLATFORMS
14 | ruby
15 |
16 | DEPENDENCIES
17 | sinatra
18 |
--------------------------------------------------------------------------------
/Nginx/docker-app/Gemfile.lock:
--------------------------------------------------------------------------------
1 | GEM
2 | remote: http://rubygems.org/
3 | specs:
4 | rack (1.6.4)
5 | rack-protection (1.5.3)
6 | rack
7 | sinatra (1.4.6)
8 | rack (~> 1.4)
9 | rack-protection (~> 1.4)
10 | tilt (>= 1.3, < 3)
11 | tilt (2.0.1)
12 |
13 | PLATFORMS
14 | ruby
15 |
16 | DEPENDENCIES
17 | sinatra
18 |
19 | BUNDLED WITH
20 | 1.10.5
21 |
--------------------------------------------------------------------------------
/Nginx/docker-nginx/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM ubuntu
2 |
3 | # install nginx
4 | RUN apt-get update && apt-get install -y nginx
5 | RUN rm -rf /etc/nginx/sites-enabled/default
6 |
7 | # forward request and error logs to docker log collector
8 | RUN ln -sf /dev/stdout /var/log/nginx/access.log
9 | RUN ln -sf /dev/stderr /var/log/nginx/error.log
10 |
11 | EXPOSE 80 443
12 | CMD ["nginx", "-g", "daemon off;"]
13 |
--------------------------------------------------------------------------------
/provision.sh:
--------------------------------------------------------------------------------
1 | cat > /etc/systemd/system/docker-tcp.socket < 1.4)
11 | rack-protection (~> 1.4)
12 | tilt (>= 1.3, < 3)
13 | thin (1.6.4)
14 | daemons (~> 1.0, >= 1.0.9)
15 | eventmachine (~> 1.0, >= 1.0.4)
16 | rack (~> 1.0)
17 | tilt (2.0.1)
18 |
19 | PLATFORMS
20 | ruby
21 |
22 | DEPENDENCIES
23 | sinatra
24 | thin
25 |
26 | BUNDLED WITH
27 | 1.10.5
28 |
--------------------------------------------------------------------------------
/Nginx/bootstrap.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | docker build -t my-ruby-app ./docker-app
4 | docker build -t my-nginx ./docker-nginx
5 | docker run --name ruby-app -p 4567:4567 -d my-ruby-app
6 | docker run --name nginx-container \
7 | -v $(pwd)/html:/usr/share/nginx/html:ro \
8 | -v $(pwd)/docker-nginx/nginx.conf:/etc/nginx/nginx.conf:ro \
9 | --link ruby-app:app \
10 | -P -d my-nginx
11 | curl http://$(docker-machine ip dev):32769/
12 | curl http://$(docker-machine ip dev):32769/test.html
13 | curl http://$(docker-machine ip dev):32769/app/
14 | curl http://$(docker-machine ip dev):32769/app/foo
15 |
--------------------------------------------------------------------------------
/Nginx-ClientCertAccess/docker-app/Gemfile.lock:
--------------------------------------------------------------------------------
1 | GEM
2 | remote: http://rubygems.org/
3 | specs:
4 | daemons (1.2.3)
5 | eventmachine (1.0.8)
6 | rack (1.6.4)
7 | rack-protection (1.5.3)
8 | rack
9 | sinatra (1.4.6)
10 | rack (~> 1.4)
11 | rack-protection (~> 1.4)
12 | tilt (>= 1.3, < 3)
13 | thin (1.6.4)
14 | daemons (~> 1.0, >= 1.0.9)
15 | eventmachine (~> 1.0, >= 1.0.4)
16 | rack (~> 1.0)
17 | tilt (2.0.1)
18 |
19 | PLATFORMS
20 | ruby
21 |
22 | DEPENDENCIES
23 | sinatra
24 | thin
25 |
26 | BUNDLED WITH
27 | 1.10.5
28 |
--------------------------------------------------------------------------------
/Nginx-HTTP2/docker-app/app.rb:
--------------------------------------------------------------------------------
1 | require "sinatra"
2 |
3 | # Utilise the Thin server in order to accept data passed from nginx
4 | set :server, %w[thin webrick]
5 |
6 | # Bind to ALL device interfaces
7 | # This is so the application localhost can be accessed outside the Docker container
8 | #
9 | # So although in the Dockerfile we expose port 4567 to the host machine
10 | # we're not exposing the Boot2Docker VM's localhost unless we set the application to
11 | # bind to all the available interfaces
12 | set :bind, "0.0.0.0"
13 |
14 | get "/" do
15 | "Hello World"
16 | end
17 |
18 | get "/foo" do
19 | "Foo!"
20 | end
21 |
--------------------------------------------------------------------------------
/Nginx-ClientCertAccess/docker-app/app.rb:
--------------------------------------------------------------------------------
1 | require "sinatra"
2 |
3 | # Utilise the Thin server in order to accept data passed from nginx
4 | set :server, %w[thin webrick]
5 |
6 | # Bind to ALL device interfaces
7 | # This is so the application localhost can be accessed outside the Docker container
8 | #
9 | # So although in the Dockerfile we expose port 4567 to the host machine
10 | # we're not exposing the Boot2Docker VM's localhost unless we set the application to
11 | # bind to all the available interfaces
12 | set :bind, "0.0.0.0"
13 |
14 | get "/" do
15 | "Hello World"
16 | end
17 |
18 | get "/foo" do
19 | "Foo!"
20 | end
21 |
22 | get "/cert" do
23 | request.env["HTTP_X_CLIENTCERT_DN"]
24 | end
25 |
--------------------------------------------------------------------------------
/Node/README.md:
--------------------------------------------------------------------------------
1 | ```bash
2 | # Create an image from our Dockerfile
3 | docker build -t integralist/nodejs .
4 |
5 | # Check the image was created
6 | docker images
7 |
8 | # Run a container (in the background using -d) from our image
9 | # Make sure to expose the port to the CoreOS VM (using -p host:container)
10 | docker run -p 8080:8080 -d integralist/nodejs
11 |
12 | # Check the container is running
13 | docker ps
14 |
15 | # Check the output of the containers logs
16 | # You should see information about the localhost:port being used
17 | docker logs {container_id}
18 |
19 | # Test you get the relevant response
20 | # Note: the ip is a private range ip defined in the CoreOS Vagrantfile
21 | curl -i http://172.17.8.100:8080/
22 | ```
23 |
--------------------------------------------------------------------------------
/Ruby/README.md:
--------------------------------------------------------------------------------
1 | ```bash
2 | # Create an image from our Dockerfile
3 | docker build -t integralist/sinatra .
4 |
5 | # Check the image was created
6 | docker images
7 |
8 | # Run a container (in the background using -d) from our image
9 | # Make sure to expose the port to the CoreOS VM (using -p host:container)
10 | docker run -p 4567:4567 -d integralist/sinatra
11 |
12 | # Check the container is running
13 | docker ps
14 |
15 | # Check the output of the containers logs
16 | # You should see information about the localhost:port being used
17 | docker logs {container_id}
18 |
19 | # Test you get the relevant response
20 | # Note: the ip is a private range ip defined in the CoreOS Vagrantfile
21 | curl -i http://172.17.8.100:4567/
22 | ```
23 |
--------------------------------------------------------------------------------
/Nginx-HTTP2/docker-nginx/nginx.conf:
--------------------------------------------------------------------------------
1 | user nobody nogroup;
2 | worker_processes auto;
3 |
4 | events {
5 | worker_connections 512;
6 | }
7 |
8 | http {
9 | upstream app {
10 | server app:4567;
11 | }
12 |
13 | # REDIRECTION DOESN'T REALLY WORK WITH CONTAINERS
14 | server {
15 | listen *:80;
16 |
17 | location /app/ {
18 | return 301 https://$host$request_uri;
19 | }
20 | }
21 |
22 | server {
23 | listen *:443 ssl http2;
24 | server_name integralist.com;
25 |
26 | ssl_certificate /etc/nginx/certs/server.crt;
27 | ssl_certificate_key /etc/nginx/certs/server.key;
28 | ssl_trusted_certificate /etc/nginx/certs/ca.crt;
29 |
30 | location /app/ {
31 | proxy_pass http://app/;
32 | }
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/Ruby/Dockerfile:
--------------------------------------------------------------------------------
1 | # Build from...
2 | FROM ubuntu:14.04
3 | MAINTAINER Mark McDonnell
4 |
5 | # Install Ruby and Sinatra
6 | RUN apt-get -qq update
7 | RUN apt-get -qqy install ruby ruby-dev
8 | RUN gem install sinatra
9 |
10 | # Note:
11 | # We have a Gemfile that specifies Sinatra as a dependency,
12 | # so we probably should only install Ruby and change to `gem install bundler`
13 | # Then we could avoid using ENTRYPOINT and use CMD to construct a command like:
14 | # `bundle install && ruby /src/app.rb`
15 |
16 | # Add our current directory into the /src directory of the container
17 | ADD ./src /ruby-app
18 |
19 | # Make sure to expose the port so we can access the application outside of the VM
20 | EXPOSE 4567
21 |
22 | ENTRYPOINT ["ruby", "/ruby-app/app.rb"]
23 |
--------------------------------------------------------------------------------
/Nginx-ClientCertAccess/docker-nginx/CertificateManagement/revoked/crl.pem:
--------------------------------------------------------------------------------
1 | -----BEGIN X509 CRL-----
2 | MIIB5jCCAU8CAQEwDQYJKoZIhvcNAQEEBQAwXzELMAkGA1UEBhMCVUsxFzAVBgNV
3 | BAoTDkludGVncmFsaXN0THRkMRQwEgYDVQQDEwtJbnRlZ3JhbGlzdDEhMB8GCSqG
4 | SIb3DQEJARYSY2FAaW50ZWdyYWxpc3QuY29tFw0xNTEwMDMxNTE3MjRaFw0xNTEx
5 | MDIxNTE3MjRaMBYwFAIDEAACFw0xNTEwMDMxNTE0MjhaoIGjMIGgMIGRBgNVHSME
6 | gYkwgYaAFEM6dUHhrkbwX6z0JGo629ExfidroWOkYTBfMQswCQYDVQQGEwJVSzEX
7 | MBUGA1UEChMOSW50ZWdyYWxpc3RMdGQxFDASBgNVBAMTC0ludGVncmFsaXN0MSEw
8 | HwYJKoZIhvcNAQkBFhJjYUBpbnRlZ3JhbGlzdC5jb22CCQDghojoygx/KTAKBgNV
9 | HRQEAwIBAjANBgkqhkiG9w0BAQQFAAOBgQCqGogao6GDqMida/k+eVNIFwbh+bJ9
10 | K0NADTVWgDQT9IjlM1kZY5yG+UoxQXr3usLZ0Sw/8X/M54bSTsZF/3KsPsR6dIYC
11 | jPHBYyWbNBZFJptnVsGe9sxO1Nx0HmoOuHpCH6nIwKM1L1PyqKLj6skYcyiUBER4
12 | +Tjwz9aCWx2kiA==
13 | -----END X509 CRL-----
14 |
--------------------------------------------------------------------------------
/Node/Dockerfile:
--------------------------------------------------------------------------------
1 | # Build from...
2 | FROM centos:centos6
3 |
4 | # Enable EPEL (Extra Packages for Enterprise Linux) for Node.js
5 | # https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager#enterprise-linux-rhel-centos-fedora-etc
6 | RUN rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
7 |
8 | # Install Node.js and npm
9 | RUN yum install -y nodejs npm --enablerepo=epel
10 |
11 | # Bundle app source
12 | ADD ./src /node-app
13 |
14 | # Install app dependencies
15 | RUN cd /node-app; npm install
16 |
17 | # The app binds to port 8080 so we'll expose it
18 | EXPOSE 8080
19 |
20 | # CMD doesn't run at build time
21 | # it is the intended command for the container when run with `docker run`
22 | # if the user specifies arguments to `docker run` then they override the below CMD
23 | CMD ["node", "/node-app/index.js"]
24 |
--------------------------------------------------------------------------------
/Nginx-ClientCertAccess/docker-nginx/certs/client.csr:
--------------------------------------------------------------------------------
1 | -----BEGIN CERTIFICATE REQUEST-----
2 | MIICgzCCAWsCAQAwPjEXMBUGA1UEAxMOTWFyayBNY0Rvbm5lbGwxIzAhBgkqhkiG
3 | 9w0BCQEWFG1hcmtAaW50ZWdyYWxpc3QuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOC
4 | AQ8AMIIBCgKCAQEAwb/XVduOdCR1i5iAVhBZK/jTmPPjI34+BVOI1CRrljOh0/hh
5 | Gr8IsYmUOcUXx4wTK81AKBMcmU1Hint0joJP+J9A7TE8lqi76GK0AzzAdxBu0KCb
6 | u4hvISb2QW8Ugb/jGDj4zvWI375sLynLv3Abplf6e8iKnKQ7o2JujwpAKZwbgcKu
7 | n9Fyg+jjrvygqDaYHkF6HdxqdUaAHmvEBZpPesqYRxa+rOS3MAsIneCNwMNc+H9R
8 | 9QLsqbHCNtXOgxgTzlA6hRxlScalmPGIq2qR64E9lLwxqrQZb8GD019ENVo46IfX
9 | c5I9z/87QDyTrhVNJXHEkYBx2DQ4rGlSbBBIEwIDAQABoAAwDQYJKoZIhvcNAQEF
10 | BQADggEBAFfq395/dnX3qSbFX5dABRGzrvj6ypzkxmIYjMgkk4GTTqtOVN8nYuys
11 | Vs6UIGQ2J6QhRZxe8jjsjo0/J0+CnNELYtHNUYnI3AGXlSZ633lJ+oCS+mkCDK+g
12 | tNlWFUCGUODPpHnVSeu0RO3PUBjvD6dSH7Da2YSpXSN2jIwA58hPsSOnBzkpm2C0
13 | 7BWh+nLIUGcPe+uygReD0ypuTkuJZXNW25KueuEySan4Gk5L/bvkx6spmuiHqY7N
14 | qU9PCnclPh9/B23ZY3weIKY2uEEzg3pkaJ7V97rhjQijaO+u+fseDh/7DinncnF3
15 | OXnQ/ZCe4c3fg/uyUIoADgH19pa3qMk=
16 | -----END CERTIFICATE REQUEST-----
17 |
--------------------------------------------------------------------------------
/Nginx-ClientCertAccess/docker-nginx/CertificateManagement/private/ca.key:
--------------------------------------------------------------------------------
1 | -----BEGIN RSA PRIVATE KEY-----
2 | Proc-Type: 4,ENCRYPTED
3 | DEK-Info: DES-EDE3-CBC,FC440F5BB39D7AF7
4 |
5 | iFoCG5LfvFOjlzrbstSobzHCfRqA7CJ1anZMgw+qZBzDQcovTmeSp7xfh1sUWZHR
6 | ByXqi3kuwnxYltxprzlv5m9e91KuV9SX02yioehlEqe1KqRSlwXTMLmBpmQnSSw8
7 | +5XUf5y/agiRfRNCV1Avk7ocJ6VxBd6uiCEmTiXgAxP4xSFbaxqKoulOrSpqjquQ
8 | 0F+CmknZDfYcXWc/DwOJXp7oRemztEbPTsDDRd448U32dTxflFP8wBCyBY86Fep5
9 | 9sOFlT+Nw/7Xms5NeH9zVfUljFmBl5lznbjozn7Vmn2NfphGdT0G0lbWlcLzDiUy
10 | VoM1fstEqgZlIREr3D7Jiu6Qk6cdEh++kLIUNXbpr4C+avXgpa/W4hRfyab8zt/y
11 | K8LZxOxqyzioe7H5UfIreW48V9QbM4gNFtj60xaOxY0yq7Pim7Q2paT/mo7KjOc9
12 | HYGdxwzDoW1MxrnHg1VrfLBIUzCQAUZQKu5Pp1Vm9HMU7tumlHcCvQlUQVKDQH1m
13 | sr8QOS+QCQn2O1udlLCPKkqUeNXCJZicQdn9DbWV6bcCgUznzk+3KqbVDqHXNXdk
14 | jxq/CE/nz2j9nzJpv7Rgyns1dIIYEIrjmkPjGmHS82Xn/Haljco2gn3IM/jPc+Gp
15 | 5t2XNYK0QwQXBO0UQnrcKBELhUZ0P2bOR0HUq3udEGXanuPnx5+YVfOWeRrHRSfF
16 | 5vQ6xnIjXu8skfqJy7ycQUZbnJXlzZdrPitU71WIU8m2Jg5Hsp5ZXmQaNE8q4xjA
17 | D9HNPPUsx1XXYEbfSvj1M2+gJ6Xm2wGc9VcSqB87pgN9fmvUDJhniw==
18 | -----END RSA PRIVATE KEY-----
19 |
--------------------------------------------------------------------------------
/Nginx-ClientCertAccess/docker-nginx/CertificateManagement/client.csr:
--------------------------------------------------------------------------------
1 | -----BEGIN CERTIFICATE REQUEST-----
2 | MIICyDCCAbACAQAwSDElMCMGCSqGSIb3DQEJARYWY2xpZW50QGludGVncmFsaXN0
3 | LmNvbTELMAkGA1UEBhMCVUsxEjAQBgNVBAMTCVRoZUNsaWVudDCCASIwDQYJKoZI
4 | hvcNAQEBBQADggEPADCCAQoCggEBAK8P/EUMqBXVScI3j0/XZJfbMDaprO/GpAb+
5 | EasytQ0V4GS5abgOvIVzBbrAe1j+4WXztar9YxfEnGJ9Jzqc6EVF4Kc27sR/2jR4
6 | FdZyWHdhB9HEkWq4sOdTvljfyln04HA61PrX7NFRgrGk7Kitm0qLQMZhw+67bmFS
7 | +A+iPwbRTFXGcMo5/3R6UhDakpmDapMyE+5jt6NTEupgfAcPy6CEPOab9otaF/dW
8 | YMbLDKz+Kw32+vjUFMxmp5n9dbchizykpbAGHG75fSIIZoRn+IpE6EKL2vR6MexE
9 | DwQ9xTD08D/xFxaz+FxTA42E+y27L/aVB8R3vsoA+lnZjI58rYkCAwEAAaA7MDkG
10 | CSqGSIb3DQEJDjEsMCowCQYDVR0TBAIwADAdBgNVHQ4EFgQUbfZxVDjaxTolJCz1
11 | N7qYcuTCHAkwDQYJKoZIhvcNAQEEBQADggEBABzRQpNy+oC2yhdnEXrXRHkBiLbB
12 | o7lAmZXMq35esUpjjvoO6K/m3CS3YK+Th5XavsVsk0GHTInyRMwQ4o3x2nTJmKBG
13 | ARFDkfUCpqQESX23cuZ9WYYyYSR+w15XXOKTdCBfF6/fr7WKurbwNOkURWtTo5f8
14 | Rt5dFIlpgypIghWAjyQOooR86SYQAHk/qs4Myn/AYBgHBUeeFy15EW2iD1aFcOrr
15 | Gaw7LzD6gVOTyYfRuMsG71YHZQf8hidPx+KcejEGtfixSyzGfTLYr3QI/Khs3NcH
16 | NmzkQjpmaXa9DGfA9lQK4BuJd2ulXzewXUA9t5APeJncZMIwjLbZyWVQOpk=
17 | -----END CERTIFICATE REQUEST-----
18 |
--------------------------------------------------------------------------------
/Nginx-ClientCertAccess/docker-nginx/CertificateManagement/server.csr:
--------------------------------------------------------------------------------
1 | -----BEGIN CERTIFICATE REQUEST-----
2 | MIICyDCCAbACAQAwSDElMCMGCSqGSIb3DQEJARYWc2VydmVyQGludGVncmFsaXN0
3 | LmNvbTELMAkGA1UEBhMCVUsxEjAQBgNVBAMTCVRoZVNlcnZlcjCCASIwDQYJKoZI
4 | hvcNAQEBBQADggEPADCCAQoCggEBALeV1MYu0Rnljtn8/pVmQTpy8O1WVwlyU/gU
5 | JzEwvMVMVQA0PLT5GeqB/pmfFeBr8/ui3dT45TKV3YVaVIToFvvSAPn4TtnupqPo
6 | oNeUHwt2V1sF97fnt+nWJstFPi+shTbLIv0OhM7BCjDLV0kHpWp5QSJBsjZRb381
7 | 08hDUOR8hnttpG3IsKFlOTGiEEeTWt6jH09JQOfz4aIoVKU12PplQBEHjLlFleNB
8 | o0ET+xG+ZnvcKcx60a/jUp869WDT9tByAICSZz8wGBp9Ebq8jPaHcM49y7OTHo6J
9 | ekHunw73/wpZd54MtaQgMvyFFK9Kqq7OBEpN4nljh3r4sENqkMUCAwEAAaA7MDkG
10 | CSqGSIb3DQEJDjEsMCowCQYDVR0TBAIwADAdBgNVHQ4EFgQUqbYPdq7l35NPZv8J
11 | I0PTu72QyNMwDQYJKoZIhvcNAQEEBQADggEBADzjNtrobo/oZlvCa5hHVQMhH8Xo
12 | +5bpw+mtFVFoSoXT75C2AhK+xPgdZHGXPwsYTFOLTzNDTs6gqE7dSkhYGa2BK4Uq
13 | P7dnDIBSqRxu9n5258/CWbmH3zzCbu/OCkUnGWV5EWMNxKBgtkEHeKEkPmDTyQm7
14 | ECLPCH305dkckaJj0KrqO/lIpquIm7bpBfJItq8x7vMnPsWy/C4GtmK7XahmJgyv
15 | MLPOsLSbokn/pqSYoi+B+4jfQBGHqR+dMyZzE5WK2GfAk57zj6CaPIp02BCgxHZD
16 | uJIuvFcjJm/MUjs+tY2oi9tlcIks5e9k79W2hWxupbYp5uvhpE5vdvba5qA=
17 | -----END CERTIFICATE REQUEST-----
18 |
--------------------------------------------------------------------------------
/Nginx-ClientCertAccess/docker-nginx/certs/ca.crt:
--------------------------------------------------------------------------------
1 | -----BEGIN CERTIFICATE-----
2 | MIIDATCCAmqgAwIBAgIJAPyodSLqJLVaMA0GCSqGSIb3DQEBBQUAMF8xCzAJBgNV
3 | BAYTAlVLMRQwEgYDVQQKEwtJbnRlZ3JhbGlzdDEXMBUGA1UEAxMOSW50ZWdyYWxp
4 | c3RMdGQxITAfBgkqhkiG9w0BCQEWEmNhQGludGVncmFsaXN0LmNvbTAeFw0xNTEw
5 | MDMxMTIzMDNaFw0yNTA5MzAxMTIzMDNaMF8xCzAJBgNVBAYTAlVLMRQwEgYDVQQK
6 | EwtJbnRlZ3JhbGlzdDEXMBUGA1UEAxMOSW50ZWdyYWxpc3RMdGQxITAfBgkqhkiG
7 | 9w0BCQEWEmNhQGludGVncmFsaXN0LmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAw
8 | gYkCgYEAxiIJOfC+30TS6Nlg3Zh4K/YLyjLuf9nvXclbrC77Xm11Myw08P3MZKnT
9 | uFFWhS+3kbLocHEwd3YUG2Nti2KSB+g6tAVJx3n1Z0nQ4IVc7cBThMpt4B+Bvp1q
10 | MQN1xZqka/rIpRjHHa4JgteDR8PY8JSgu9pJ8yqg26DdA40RWg0CAwEAAaOBxDCB
11 | wTAdBgNVHQ4EFgQUvpsHxRJjiaubVCDNcZKf1A0kTVowgZEGA1UdIwSBiTCBhoAU
12 | vpsHxRJjiaubVCDNcZKf1A0kTVqhY6RhMF8xCzAJBgNVBAYTAlVLMRQwEgYDVQQK
13 | EwtJbnRlZ3JhbGlzdDEXMBUGA1UEAxMOSW50ZWdyYWxpc3RMdGQxITAfBgkqhkiG
14 | 9w0BCQEWEmNhQGludGVncmFsaXN0LmNvbYIJAPyodSLqJLVaMAwGA1UdEwQFMAMB
15 | Af8wDQYJKoZIhvcNAQEFBQADgYEAnUg/taaSFPyb6JvoNpq/4U4a3Y0/e1EQ0kZ/
16 | TPsyBbiI3osFs9dUltar0daxDJRlznRFbC4Ly52zCs3hq1n2VQf0c640uJ9meemo
17 | fWimApzs9cQhq5V/YDl2nvbE8Uy9dlUk2aU8uMVs3beIL3/I0RcVoF+tjPaayRbQ
18 | 7pmKqD8=
19 | -----END CERTIFICATE-----
20 |
--------------------------------------------------------------------------------
/Nginx-ClientCertAccess/docker-nginx/CertificateManagement/ca.crt:
--------------------------------------------------------------------------------
1 | -----BEGIN CERTIFICATE-----
2 | MIIDATCCAmqgAwIBAgIJAOCGiOjKDH8pMA0GCSqGSIb3DQEBBQUAMF8xCzAJBgNV
3 | BAYTAlVLMRcwFQYDVQQKEw5JbnRlZ3JhbGlzdEx0ZDEUMBIGA1UEAxMLSW50ZWdy
4 | YWxpc3QxITAfBgkqhkiG9w0BCQEWEmNhQGludGVncmFsaXN0LmNvbTAeFw0xNTEw
5 | MDMxNDA2MjJaFw0xNjEwMDIxNDA2MjJaMF8xCzAJBgNVBAYTAlVLMRcwFQYDVQQK
6 | Ew5JbnRlZ3JhbGlzdEx0ZDEUMBIGA1UEAxMLSW50ZWdyYWxpc3QxITAfBgkqhkiG
7 | 9w0BCQEWEmNhQGludGVncmFsaXN0LmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAw
8 | gYkCgYEAzDPMLpTzjCEHsf25GCjjyC2YsHIJA7sJvRkIy+8G10nZllSmqkB9Y5vR
9 | ZVTH2EjDKbPkrxNKkAtRPJrrBLZ74p6upQeBZoFGv7bnijM6h3lHMtqkLsLAHqq8
10 | dU1yzjcgHUSKwgImE/i2BnjakF1XyYep5KR6AOlyH4BIhM5QfnsCAwEAAaOBxDCB
11 | wTAdBgNVHQ4EFgQUQzp1QeGuRvBfrPQkajrb0TF+J2swgZEGA1UdIwSBiTCBhoAU
12 | Qzp1QeGuRvBfrPQkajrb0TF+J2uhY6RhMF8xCzAJBgNVBAYTAlVLMRcwFQYDVQQK
13 | Ew5JbnRlZ3JhbGlzdEx0ZDEUMBIGA1UEAxMLSW50ZWdyYWxpc3QxITAfBgkqhkiG
14 | 9w0BCQEWEmNhQGludGVncmFsaXN0LmNvbYIJAOCGiOjKDH8pMAwGA1UdEwQFMAMB
15 | Af8wDQYJKoZIhvcNAQEFBQADgYEAvCUkqSFPFtpywfhmf41fQZY++xMVtlviLO2k
16 | BP3vNBImfgVew+S3WJgnPpYm34F+rzXTCvZBxxR97fLzcX3sZ7QQQhxV5S3xB8Bl
17 | qnIGJ+zoxXoU1Z7qbwGGL6n5v/RCrmBa/vNFbng9xrjZPNZMSSSFKbnFLnxmGFQo
18 | oyaMhQo=
19 | -----END CERTIFICATE-----
20 |
--------------------------------------------------------------------------------
/Nginx-HTTP2/docker-nginx/certs/setup-certs.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | echo "Create the CA...\n"
4 | # Create the CA Key and Certificate for signing Client Certs
5 | # Just enter `pass` for the passphrase (doesn't matter as this isn't something you'd use in production)
6 | # For the ca.crt generation I pretty much entered . (which means 'no value') for all details
7 | # Only exception was the 'Common Name' field which I entered 'My Cool CA' (so I recognise it as the 'ca')
8 | openssl genrsa -des3 -out ca.key 4096
9 | openssl req -new -x509 -days 365 -key ca.key -out ca.crt
10 |
11 | echo "\nCreate the Server Key...\n"
12 | # Create the Server Key, CSR, and Certificate
13 | # Notice I don't specify -des3 as I don't want a passphrase
14 | # For the CSR I pretty much entered . (which means 'no value') for all details
15 | # Only exception was the 'Common Name' field which I entered 'Integralist' (so I recognise it as the 'server')
16 | openssl genrsa -out server.key 4096
17 |
18 | echo "\nCreate the Server CSR...\n"
19 | openssl req -new -key server.key -out server.csr
20 |
21 | echo "\nSelf-sign the Server CSR...\n"
22 | # We're self signing our own server cert here. This is a no-no in production.
23 | # Just need to enter `pass` for the CA key access
24 | openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt
25 |
--------------------------------------------------------------------------------
/Nginx/docker-nginx/nginx.conf:
--------------------------------------------------------------------------------
1 | user nobody nogroup;
2 | worker_processes auto; # auto-detect number of logical CPU cores
3 |
4 | events {
5 | worker_connections 512; # set the max number of simultaneous connections (per worker process)
6 | }
7 |
8 | http {
9 | upstream app {
10 | server app:4567; # app is automatically defined inside /etc/hosts by Docker
11 | }
12 |
13 | server {
14 | listen *:80; # Listen for incoming connections from any interface on port 80
15 | server_name ""; # Don't worry if "Host" HTTP Header is empty or not set
16 | root /usr/share/nginx/html; # serve static files from here
17 |
18 | location /app/ { # catch any requests that start with /app/
19 | proxy_pass http://app/; # proxy requests onto our app server (i.e. a different container)
20 | #
21 | # NOTE: If you don't put a forward slash / at the end of the upstream name
22 | # then you'll find nginx passes the request as /app/ rather than just /
23 | # Putting / after the upstream name means it acts more like the alias directive
24 | # If I kept it as http://app; then I would've needed to add a /app/ route to Sinatra
25 | }
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/Nginx-ClientCertAccess/docker-nginx/certs/client.crt:
--------------------------------------------------------------------------------
1 | -----BEGIN CERTIFICATE-----
2 | MIIDxzCCAa8CAQEwDQYJKoZIhvcNAQEFBQAwFTETMBEGA1UEAxMKTXkgQ29vbCBD
3 | QTAeFw0xNTEwMDIwODMxMTdaFw0xNjEwMDEwODMxMTdaMD4xFzAVBgNVBAMTDk1h
4 | cmsgTWNEb25uZWxsMSMwIQYJKoZIhvcNAQkBFhRtYXJrQGludGVncmFsaXN0LmNv
5 | bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMG/11XbjnQkdYuYgFYQ
6 | WSv405jz4yN+PgVTiNQka5YzodP4YRq/CLGJlDnFF8eMEyvNQCgTHJlNR4p7dI6C
7 | T/ifQO0xPJaou+hitAM8wHcQbtCgm7uIbyEm9kFvFIG/4xg4+M71iN++bC8py79w
8 | G6ZX+nvIipykO6Nibo8KQCmcG4HCrp/RcoPo4678oKg2mB5Beh3canVGgB5rxAWa
9 | T3rKmEcWvqzktzALCJ3gjcDDXPh/UfUC7KmxwjbVzoMYE85QOoUcZUnGpZjxiKtq
10 | keuBPZS8Maq0GW/Bg9NfRDVaOOiH13OSPc//O0A8k64VTSVxxJGAcdg0OKxpUmwQ
11 | SBMCAwEAATANBgkqhkiG9w0BAQUFAAOCAgEAWtCZ3ER/EqYAfPsZrE+VNzJY4gZ6
12 | IRacQYBZaz9CViqJOVo+9ki4GcCqiJ/yaqNKZMFBu/VgsxV6y0zU+DX8vfA6hnmt
13 | HuPHMF+KUUvRIygdi4EaaC3gElX7tytLQQ6BPMC9NMazmsthjH7+UoaLRX+EV+Hs
14 | BBh/E3341C+RG72bufbBPe1Fv+FDPb4Rpk/yx7O3c/2CikmyGnU16nUzEHElA7BN
15 | OLzFC4XAv0xq0+cXUqgI9BCGhwBtXaoJsifRZAhBmWiriA5ZAqdozQAoWB35p/AE
16 | vqj0gdlAv3yzMbjJmon6i8MSP81y0GDbnHjOzi91x8lj0oHmxK+nsJOH0B11ayGR
17 | VtYOCrBoOfi0MYbZUP4kEalAP153fhXI6bKr/5Czi9sAWoWD0nWqZghoKwIicADA
18 | OJR6d5FBHclFZ3L+lqBgI+OhBW0fSSQ+tLKTeQ12j/mw9JDFVp0klysezZY6GoAT
19 | UFEc9lBQsFkgft8DWzP0wsuWWaly+Noh1nqhHtnCeZ6EaKuNXTCCrkLVfnyYUeVj
20 | eewWpXYH6QJUKAoABI5X7xJ69ZExGaEZCz/wN6oUYs8ThkuFdIgCoabkGqJttg1u
21 | 5u/6F7AMGA/wqxKVUlJJ/BzTqiqf8q7PuKW5Wi8qj+1X2jlqcQ58ZDmKk8RgczIO
22 | soAdkN34N7Ht53E=
23 | -----END CERTIFICATE-----
24 |
--------------------------------------------------------------------------------
/Nginx-ClientCertAccess/docker-nginx/certs/server.csr:
--------------------------------------------------------------------------------
1 | -----BEGIN CERTIFICATE REQUEST-----
2 | MIIEWzCCAkMCAQAwFjEUMBIGA1UEAxMLSW50ZWdyYWxpc3QwggIiMA0GCSqGSIb3
3 | DQEBAQUAA4ICDwAwggIKAoICAQCzYD7uEaMwt2rJFwMx5wR70vIOv+FDzPwAYpvH
4 | XtIlKbE9X2as8TKtlHLJWlTxrBq+0goBDqzCkqrGL9Jg4cOFkiludF3HaZKklonu
5 | 8QY1/HHAYaK3AybiOoK37cyLPM64u3PORtjbcZqDljrNyHdtzt9ADeaUUYh5lQ0K
6 | Zd1gpHLkqsNcjVLgVbbOb6bt5Z4cDO5NSx1y8wS4hjjKokvdY8PrP7XfYBBcJp8F
7 | bzcTofLFivOUBHBLCJU7yZKLnBnma7WI76SG1FksIVtJGLK2ItTiI6se2+OU+Hup
8 | OYIdYMw5f7Vazfs5sWaMwSP5JCLsL3rDxLFkvEn2u8ZchrzCY7KiVJQWWbSL+yXg
9 | UrtroUpGKp0dSoM/16c2FDBv0T/rts2PCwrtTq0VnAIeAnxKLLSOPKkCDYttGQbV
10 | hySiaQVxcG4DXZYFVHLYeRKLeqwIyZqo6uZS9RwxI0qimwJOXf04wTxe6/qriH9s
11 | W8Swa/mU/5FU/dTt4xc8yCGObYIWBWjTHcuI3ZzWmVS6g2Xm0OKbldB5goqoP0Ps
12 | 9PJqpp52S4g/zmS82VN/bMv9NtePJKeQb0sxCqaV2IZNSsyRdmzi+3ifEBOkhVn5
13 | e/hpK70/x2t983lRuDewMPppaOq5WSrhW9TIxVFsdEg/x4ozDaxDjfmESmJGcxhL
14 | FGes6QIDAQABoAAwDQYJKoZIhvcNAQEFBQADggIBABiLex7EmxDcBW97sgMq9rSd
15 | spQl32cluHGD5av45qPvcTAvk41OsaJoWo7Sa/0woyJDbok7pXAcDtz0kOp9PX4K
16 | NH+Bdo8QNXTHF/xK4b8D1dmQ6UTP1OjN+SaeYpO+qdTZUX93ZQIT+VXkDAfdpaWm
17 | uOKKSAaev6dgPT92OGsGjHUwfgL7v5imG/lcqcoEPwTGZgOen01sjFMiY04N5pyG
18 | 4c26OPqBZBWGleQBSB6mtrfx0BsnDLKr6PT/i3XVYOg7Cime7egjvcMHa5+3i894
19 | NH/9X7Golr17Zjbh7S/AzkdXlk34TzZfFkobeHwEW3WwCl9PDO/cJXaDOPH+4cX8
20 | Vb5+jTLJ1yD7ojVw/uP/f2dOhk2XYAIwhkAlGQADv8FpSCskLex9uYB1ctQ0IqsF
21 | Ddzz2v0skPoek1le6TwA0K9h8hv2+sN8slk3FtW4EiVH8yTJPexFqSznxuY9AggF
22 | v/k+Nrz4KUh1M20kzoiMtkjubySXdOocIBr7q81DLs1J5vsd+YavS5GfzK0rAaI5
23 | cUb/N3youo7BePUXJgAKGIaXo+GUB4nIZnKeInXVftsHm8n2GKSk4VT52GxfvHqB
24 | 7zlTskSJ2En3fRxA5IXN/tHID/jNoDMrm3ZKvKbgFG5cf3XCbkKTcE+J2MLKjLQz
25 | Li/mwHURpmWkzy0CDR3y
26 | -----END CERTIFICATE REQUEST-----
27 |
--------------------------------------------------------------------------------
/Nginx-ClientCertAccess/docker-nginx/certs/server.crt:
--------------------------------------------------------------------------------
1 | -----BEGIN CERTIFICATE-----
2 | MIIEnzCCAocCAQEwDQYJKoZIhvcNAQEFBQAwFTETMBEGA1UEAxMKTXkgQ29vbCBD
3 | QTAeFw0xNTEwMDIwODI3MDFaFw0xNjEwMDEwODI3MDFaMBYxFDASBgNVBAMTC0lu
4 | dGVncmFsaXN0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAs2A+7hGj
5 | MLdqyRcDMecEe9LyDr/hQ8z8AGKbx17SJSmxPV9mrPEyrZRyyVpU8awavtIKAQ6s
6 | wpKqxi/SYOHDhZIpbnRdx2mSpJaJ7vEGNfxxwGGitwMm4jqCt+3MizzOuLtzzkbY
7 | 23Gag5Y6zch3bc7fQA3mlFGIeZUNCmXdYKRy5KrDXI1S4FW2zm+m7eWeHAzuTUsd
8 | cvMEuIY4yqJL3WPD6z+132AQXCafBW83E6HyxYrzlARwSwiVO8mSi5wZ5mu1iO+k
9 | htRZLCFbSRiytiLU4iOrHtvjlPh7qTmCHWDMOX+1Ws37ObFmjMEj+SQi7C96w8Sx
10 | ZLxJ9rvGXIa8wmOyolSUFlm0i/sl4FK7a6FKRiqdHUqDP9enNhQwb9E/67bNjwsK
11 | 7U6tFZwCHgJ8Siy0jjypAg2LbRkG1YckomkFcXBuA12WBVRy2HkSi3qsCMmaqOrm
12 | UvUcMSNKopsCTl39OME8Xuv6q4h/bFvEsGv5lP+RVP3U7eMXPMghjm2CFgVo0x3L
13 | iN2c1plUuoNl5tDim5XQeYKKqD9D7PTyaqaedkuIP85kvNlTf2zL/TbXjySnkG9L
14 | MQqmldiGTUrMkXZs4vt4nxATpIVZ+Xv4aSu9P8drffN5Ubg3sDD6aWjquVkq4VvU
15 | yMVRbHRIP8eKMw2sQ435hEpiRnMYSxRnrOkCAwEAATANBgkqhkiG9w0BAQUFAAOC
16 | AgEAMM53uFWlu4K0vkVhy5WHG/JoxqDQnBUjoasIob3Se8ABpba4U63IxDDxs8o1
17 | ObxssqwtYCsGhsCa2BEyORnHPPPkFZ8VkJo8wRQ2QqyO50bErxUPOKeFcRyQjdHB
18 | npSNNZ0gvP9KhTTob1Nk597aJETHNcDIp2+oHtNM+3LLPeMDnqsqDxa0oYeZSCK9
19 | M1G7LxNwrFtVrWCgd5wbnlaNIABi0KO6HIQxv6to1xB8xenln0RkmPj4eKN7ke5D
20 | 8eI5gjNXvLKm/9/LWcr7eHt31wnIodCRXpGdQklWLOXEQdD+26aUco1t9e6tQYcn
21 | Kaj9MwO52UAcon7QlFJMv0+QCIS28D/AXTzpVfZMW++VtGH9KWlXG8iXHgl9xjEj
22 | odoGG4Ld4aBhtfJ9W5PWNrmHSBt7uXcH5hatQmbl0dQqgpZuY7+iNyntDB5f8ujd
23 | DAnQ6rvaGN6UeLNVy13e4gYkEUbtGgDWgYk12qNlWBN1wTHYONjFSWVsoO8lnxt/
24 | KIg2Ys8YNwwuiAyi+iOLqwHqoO8YkL321fkdZfdl5OgTXTIDuzzRzLGoBV4Jzng7
25 | 5XFRMZ6JG68Kb7Ydt0p6UXMQZy6F6dq3MFCe30eh/X4i0YQM0Fjc/9he5QHWaM0e
26 | pqwLCmNMqaMBsJ+wHle1F8rUc0B2aKt22SQEDsDpUgn/5uQ=
27 | -----END CERTIFICATE-----
28 |
--------------------------------------------------------------------------------
/Nginx-ClientCertAccess/docker-nginx/certs/client.key:
--------------------------------------------------------------------------------
1 | -----BEGIN RSA PRIVATE KEY-----
2 | MIIEpAIBAAKCAQEAwb/XVduOdCR1i5iAVhBZK/jTmPPjI34+BVOI1CRrljOh0/hh
3 | Gr8IsYmUOcUXx4wTK81AKBMcmU1Hint0joJP+J9A7TE8lqi76GK0AzzAdxBu0KCb
4 | u4hvISb2QW8Ugb/jGDj4zvWI375sLynLv3Abplf6e8iKnKQ7o2JujwpAKZwbgcKu
5 | n9Fyg+jjrvygqDaYHkF6HdxqdUaAHmvEBZpPesqYRxa+rOS3MAsIneCNwMNc+H9R
6 | 9QLsqbHCNtXOgxgTzlA6hRxlScalmPGIq2qR64E9lLwxqrQZb8GD019ENVo46IfX
7 | c5I9z/87QDyTrhVNJXHEkYBx2DQ4rGlSbBBIEwIDAQABAoIBAAMQ0wpzv+xMi2Ob
8 | FSTHe3G7rTV1Xnm4TKju6nJY5S7qQDxHaNnwfeW5RJQpbzfkGoWN6N75dnFijKg/
9 | TdfXbgaEFpXqOogzwU1rCmgmtPDtXKOGdxBfl0qSAEGGzW9EJwbCGAXGUtUfgTy5
10 | z5SG5JkcOUVuJetWme765r7yrZM68w2SublebRuPVlHsE13bl8tXfUgAo9wSZaqJ
11 | q+0wGgjg2k3JVN/7h4QPe5BKdTsvv0DpwfuhbTVeyf1q/x9ihteU/CRI9Bigvw62
12 | BK55fOq7fvrFTMjLyiQSP88R4d2D6JHpSs3JXEdG/yY8INB07z6tmJxGa93wyJM/
13 | ZlXJacECgYEA8pfI1o4lzQIkiUHpWjDSUjwKouEauUcUlYrTKkiz7RiX6vtBHO0a
14 | 7wR6rVMqwEME1i1cuzwzcFDb5fVsIVznXMqUL7q5MAmjZv1+ujnExu/upJmN5F6r
15 | 8PXha7wVrsuNlwHJYnw0Unnw3iimbHZA6SRqveNXTwvwQzh2+79/i2ECgYEAzHUE
16 | I5YzTh6p99zO0nSvpyo6owb1kWfl8j7WcwO+VkrGAs0JEESAliha4SYrLpjnpP66
17 | MKugIJAiTMZ6FTuB4LVGG8H4d8LExcbgz82v0VjJOd83TIhfUT5Iy3vWj2PuL2Zo
18 | XvnLgwBTYXqC4rEaU851jQHXJDCUT03vequj2/MCgYEAwswxAGBaaDltPy5HBB4p
19 | 9NCztcDOJbK3C7HTCKQinqNd8dlZmrGmLAHLxHwA2yu1qYn5aXvYzjqPqSMeddfV
20 | DIS642yrobBLnrq1VTJoGVq2pUOMVbHTnYTDQzBftOFMy9IqdMPJe+ThDnNT18pJ
21 | Ky0L7XitNhMfFcs0d8h40WECgYAQhAtXjJSMZPG58f5LBd4ClOizrqY7nrb2gJj2
22 | JYFEmzmvlDx9MetpNc1RjrHCS9u6elE0CUkgGESNCyNlf68YJcyKBXs6wWL/zvbu
23 | EmF3ecKXiC6BYirA91UOCuzkHGBrN8yKj4cfB/G0WB8mjMPhrTXVtCZa6Amy9kq4
24 | EBFmfQKBgQCQqPdOrMzxkiXsqwa0Q+L0WisGBF03CAk/GWcQ66iJfLL6ODMxt4gX
25 | p4fJShNd6u1NX7/ygiHcBqE29KrNHoR2k1+lk7JRLLdhmHhrZAt8kznBy+2UMUNK
26 | KpEc+5r7Y0qO2ci3/ZhTCxLn2+3rbgfomMKkOlGAGIpJF9ozZ1Ivlw==
27 | -----END RSA PRIVATE KEY-----
28 |
--------------------------------------------------------------------------------
/Nginx-HTTP2/docker-nginx/certs/server.csr:
--------------------------------------------------------------------------------
1 | -----BEGIN CERTIFICATE REQUEST-----
2 | MIIEpzCCAo8CAQAwYjELMAkGA1UEBhMCVUsxFDASBgNVBAoTC0ludGVncmFsaXN0
3 | MRgwFgYDVQQDEw9pbnRlZ3JhbGlzdC5jb20xIzAhBgkqhkiG9w0BCQEWFG1hcmtA
4 | aW50ZWdyYWxpc3QuY29tMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA
5 | plhW3Wc8TeaiWCCu2UwZTYMxvMYSDOMCP7nspv6dgtHgAI32K8ZyKNxRJcTUrEvO
6 | A4Ic31cxn28/nizpJD3cvVY7BLA38KKXzbLRWx0/1+x5k/IoJWiuryX1bimV6ZP/
7 | vZrR4IcYhLHYUYLkR6i+xLfSvD5izdoAMN58I11Bu6HyB+rVs/PzBvCwspN7L+lO
8 | TBJfpBFxv3yx7dih7PdftWk52WhyXfD55WRLY/u5+fCFcxDOR7EZk67iDy2Mw/CS
9 | PRWmHKNxrr+GcxppCkn9AGSMWfSS4aA8wW3YHw0cto5iH0m/t/yrHlAJCEpFSEdb
10 | XoZUkZSUHcbX4iy/sJahvvIUSsXRsyoVoVPAoLHf2fhiGBy6q260+7sd6e0/eZX8
11 | qtIadzGaI7Cqo+rMshJHRFPp5Rmy0cy6cssTg5aRwSt9kGzr9JC9hcq8TLP/Hh5G
12 | 23yyDJW1iq/iUiqxbS8aHxB2FpSxd7MX3AlWjCJQ+gWb7Lh67oZv1gE6As1lYuEK
13 | Bdy5vikGWdt2ZN2UHHZ/DJPuuKFrOhSQ5MlMRegNapYaLRK5Bkip4cQFDTrju0Y2
14 | ati0+B5mo3j2tv7bxMxgVZGJfBxNmotPZG5LZDyxrir7Emu9/VLWYW1NLywRoprb
15 | FKIiubZSu3n6fttcGjn+cy0pBk5xnGoFlq3zkdQmIAcCAwEAAaAAMA0GCSqGSIb3
16 | DQEBBQUAA4ICAQAS7LJeJ6kp8vTDQunLhcJyx/iWnsvrfrLWaljnBMnMCNi62HEi
17 | awrxl2EPP9dUgMvgtpGVK3HkGU3CYN6vrWi/bXlCmwDcivDaTdTDXNowWdlcIzNz
18 | wgFDNKzYdFW/hR3jvrP1NaAFmHYIg3ElZEddOMYvvjIuQ1JbD0h6BY/3h6os6MoP
19 | t45vi8BCCB5j3xplxxbUH9e1RzaiY2e5UMtMpSoHjXh2AXCPkcOzChVN1jg7XKrw
20 | ro7yNmIKNKSX53rEUK9CfaOfH3dQYjGrQZ5BP6vf7bXp1h4H3SQahdI2NuhGXLhD
21 | 54KArnGfpAkMmzXOIi1pYOwkmAEWmcz14NB/pkL/JcHCGTKgv7xVJxphPdJNNYoI
22 | Q9Y8EI+jdZRIOlSitbGyc9Wi07Gqqqq/FPVVhsiPmo66oEq1qAQJvqBoSeLbu3cd
23 | KzNXyW81UGH5ZYaAHggzuVJyGZE+NZlTA2qxp732HXwVDeczzi1OUxV8EFHJUHiS
24 | Lsc7xVIHh8rR/rtWt6ov46tI1VePffoZwqh7ZkmXVTTs04ydrWv3V+r/dvtPPgwe
25 | I+F8MOem/sV6GsXlRIhmW/ees0utkdzyRhPwGplarIhjz0LJEOr1v+C04izDfwAl
26 | Uf/tqdJCel+US9mc3R9zZMqRzEmtSzqG97VmmP3kXBWmXPS01Ment7y3kg==
27 | -----END CERTIFICATE REQUEST-----
28 |
--------------------------------------------------------------------------------
/Nginx-ClientCertAccess/docker-nginx/CertificateManagement/private/client.key:
--------------------------------------------------------------------------------
1 | -----BEGIN RSA PRIVATE KEY-----
2 | MIIEowIBAAKCAQEArw/8RQyoFdVJwjePT9dkl9swNqms78akBv4RqzK1DRXgZLlp
3 | uA68hXMFusB7WP7hZfO1qv1jF8ScYn0nOpzoRUXgpzbuxH/aNHgV1nJYd2EH0cSR
4 | ariw51O+WN/KWfTgcDrU+tfs0VGCsaTsqK2bSotAxmHD7rtuYVL4D6I/BtFMVcZw
5 | yjn/dHpSENqSmYNqkzIT7mO3o1MS6mB8Bw/LoIQ85pv2i1oX91ZgxssMrP4rDfb6
6 | +NQUzGanmf11tyGLPKSlsAYcbvl9IghmhGf4ikToQova9Hox7EQPBD3FMPTwP/EX
7 | FrP4XFMDjYT7Lbsv9pUHxHe+ygD6WdmMjnytiQIDAQABAoIBAH9ogfB7GqXxOiI4
8 | r3urRpHiu389FBjaGCzioldXqz8fydVkwBVt3DS/ls7pIZyOu9qoeXI9we3dcPeZ
9 | IIDfC4jHJ45rQ3ENn/CJ6VLOm6Yen0NC7ZafXlitsR4bmbjIqMPlfXYmyjs5OIYz
10 | gu3sk9W37We0ZZYNIXOBn/o42egKHO/qwIRXKsLzFeoKxkZNOfWkrmcO5D5yRxUL
11 | GDOgtLCN496pqWg56sNLVNcX6mMnFptYZw5cyxThVeB3AYQU2I7Xec0MguZbrYd+
12 | 28Y2zPVJ8gKmKhb04K7vSBWRh02yHtGoR6sC3WeJflHQGfWHGULGWpU/GM5gFyuY
13 | CGxKuVUCgYEA4OAduy1zj+I/JVvDWHWLyKqNEiSQ9vJc8G6XHaGnZBZtwmc/HcSM
14 | Bw+f40snxV3NWda0fqJyiwsJ6XxS8+hi61CA0cLrwjGSr1Zxh3SNOSbYzTBu0s/D
15 | 97J6JGUWMAVhkZXa3vwKetvBPnsSoUqVHC5ME8CU5P6SwNp0LjpIRncCgYEAx0rf
16 | jf267Y+BY6afVSR9mMIkYEeR8+SFgDm/WMnzzM59Zd5LjEG+nodWsgaUhuDVNf/D
17 | PjUzoqO0yEhPJt10R60mcC828EUxEWT3VFctIifFhvxzTOmxsa9QlyxNvoi8y+pM
18 | szMbW9u+Ka3IRqy20kl0VD8Amdd9wn9aGOQ7q/8CgYAKIC1Wi1JjzTU4smwWZJyZ
19 | uYxGn9zjMcCblu85B1lpOVVR5qJB7eK8QqjZbD3rNjET9YYFGb18o0+b8twtXW5u
20 | 2B4k09kX0nGfcY4FImtlgmlKu/6RgYd6dM/pKaAZI3TkQFItrj2ukIygCpypJJmY
21 | PkFwtkA+G3RyOKP4nOk6OwKBgQDDu0eg/yhOFXlw0779Ml+gXly3qtMwBKsRaqYB
22 | oCcwaUVDfXYZhKCgti9xnYDWj48X/+BUApB6FeqCInKKq0l+9BIicFy20l4ExXMc
23 | hJoxR3p6vwrG6Wa6KoMuVjbtAQLcC3vVLEaci09TQ/jFYPAVzErSSyZd8gTzt3xX
24 | oiDxJQKBgACfyWR/cx4FNJ9EI8ylGPnyGq2hnTO/SCACXUg/FiGSDdDrfxFSBQUd
25 | Cyj8Zkx3OD8pnicB5K8dY6TzcTNc43DO5MxtpSTpkldxG5a4/BbtSGHqC5E/cHPc
26 | e+2PzGcnBpYGYHuHi0PixOKPCnqMoEB4Y6xrzGWtQwx6KPqPMKlS
27 | -----END RSA PRIVATE KEY-----
28 |
--------------------------------------------------------------------------------
/Nginx-ClientCertAccess/docker-nginx/CertificateManagement/private/server.key:
--------------------------------------------------------------------------------
1 | -----BEGIN RSA PRIVATE KEY-----
2 | MIIEpAIBAAKCAQEAt5XUxi7RGeWO2fz+lWZBOnLw7VZXCXJT+BQnMTC8xUxVADQ8
3 | tPkZ6oH+mZ8V4Gvz+6Ld1PjlMpXdhVpUhOgW+9IA+fhO2e6mo+ig15QfC3ZXWwX3
4 | t+e36dYmy0U+L6yFNssi/Q6EzsEKMMtXSQelanlBIkGyNlFvfzXTyENQ5HyGe22k
5 | bciwoWU5MaIQR5Na3qMfT0lA5/PhoihUpTXY+mVAEQeMuUWV40GjQRP7Eb5me9wp
6 | zHrRr+NSnzr1YNP20HIAgJJnPzAYGn0RuryM9odwzj3Ls5Mejol6Qe6fDvf/Cll3
7 | ngy1pCAy/IUUr0qqrs4ESk3ieWOHeviwQ2qQxQIDAQABAoIBAQCnEbJ93LMsJw2W
8 | cbdZTKJFx75brrwse5/Q3r4/9MOFpY6hTeiFJUChekWxleX5wyRZNwE7xHoIS/w5
9 | VFggT3pDFv0Ofxt7FsUN2zEsnr6V1s9upYKnGTf0lI/fYpdSGWVt1PV1Z9YStfhJ
10 | KXO4oT23JLvSqgi9h+S41spxsFkYZHJMVbHaGlQmfP3DVEHRYczJ3mSI86KLW0tv
11 | ojLvGbKuJw9IhsyWJ8CnnjS2mryzh3GpMQTe6riryqVaafU7Flwa0f5tGEJDNGXR
12 | T+q8OqL4bbBPI5xsxryB/q/sF/oMqeA50UEhPVU5rbBaq1CXTd9007u+aHe/2wzp
13 | bgN9c2SNAoGBAO4IbDAaIg2u9AoSZB0y+c/LaXMKanvYvx+hh1RUFB81K0KzqwIl
14 | Ej5oQFpIa1T7rc8UYHYUll+ZF6IJsrMinOVEMUNNXE13nVwQ0DCGMtNnV29z7Dxs
15 | zF0Hl3LKhQrlp6XTxPjSr7jHK4/QtGXopjOu/9TCts8D5T6M3rZ9PBCTAoGBAMVx
16 | TTjeuOY9Lg4QtllrkrAJtnDygOpY2cGxl1YzhTkntP5iPdVX3sDSXQ7vbr5hNvJx
17 | NgdBnTheHJdjRHvtfrT/74FbETBzJOXCu4VNFZcWUhrWVEY5K0Bjf5UmNc7gwrbd
18 | cFQDxFqmoLIxXdkvnThrBwkOhOxJHHwVkM4wCShHAoGBAJv5aOscNLRCsCbpZjC7
19 | 9nXzFGYNrTj6DkLr1YGsloLclDxg/u2o3QuHxKNkUPCe+oV3FL5LPz3lU1cag75e
20 | L/ELfjxbtOAOQU7StZkWVrewP9sIWwQ9RqyvDM5rZkJ9uh0vZyKk7ABogmL6nzsn
21 | 98BmK71+2ctNAiq6pDVwWquBAoGABUKZfhRg9LFYksNbOFKnW81GcQfk61lmo8Rp
22 | dcB1oioupkBTyWVH5/cyx30VhDjuz9K4T8UtvRy0wkvAvVR8dbID3XxhntrSdtST
23 | Tl/ZXWcY1OI06JIJVvPPqFeWQ2a1iU2o+nQHPSsHSPgLugeMtr4TN+iNHgZsndmt
24 | O/EHrW0CgYAJGoAezZg8WIgpjNuokim7j/ax/hU86FTHwfZGNiqDcgEA8R/R4E/o
25 | ujoNOoQG+KR2XXYfujaJw1A1IUSynqQf2D98J6ZUdBc3/288K0sGaB2dUUG/EHe4
26 | 0bqHk3qbQ2xUTKFUoweg6mTLoaf4frBAUD04Z7kC67v0u0YIAy/QwA==
27 | -----END RSA PRIVATE KEY-----
28 |
--------------------------------------------------------------------------------
/Vagrantfile:
--------------------------------------------------------------------------------
1 | $update_channel = "alpha"
2 |
3 | Vagrant.configure("2") do |config|
4 |
5 | config.vm.box = "coreos-%s" % $update_channel
6 | config.vm.box_version = ">= 308.0.1"
7 |
8 | # Box URL (overridden for VMware)
9 | config.vm.box_url = "http://%s.release.core-os.net/amd64-usr/current/coreos_production_vagrant.json" % $update_channel
10 | config.vm.provider :vmware_fusion do |vb, override|
11 | override.vm.box_url = "http://%s.release.core-os.net/amd64-usr/current/coreos_production_vagrant_vmware_fusion.json" % $update_channel
12 | end
13 |
14 | # VirtualBox doesn't have guest additions (or a functional vboxsf) in CoreOS
15 | # So here we're helping Vagrant to be smarter with its configuration
16 | config.vm.provider :virtualbox do |v|
17 | v.check_guest_additions = false
18 | v.functional_vboxsf = false
19 | end
20 |
21 | # Resolve issue with a specific Vagrant plugin by preventing it from updating
22 | if Vagrant.has_plugin?("vagrant-vbguest") then
23 | config.vbguest.auto_update = false
24 | end
25 |
26 | # Sets a hostname for the VM
27 | config.vm.hostname = "coreos-%s" % $update_channel
28 |
29 | # Configure the VM's Memory and CPU allocation
30 | config.vm.provider :virtualbox do |vb|
31 | vb.memory = 1024
32 | vb.cpus = 1
33 | end
34 |
35 | # 172 is a private network range (we add this in ~/.zshrc like so: `export DOCKER_HOST=tcp://172.17.8.100:2375`)
36 | config.vm.network :private_network, ip: "172.17.8.100"
37 |
38 | # Enable NFS for sharing the host machine into the coreos-vagrant VM
39 | config.vm.synced_folder ".", "/home/core/share",
40 | id: "core",
41 | :nfs => true,
42 | :mount_options => ['nolock,vers=3,udp']
43 |
44 | config.vm.provision "shell" do |s|
45 | s.privileged = true
46 | s.path = "provision.sh"
47 | end
48 |
49 | end
50 |
--------------------------------------------------------------------------------
/Nginx-ClientCertAccess/docker-nginx/nginx.conf:
--------------------------------------------------------------------------------
1 | user nobody nogroup;
2 | worker_processes auto; # auto-detect number of logical CPU cores
3 |
4 | events {
5 | worker_connections 512; # set the max number of simultaneous connections (per worker process)
6 | }
7 |
8 | http {
9 | upstream app {
10 | server app:4567; # app is automatically defined inside /etc/hosts by Docker
11 | }
12 |
13 | server {
14 | listen *:443; # Listen for incoming connections from any interface on port 443 (TLS)
15 | ssl on;
16 | server_name ""; # Don't worry if "Host" HTTP Header is empty or not set
17 |
18 | ssl_certificate /etc/nginx/certs/server.crt;
19 | ssl_certificate_key /etc/nginx/certs/server.key;
20 | ssl_client_certificate /etc/nginx/certs/ca.crt; # the cert used to sign the client certificates
21 | ssl_verify_client on; # force SSL verification (can also be set to 'optional')
22 | ssl_crl /etc/nginx/certs/crl.pem;
23 |
24 | root /usr/share/nginx/html; # serve static files from here
25 |
26 | location /app/ { # catch any requests that start with /app/
27 | proxy_pass http://app/; # proxy requests onto our app server (i.e. a different container)
28 | proxy_set_header X-ClientCert-DN $ssl_client_s_dn; # Thin server Request gets this as `HTTP_X_CLIENTCERT_DN`
29 | #
30 | # NOTE: If you don't put a forward slash / at the end of the upstream name
31 | # then you'll find nginx passes the request as /app/ rather than just /
32 | # Putting / after the upstream name means it acts more like the alias directive
33 | # If I kept it as http://app; then I would've needed to add a /app/ route to Sinatra
34 | }
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/Nginx-HTTP2/docker-nginx/certs/server.crt:
--------------------------------------------------------------------------------
1 | -----BEGIN CERTIFICATE-----
2 | MIIFITCCAwkCAQEwDQYJKoZIhvcNAQEFBQAwSzELMAkGA1UEBhMCVUsxDjAMBgNV
3 | BAoTBVRoZUNBMQ8wDQYDVQQDEwZUaGUgQ0ExGzAZBgkqhkiG9w0BCQEWDGNhQHRo
4 | ZWNhLmNvbTAeFw0xNTEwMTkwOTM5MDJaFw0xNjEwMTgwOTM5MDJaMGIxCzAJBgNV
5 | BAYTAlVLMRQwEgYDVQQKEwtJbnRlZ3JhbGlzdDEYMBYGA1UEAxMPaW50ZWdyYWxp
6 | c3QuY29tMSMwIQYJKoZIhvcNAQkBFhRtYXJrQGludGVncmFsaXN0LmNvbTCCAiIw
7 | DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKZYVt1nPE3molggrtlMGU2DMbzG
8 | EgzjAj+57Kb+nYLR4ACN9ivGcijcUSXE1KxLzgOCHN9XMZ9vP54s6SQ93L1WOwSw
9 | N/Cil82y0VsdP9fseZPyKCVorq8l9W4plemT/72a0eCHGISx2FGC5EeovsS30rw+
10 | Ys3aADDefCNdQbuh8gfq1bPz8wbwsLKTey/pTkwSX6QRcb98se3Yoez3X7VpOdlo
11 | cl3w+eVkS2P7ufnwhXMQzkexGZOu4g8tjMPwkj0Vphyjca6/hnMaaQpJ/QBkjFn0
12 | kuGgPMFt2B8NHLaOYh9Jv7f8qx5QCQhKRUhHW16GVJGUlB3G1+Isv7CWob7yFErF
13 | 0bMqFaFTwKCx39n4YhgcuqtutPu7HentP3mV/KrSGncxmiOwqqPqzLISR0RT6eUZ
14 | stHMunLLE4OWkcErfZBs6/SQvYXKvEyz/x4eRtt8sgyVtYqv4lIqsW0vGh8QdhaU
15 | sXezF9wJVowiUPoFm+y4eu6Gb9YBOgLNZWLhCgXcub4pBlnbdmTdlBx2fwyT7rih
16 | azoUkOTJTEXoDWqWGi0SuQZIqeHEBQ0647tGNmrYtPgeZqN49rb+28TMYFWRiXwc
17 | TZqLT2RuS2Q8sa4q+xJrvf1S1mFtTS8sEaKa2xSiIrm2Urt5+n7bXBo5/nMtKQZO
18 | cZxqBZat85HUJiAHAgMBAAEwDQYJKoZIhvcNAQEFBQADggIBAEkgMaX/KQi5wOhM
19 | 0OqHSefnLNepFMuhhx/xWdQ6aaHFHvt6921rX1IiKrVaHsbrGwKalps4j/+FwIKL
20 | Uh6Vhxke5T1k1mOLN7JFKx8RgBZ14ES9gH71rcq86uyzGd8/tVJ9vwkK1lrjtLXk
21 | fedPOQM69/mePDitZUGz7MidCipavDWBU/eg07WYHQa+5uubAuR8YEb3Dm1VsH7I
22 | G1zwNi3iLNuMJ43sG7x/oXZDG6cP3UfD1try8ouL+QO6ds4ajq+gThdn1IaJKUwE
23 | 9ITS+t0lEUkXqkjx+KZ5H5J425YoWLnU59FU6vkZLPTj3E/rAi+ejGbRLskl8UGl
24 | /9MDGk7r2kxm7dr6ijaZa/LgRkNlNaseXz4q7d+OTnldX/BEoTXYVZW9yzqoDps3
25 | U4nygxGkXziVowXVe+xkgve25BZJgEg/+KGD6cChSsjfaQXq5HDHrWg4Rju88xvY
26 | xrqAJD8+mn9/oDWDZ4D9B/eRumugypBlVDOhTLwcry67dfe+/8P2j0veR5FTyics
27 | ul7QqMZ4HnUNWz9ZD6XgBlyeK+REXM12wFeneG9ESK8EdKZ5bO4f9+fFh6RXSVYW
28 | 65Njy3AqAthW86skSPFr+D1eRVgIF43jrV7rmfpdq2GFB60HkXZIcQaRPzwycERR
29 | 6ANMXS5piXsxwlv9gH6zDzCLb/fW
30 | -----END CERTIFICATE-----
31 |
--------------------------------------------------------------------------------
/Nginx-ClientCertAccess/docker-nginx/certs/setup-certs.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | # Create the CA Key and Certificate for signing Client Certs
4 | # Just enter `pass` for the passphrase (doesn't matter as this isn't something you'd use in production)
5 | # For the ca.crt generation I pretty much entered . (which means 'no value') for all details
6 | # Only exception was the 'Common Name' field which I entered 'My Cool CA' (so I recognise it as the 'ca')
7 | openssl genrsa -des3 -out ca.key 4096
8 | openssl req -new -x509 -days 365 -key ca.key -out ca.crt
9 |
10 | # Create the Server Key, CSR, and Certificate
11 | # Notice I don't specify -des3 as I don't want a passphrase
12 | # For the CSR I pretty much entered . (which means 'no value') for all details
13 | # Only exception was the 'Common Name' field which I entered 'Integralist' (so I recognise it as the 'server')
14 | openssl genrsa -out server.key 4096
15 | openssl req -new -key server.key -out server.csr
16 |
17 | # We're self signing our own server cert here. This is a no-no in production.
18 | # Just need to enter `pass` for the CA key access
19 | openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt
20 |
21 | # Create the Client Key and CSR
22 | # Notice I don't specify -des3 as I don't want a passphrase
23 | # I've made the encryption length 2048 instead of 4096 as a speed/perf compromise
24 | # For the CSR I pretty much entered . (which means 'no value') for all details
25 | # Only exception was the 'Common Name' field which I entered 'Mark McDonnell' (so I recognise it as the 'client')
26 | # The other exception was the 'Email Address' field, as I want to parse out the email in my Ruby application
27 | openssl genrsa -out client.key 2048
28 | openssl req -new -key client.key -out client.csr
29 |
30 | # Sign the client certificate with our CA cert. Unlike signing our own server cert, this is what we want to do.
31 | # Just need to enter `pass` for the CA key access
32 | openssl x509 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out client.crt
33 |
--------------------------------------------------------------------------------
/Nginx-HTTP2/docker-nginx/certs/ca.crt:
--------------------------------------------------------------------------------
1 | -----BEGIN CERTIFICATE-----
2 | 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
33 | -----END CERTIFICATE-----
34 |
--------------------------------------------------------------------------------
/Nginx-HTTP2/README.md:
--------------------------------------------------------------------------------
1 | ## Certificates
2 |
3 | Run `sh setup-certs.sh`
4 |
5 | The CA details entered should be something like...
6 |
7 | ```
8 | Country Name: UK
9 | Organization Name: TheCA
10 | Common Name: The CA
11 | Email Address: ca@theca.com
12 | ```
13 |
14 | The CSR details entered should be something like...
15 |
16 | ```
17 | Country Name: UK
18 | Organization Name: Integralist
19 | Common Name: integralist.com
20 | Email Address: mark@integralist.com
21 | ```
22 |
23 | Which should result in a certificate with:
24 |
25 | ```
26 | subject=/C=UK/O=Integralist/CN=integralist.com/emailAddress=mark@integralist.com
27 | ```
28 |
29 | ## Building
30 |
31 | - `docker build -t my-ruby-app ./docker-app`
32 |
33 | ## Running
34 |
35 | Run the Ruby app:
36 |
37 | ```bash
38 | docker run --name ruby-app -p 4567:4567 -d my-ruby-app
39 | ```
40 |
41 | > Note: this will be accessible via http://<docker_ip>:4567/
42 |
43 | Run nginx (using latest/standard nginx container):
44 |
45 | ```bash
46 | docker run --name nginx-container \
47 | -v $(pwd)/docker-nginx/certs/server.crt:/etc/nginx/certs/server.crt \
48 | -v $(pwd)/docker-nginx/certs/server.key:/etc/nginx/certs/server.key \
49 | -v $(pwd)/docker-nginx/certs/ca.crt:/etc/nginx/certs/ca.crt \
50 | -v $(pwd)/docker-nginx/nginx.conf:/etc/nginx/nginx.conf:ro \
51 | --link ruby-app:app \
52 | -p 60080:80 \
53 | -p 60443:443 \
54 | -d nginx
55 | ```
56 |
57 | > Note: I switched to using explicit ports (`-p`) from dynamic ports (`-P`) because nginx needed access to the port for redirecting HTTP to HTTPS, but it seems A.) that didn't work and B.) there is no other easy solution (see https://github.com/docker/docker/issues/3778)
58 |
59 | Curl the service endpoint:
60 |
61 | ```bash
62 | export dev_ip=$(docker-machine ip dev)
63 | export dev_pt=$(docker port nginx-container 443 | awk -F ':' '{ print $2 }')
64 |
65 | curl --insecure https://$dev_ip:$dev_pt/app/
66 | curl --insecure https://$dev_ip:$dev_pt/app/foo
67 | ```
68 |
69 | ## View in browser
70 |
71 | There are two issues visting the above service endpoint via the browser:
72 |
73 | 1. The domain doesn't match the certificate
74 | 2. The certificate isn't verified/trusted
75 |
76 | The first problem we can solve locally by opening up `/etc/hosts` and adding `192.168.99.100 integralist.com` (the ip might be different for you, but that ip is effectively the result of running `docker-machine ip dev`). You can now access the service endpoint via `https://integralist.com:32772/app/foo`
77 |
78 | The second problem is solved by `curl` using the `--insecure` flag and in the browser you either ignore the 'warning' presented, OR you can add the certificate to your operating system's certificate keychain (so it knows the issuing CA is trusted).
79 |
80 | ## Debugging
81 |
82 | ```
83 | docker exec -it nginx-container bash
84 | ```
85 |
--------------------------------------------------------------------------------
/Nginx-ClientCertAccess/docker-nginx/CertificateManagement/openssl.cnf:
--------------------------------------------------------------------------------
1 | #
2 | # OpenSSL configuration file.
3 | #
4 |
5 | # Establish working directory.
6 | dir = .
7 |
8 | [ ca ]
9 | default_ca = CA_default
10 |
11 | [ CA_default ]
12 | serial = $dir/serial
13 | database = $dir/certindex.txt
14 | new_certs_dir = $dir/certs
15 | certificate = $dir/ca.crt
16 | private_key = $dir/private/ca.key
17 | default_days = 365
18 | default_md = md5
19 | default_crl_days = 30
20 | preserve = no
21 | email_in_dn = yes
22 | nameopt = default_ca
23 | certopt = default_ca
24 | policy = policy_match
25 | crl_dir = $dir/revoked
26 | crlnumber = $crl_dir/crlnumber
27 | crl_extensions = crl_ext
28 | x509_extensions = usr_cert
29 | copy_extensions = copy
30 |
31 | [ policy_match ]
32 | countryName = match # Must be the same as the CA
33 | stateOrProvinceName = optional # not required
34 | organizationName = optional # not required
35 | organizationalUnitName = optional # not required
36 | commonName = supplied # must be there, whatever it is
37 | emailAddress = supplied # must be there, whatever it is
38 |
39 | [ crl_ext ]
40 | authorityKeyIdentifier = keyid:always,issuer:always
41 |
42 | [ usr_cert ]
43 | basicConstraints = CA:FALSE
44 | subjectKeyIdentifier = hash
45 | authorityKeyIdentifier = keyid, issuer
46 | crlDistributionPoints = URI:http://www.yourdomain.com/ca/crl.pem # this should be updated to be unique to the CA
47 |
48 | [ req ]
49 | default_bits = 2048 # Size of keys
50 | default_keyfile = key.pem # name of generated keys
51 | default_md = md5 # message digest algorithm
52 | string_mask = nombstr # permitted characters
53 | distinguished_name = req_distinguished_name
54 | req_extensions = v3_req
55 |
56 | [ req_distinguished_name ]
57 | # Variable name Prompt string
58 | #------------------------- ----------------------------------
59 | 0.organizationName = Organization Name (company)
60 | organizationalUnitName = Organizational Unit Name (department, division)
61 | emailAddress = Email Address
62 | emailAddress_max = 40
63 | localityName = Locality Name (city, district)
64 | stateOrProvinceName = State or Province Name (full name)
65 | countryName = Country Name (2 letter code)
66 | countryName_min = 2
67 | countryName_max = 2
68 | commonName = Common Name (hostname, IP, or your name)
69 | commonName_max = 64
70 |
71 | # Default values for the above, for consistency and less typing.
72 | # Variable name Value
73 | #------------------------ ------------------------------
74 | 0.organizationName_default = My Company
75 | localityName_default = My Town
76 | stateOrProvinceName_default = State or Providence
77 | countryName_default = US
78 |
79 | [ v3_ca ]
80 | basicConstraints = CA:TRUE
81 | subjectKeyIdentifier = hash
82 | authorityKeyIdentifier = keyid:always,issuer:always
83 |
84 | [ v3_req ]
85 | basicConstraints = CA:FALSE
86 | subjectKeyIdentifier = hash
87 |
88 |
--------------------------------------------------------------------------------
/Nginx-HTTP2/docker-nginx/certs/server.key:
--------------------------------------------------------------------------------
1 | -----BEGIN RSA PRIVATE KEY-----
2 | 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
51 | -----END RSA PRIVATE KEY-----
52 |
--------------------------------------------------------------------------------
/Nginx-ClientCertAccess/docker-nginx/certs/server.key:
--------------------------------------------------------------------------------
1 | -----BEGIN RSA PRIVATE KEY-----
2 | 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
51 | -----END RSA PRIVATE KEY-----
52 |
--------------------------------------------------------------------------------
/Nginx-HTTP2/docker-nginx/certs/ca.key:
--------------------------------------------------------------------------------
1 | -----BEGIN RSA PRIVATE KEY-----
2 | Proc-Type: 4,ENCRYPTED
3 | DEK-Info: DES-EDE3-CBC,E1E612FC062C11F8
4 |
5 | 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
54 | -----END RSA PRIVATE KEY-----
55 |
--------------------------------------------------------------------------------
/Nginx-ClientCertAccess/docker-nginx/certs/ca.key:
--------------------------------------------------------------------------------
1 | -----BEGIN RSA PRIVATE KEY-----
2 | Proc-Type: 4,ENCRYPTED
3 | DEK-Info: DES-EDE3-CBC,BB4B268376960593
4 |
5 | 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
54 | -----END RSA PRIVATE KEY-----
55 |
--------------------------------------------------------------------------------
/Nginx-ClientCertAccess/README.md:
--------------------------------------------------------------------------------
1 | Make sure all the following commands are run from this project's root directory.
2 |
3 | Build the Docker images:
4 |
5 | ```bash
6 | docker build -t my-ruby-app ./docker-app
7 | docker build -t my-nginx ./docker-nginx
8 | ```
9 |
10 | Run the Docker containers:
11 |
12 | ```bash
13 | docker run --name ruby-app -p 4567:4567 -d my-ruby-app
14 | docker run --name nginx-container \
15 | -v $(pwd)/html:/usr/share/nginx/html:ro \
16 | -v $(pwd)/docker-nginx/certs:/etc/nginx/certs/ \
17 | -v $(pwd)/docker-nginx/nginx.conf:/etc/nginx/nginx.conf:ro \
18 | --link ruby-app:app \
19 | -P -d my-nginx
20 | ```
21 |
22 | Test the application is accessible via HTTPS:
23 |
24 | > Note: `` can be found by running `docker ps`
25 |
26 | ```bash
27 | # Should error as HTTP used instead of HTTPS (nginx is setup to only listen on 443 not 80)
28 | curl http://$(docker-machine ip dev):/
29 |
30 | # Should error as server's cert isn't trusted (i.e. it's self-signed)
31 | curl https://$(docker-machine ip dev):/
32 |
33 | # We can use --insecure to trust the self-signed certificate
34 |
35 | # Should show an error as no client certificate provided
36 | curl --insecure https://$(docker-machine ip dev):/
37 |
38 | # Define some local variables for client cert location
39 | client_key=$(pwd)/docker-nginx/certs/client.key
40 | client_crt=$(pwd)/docker-nginx/certs/client.crt
41 |
42 | # Following curl's should work as client cert are provided as flags
43 | # Make sure to change to whatever Docker has exposed it as
44 | curl --insecure --key $client_key --cert $client_crt https://$(docker-machine ip dev):/
45 | curl --insecure --key $client_key --cert $client_crt https://$(docker-machine ip dev):/test.html
46 | curl --insecure --key $client_key --cert $client_crt https://$(docker-machine ip dev):/app/
47 | curl --insecure --key $client_key --cert $client_crt https://$(docker-machine ip dev):/app/foo
48 |
49 | # Finally, let's test the client cert is being proxied through the HTTP request to the Ruby app:
50 | curl --insecure --key $client_key --cert $client_crt https://$(docker-machine ip dev):/app/cert
51 | ```
52 |
53 | If you get an error, such as:
54 |
55 | ```
56 | curl: (58) SSL: Can't load the certificate "/path/to/docker-nginx/certs/client.crt" and its private key: OSStatus -25299
57 | ```
58 |
59 | Then this is because the `curl` command on Mac OSX is fucked.
60 |
61 | Use a Docker container instead, like so:
62 |
63 | ```bash
64 | docker run \
65 | -it \
66 | -v $(pwd)/docker-nginx/certs:/var/cert \
67 | speg03/curl --insecure \
68 | --key /var/cert/client.key \
69 | --cert /var/cert/client.crt \
70 | https://$(docker-machine ip dev):$(docker port nginx-container 443 | awk -F ':' '{ print $2 }')/app/cert
71 | ```
72 |
73 | You should see something like the following output by the Ruby application
74 |
75 | ```
76 | /CN=Mark McDonnell/emailAddress=mark@integralist.com
77 | ```
78 |
79 | Now at this point you can parse your client certificate's CommonName (CN) however you like. In my application I just print it back out to the user, but in a real-world application you might want to use the details to present some nice personalised welcome message like "Hello Mark!" or whatever.
80 |
81 | Either way, you can only access the Ruby application if you provide a cert/key that was signed by the self-signed CA that is specified in the nginx configuration.
82 |
83 | If you were to try and provide a different cert/key (one that wasn't signed by the self-signed CA), then you'll see the following error response:
84 |
85 | ```html
86 |
87 | 400 The SSL certificate error
88 |
89 | 400 Bad Request
90 | The SSL certificate error
91 |
nginx/1.4.6 (Ubuntu)
92 |
93 |
94 | ```
95 |
96 | Which is great. That is exactly what we want to see: denying access to our service unless properly authorised.
97 |
--------------------------------------------------------------------------------
/Nginx-ClientCertAccess/docker-nginx/CertificateManagement/client.crt:
--------------------------------------------------------------------------------
1 | Certificate:
2 | Data:
3 | Version: 3 (0x2)
4 | Serial Number: 1048578 (0x100002)
5 | Signature Algorithm: md5WithRSAEncryption
6 | Issuer: C=UK, O=IntegralistLtd, CN=Integralist/emailAddress=ca@integralist.com
7 | Validity
8 | Not Before: Oct 3 14:23:07 2015 GMT
9 | Not After : Oct 2 14:23:07 2016 GMT
10 | Subject: C=UK, CN=TheClient/emailAddress=client@integralist.com
11 | Subject Public Key Info:
12 | Public Key Algorithm: rsaEncryption
13 | RSA Public Key: (2048 bit)
14 | Modulus (2048 bit):
15 | 00:af:0f:fc:45:0c:a8:15:d5:49:c2:37:8f:4f:d7:
16 | 64:97:db:30:36:a9:ac:ef:c6:a4:06:fe:11:ab:32:
17 | b5:0d:15:e0:64:b9:69:b8:0e:bc:85:73:05:ba:c0:
18 | 7b:58:fe:e1:65:f3:b5:aa:fd:63:17:c4:9c:62:7d:
19 | 27:3a:9c:e8:45:45:e0:a7:36:ee:c4:7f:da:34:78:
20 | 15:d6:72:58:77:61:07:d1:c4:91:6a:b8:b0:e7:53:
21 | be:58:df:ca:59:f4:e0:70:3a:d4:fa:d7:ec:d1:51:
22 | 82:b1:a4:ec:a8:ad:9b:4a:8b:40:c6:61:c3:ee:bb:
23 | 6e:61:52:f8:0f:a2:3f:06:d1:4c:55:c6:70:ca:39:
24 | ff:74:7a:52:10:da:92:99:83:6a:93:32:13:ee:63:
25 | b7:a3:53:12:ea:60:7c:07:0f:cb:a0:84:3c:e6:9b:
26 | f6:8b:5a:17:f7:56:60:c6:cb:0c:ac:fe:2b:0d:f6:
27 | fa:f8:d4:14:cc:66:a7:99:fd:75:b7:21:8b:3c:a4:
28 | a5:b0:06:1c:6e:f9:7d:22:08:66:84:67:f8:8a:44:
29 | e8:42:8b:da:f4:7a:31:ec:44:0f:04:3d:c5:30:f4:
30 | f0:3f:f1:17:16:b3:f8:5c:53:03:8d:84:fb:2d:bb:
31 | 2f:f6:95:07:c4:77:be:ca:00:fa:59:d9:8c:8e:7c:
32 | ad:89
33 | Exponent: 65537 (0x10001)
34 | X509v3 extensions:
35 | X509v3 Basic Constraints:
36 | CA:FALSE
37 | X509v3 Subject Key Identifier:
38 | 6D:F6:71:54:38:DA:C5:3A:25:24:2C:F5:37:BA:98:72:E4:C2:1C:09
39 | X509v3 Authority Key Identifier:
40 | keyid:43:3A:75:41:E1:AE:46:F0:5F:AC:F4:24:6A:3A:DB:D1:31:7E:27:6B
41 |
42 | X509v3 CRL Distribution Points:
43 | URI:http://www.yourdomain.com/ca/crl.pem
44 |
45 | Signature Algorithm: md5WithRSAEncryption
46 | 09:f8:64:1f:82:a1:bc:57:ce:b6:66:ba:cc:5e:f3:04:3e:d0:
47 | 82:96:20:ae:d0:80:2e:71:49:5c:01:38:46:bf:71:49:24:44:
48 | 3d:88:63:29:d1:12:9b:9f:bb:49:a5:47:0a:a2:10:4d:55:92:
49 | 84:37:7c:ee:96:18:18:6b:3d:6a:2e:e5:65:6e:c8:38:81:11:
50 | d2:aa:c6:c8:17:f5:0b:0e:b3:b4:4e:ae:6c:50:13:2e:e6:d2:
51 | d9:50:f2:3b:26:1b:a6:94:26:5a:a6:06:2a:a7:65:0a:7d:15:
52 | 5f:e5:4e:d5:f0:7d:1a:e7:07:0b:b0:c8:2c:63:b5:47:d8:cb:
53 | 61:38
54 | -----BEGIN CERTIFICATE-----
55 | MIIDKTCCApKgAwIBAgIDEAACMA0GCSqGSIb3DQEBBAUAMF8xCzAJBgNVBAYTAlVL
56 | MRcwFQYDVQQKEw5JbnRlZ3JhbGlzdEx0ZDEUMBIGA1UEAxMLSW50ZWdyYWxpc3Qx
57 | ITAfBgkqhkiG9w0BCQEWEmNhQGludGVncmFsaXN0LmNvbTAeFw0xNTEwMDMxNDIz
58 | MDdaFw0xNjEwMDIxNDIzMDdaMEgxCzAJBgNVBAYTAlVLMRIwEAYDVQQDEwlUaGVD
59 | bGllbnQxJTAjBgkqhkiG9w0BCQEWFmNsaWVudEBpbnRlZ3JhbGlzdC5jb20wggEi
60 | MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvD/xFDKgV1UnCN49P12SX2zA2
61 | qazvxqQG/hGrMrUNFeBkuWm4DryFcwW6wHtY/uFl87Wq/WMXxJxifSc6nOhFReCn
62 | Nu7Ef9o0eBXWclh3YQfRxJFquLDnU75Y38pZ9OBwOtT61+zRUYKxpOyorZtKi0DG
63 | YcPuu25hUvgPoj8G0UxVxnDKOf90elIQ2pKZg2qTMhPuY7ejUxLqYHwHD8ughDzm
64 | m/aLWhf3VmDGywys/isN9vr41BTMZqeZ/XW3IYs8pKWwBhxu+X0iCGaEZ/iKROhC
65 | i9r0ejHsRA8EPcUw9PA/8RcWs/hcUwONhPstuy/2lQfEd77KAPpZ2YyOfK2JAgMB
66 | AAGjgYUwgYIwCQYDVR0TBAIwADAdBgNVHQ4EFgQUbfZxVDjaxTolJCz1N7qYcuTC
67 | HAkwHwYDVR0jBBgwFoAUQzp1QeGuRvBfrPQkajrb0TF+J2swNQYDVR0fBC4wLDAq
68 | oCigJoYkaHR0cDovL3d3dy55b3VyZG9tYWluLmNvbS9jYS9jcmwucGVtMA0GCSqG
69 | SIb3DQEBBAUAA4GBAAn4ZB+CobxXzrZmusxe8wQ+0IKWIK7QgC5xSVwBOEa/cUkk
70 | RD2IYynREpufu0mlRwqiEE1VkoQ3fO6WGBhrPWou5WVuyDiBEdKqxsgX9QsOs7RO
71 | rmxQEy7m0tlQ8jsmG6aUJlqmBiqnZQp9FV/lTtXwfRrnBwuwyCxjtUfYy2E4
72 | -----END CERTIFICATE-----
73 |
--------------------------------------------------------------------------------
/Nginx-ClientCertAccess/docker-nginx/CertificateManagement/server.crt:
--------------------------------------------------------------------------------
1 | Certificate:
2 | Data:
3 | Version: 3 (0x2)
4 | Serial Number: 1048577 (0x100001)
5 | Signature Algorithm: md5WithRSAEncryption
6 | Issuer: C=UK, O=IntegralistLtd, CN=Integralist/emailAddress=ca@integralist.com
7 | Validity
8 | Not Before: Oct 3 14:14:23 2015 GMT
9 | Not After : Oct 2 14:14:23 2016 GMT
10 | Subject: C=UK, CN=TheServer/emailAddress=server@integralist.com
11 | Subject Public Key Info:
12 | Public Key Algorithm: rsaEncryption
13 | RSA Public Key: (2048 bit)
14 | Modulus (2048 bit):
15 | 00:b7:95:d4:c6:2e:d1:19:e5:8e:d9:fc:fe:95:66:
16 | 41:3a:72:f0:ed:56:57:09:72:53:f8:14:27:31:30:
17 | bc:c5:4c:55:00:34:3c:b4:f9:19:ea:81:fe:99:9f:
18 | 15:e0:6b:f3:fb:a2:dd:d4:f8:e5:32:95:dd:85:5a:
19 | 54:84:e8:16:fb:d2:00:f9:f8:4e:d9:ee:a6:a3:e8:
20 | a0:d7:94:1f:0b:76:57:5b:05:f7:b7:e7:b7:e9:d6:
21 | 26:cb:45:3e:2f:ac:85:36:cb:22:fd:0e:84:ce:c1:
22 | 0a:30:cb:57:49:07:a5:6a:79:41:22:41:b2:36:51:
23 | 6f:7f:35:d3:c8:43:50:e4:7c:86:7b:6d:a4:6d:c8:
24 | b0:a1:65:39:31:a2:10:47:93:5a:de:a3:1f:4f:49:
25 | 40:e7:f3:e1:a2:28:54:a5:35:d8:fa:65:40:11:07:
26 | 8c:b9:45:95:e3:41:a3:41:13:fb:11:be:66:7b:dc:
27 | 29:cc:7a:d1:af:e3:52:9f:3a:f5:60:d3:f6:d0:72:
28 | 00:80:92:67:3f:30:18:1a:7d:11:ba:bc:8c:f6:87:
29 | 70:ce:3d:cb:b3:93:1e:8e:89:7a:41:ee:9f:0e:f7:
30 | ff:0a:59:77:9e:0c:b5:a4:20:32:fc:85:14:af:4a:
31 | aa:ae:ce:04:4a:4d:e2:79:63:87:7a:f8:b0:43:6a:
32 | 90:c5
33 | Exponent: 65537 (0x10001)
34 | X509v3 extensions:
35 | X509v3 Basic Constraints:
36 | CA:FALSE
37 | X509v3 Subject Key Identifier:
38 | A9:B6:0F:76:AE:E5:DF:93:4F:66:FF:09:23:43:D3:BB:BD:90:C8:D3
39 | X509v3 Authority Key Identifier:
40 | keyid:43:3A:75:41:E1:AE:46:F0:5F:AC:F4:24:6A:3A:DB:D1:31:7E:27:6B
41 |
42 | X509v3 CRL Distribution Points:
43 | URI:http://www.yourdomain.com/ca/crl.pem
44 |
45 | Signature Algorithm: md5WithRSAEncryption
46 | 6c:82:da:eb:74:83:ad:e0:6f:44:73:68:7e:88:7e:dc:8b:7b:
47 | 4b:af:ae:e7:b5:21:f1:31:30:e7:ca:b4:aa:58:83:76:01:0c:
48 | c5:3f:aa:34:3b:eb:d3:62:c0:b9:db:95:c1:4a:cc:a0:13:c4:
49 | a4:be:73:f7:a5:85:29:dd:18:3f:b3:aa:bf:8e:26:f6:3a:cb:
50 | 7b:f2:eb:2a:73:ba:1e:04:be:da:ff:e9:cb:00:a7:2c:08:94:
51 | 31:1d:96:62:5f:de:99:30:23:cc:3a:15:8d:8a:65:4c:77:6a:
52 | b4:f6:9b:a5:12:50:62:45:5e:a4:d0:70:e0:a2:fa:f6:45:05:
53 | b3:87
54 | -----BEGIN CERTIFICATE-----
55 | MIIDKTCCApKgAwIBAgIDEAABMA0GCSqGSIb3DQEBBAUAMF8xCzAJBgNVBAYTAlVL
56 | MRcwFQYDVQQKEw5JbnRlZ3JhbGlzdEx0ZDEUMBIGA1UEAxMLSW50ZWdyYWxpc3Qx
57 | ITAfBgkqhkiG9w0BCQEWEmNhQGludGVncmFsaXN0LmNvbTAeFw0xNTEwMDMxNDE0
58 | MjNaFw0xNjEwMDIxNDE0MjNaMEgxCzAJBgNVBAYTAlVLMRIwEAYDVQQDEwlUaGVT
59 | ZXJ2ZXIxJTAjBgkqhkiG9w0BCQEWFnNlcnZlckBpbnRlZ3JhbGlzdC5jb20wggEi
60 | MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3ldTGLtEZ5Y7Z/P6VZkE6cvDt
61 | VlcJclP4FCcxMLzFTFUANDy0+Rnqgf6ZnxXga/P7ot3U+OUyld2FWlSE6Bb70gD5
62 | +E7Z7qaj6KDXlB8LdldbBfe357fp1ibLRT4vrIU2yyL9DoTOwQowy1dJB6VqeUEi
63 | QbI2UW9/NdPIQ1DkfIZ7baRtyLChZTkxohBHk1reox9PSUDn8+GiKFSlNdj6ZUAR
64 | B4y5RZXjQaNBE/sRvmZ73CnMetGv41KfOvVg0/bQcgCAkmc/MBgafRG6vIz2h3DO
65 | Pcuzkx6OiXpB7p8O9/8KWXeeDLWkIDL8hRSvSqquzgRKTeJ5Y4d6+LBDapDFAgMB
66 | AAGjgYUwgYIwCQYDVR0TBAIwADAdBgNVHQ4EFgQUqbYPdq7l35NPZv8JI0PTu72Q
67 | yNMwHwYDVR0jBBgwFoAUQzp1QeGuRvBfrPQkajrb0TF+J2swNQYDVR0fBC4wLDAq
68 | oCigJoYkaHR0cDovL3d3dy55b3VyZG9tYWluLmNvbS9jYS9jcmwucGVtMA0GCSqG
69 | SIb3DQEBBAUAA4GBAGyC2ut0g63gb0RzaH6IftyLe0uvrue1IfExMOfKtKpYg3YB
70 | DMU/qjQ769NiwLnblcFKzKATxKS+c/elhSndGD+zqr+OJvY6y3vy6ypzuh4Evtr/
71 | 6csApywIlDEdlmJf3pkwI8w6FY2KZUx3arT2m6USUGJFXqTQcOCi+vZFBbOH
72 | -----END CERTIFICATE-----
73 |
--------------------------------------------------------------------------------
/Nginx-ClientCertAccess/docker-nginx/CertificateManagement/certs/100001.pem:
--------------------------------------------------------------------------------
1 | Certificate:
2 | Data:
3 | Version: 3 (0x2)
4 | Serial Number: 1048577 (0x100001)
5 | Signature Algorithm: md5WithRSAEncryption
6 | Issuer: C=UK, O=IntegralistLtd, CN=Integralist/emailAddress=ca@integralist.com
7 | Validity
8 | Not Before: Oct 3 14:14:23 2015 GMT
9 | Not After : Oct 2 14:14:23 2016 GMT
10 | Subject: C=UK, CN=TheServer/emailAddress=server@integralist.com
11 | Subject Public Key Info:
12 | Public Key Algorithm: rsaEncryption
13 | RSA Public Key: (2048 bit)
14 | Modulus (2048 bit):
15 | 00:b7:95:d4:c6:2e:d1:19:e5:8e:d9:fc:fe:95:66:
16 | 41:3a:72:f0:ed:56:57:09:72:53:f8:14:27:31:30:
17 | bc:c5:4c:55:00:34:3c:b4:f9:19:ea:81:fe:99:9f:
18 | 15:e0:6b:f3:fb:a2:dd:d4:f8:e5:32:95:dd:85:5a:
19 | 54:84:e8:16:fb:d2:00:f9:f8:4e:d9:ee:a6:a3:e8:
20 | a0:d7:94:1f:0b:76:57:5b:05:f7:b7:e7:b7:e9:d6:
21 | 26:cb:45:3e:2f:ac:85:36:cb:22:fd:0e:84:ce:c1:
22 | 0a:30:cb:57:49:07:a5:6a:79:41:22:41:b2:36:51:
23 | 6f:7f:35:d3:c8:43:50:e4:7c:86:7b:6d:a4:6d:c8:
24 | b0:a1:65:39:31:a2:10:47:93:5a:de:a3:1f:4f:49:
25 | 40:e7:f3:e1:a2:28:54:a5:35:d8:fa:65:40:11:07:
26 | 8c:b9:45:95:e3:41:a3:41:13:fb:11:be:66:7b:dc:
27 | 29:cc:7a:d1:af:e3:52:9f:3a:f5:60:d3:f6:d0:72:
28 | 00:80:92:67:3f:30:18:1a:7d:11:ba:bc:8c:f6:87:
29 | 70:ce:3d:cb:b3:93:1e:8e:89:7a:41:ee:9f:0e:f7:
30 | ff:0a:59:77:9e:0c:b5:a4:20:32:fc:85:14:af:4a:
31 | aa:ae:ce:04:4a:4d:e2:79:63:87:7a:f8:b0:43:6a:
32 | 90:c5
33 | Exponent: 65537 (0x10001)
34 | X509v3 extensions:
35 | X509v3 Basic Constraints:
36 | CA:FALSE
37 | X509v3 Subject Key Identifier:
38 | A9:B6:0F:76:AE:E5:DF:93:4F:66:FF:09:23:43:D3:BB:BD:90:C8:D3
39 | X509v3 Authority Key Identifier:
40 | keyid:43:3A:75:41:E1:AE:46:F0:5F:AC:F4:24:6A:3A:DB:D1:31:7E:27:6B
41 |
42 | X509v3 CRL Distribution Points:
43 | URI:http://www.yourdomain.com/ca/crl.pem
44 |
45 | Signature Algorithm: md5WithRSAEncryption
46 | 6c:82:da:eb:74:83:ad:e0:6f:44:73:68:7e:88:7e:dc:8b:7b:
47 | 4b:af:ae:e7:b5:21:f1:31:30:e7:ca:b4:aa:58:83:76:01:0c:
48 | c5:3f:aa:34:3b:eb:d3:62:c0:b9:db:95:c1:4a:cc:a0:13:c4:
49 | a4:be:73:f7:a5:85:29:dd:18:3f:b3:aa:bf:8e:26:f6:3a:cb:
50 | 7b:f2:eb:2a:73:ba:1e:04:be:da:ff:e9:cb:00:a7:2c:08:94:
51 | 31:1d:96:62:5f:de:99:30:23:cc:3a:15:8d:8a:65:4c:77:6a:
52 | b4:f6:9b:a5:12:50:62:45:5e:a4:d0:70:e0:a2:fa:f6:45:05:
53 | b3:87
54 | -----BEGIN CERTIFICATE-----
55 | MIIDKTCCApKgAwIBAgIDEAABMA0GCSqGSIb3DQEBBAUAMF8xCzAJBgNVBAYTAlVL
56 | MRcwFQYDVQQKEw5JbnRlZ3JhbGlzdEx0ZDEUMBIGA1UEAxMLSW50ZWdyYWxpc3Qx
57 | ITAfBgkqhkiG9w0BCQEWEmNhQGludGVncmFsaXN0LmNvbTAeFw0xNTEwMDMxNDE0
58 | MjNaFw0xNjEwMDIxNDE0MjNaMEgxCzAJBgNVBAYTAlVLMRIwEAYDVQQDEwlUaGVT
59 | ZXJ2ZXIxJTAjBgkqhkiG9w0BCQEWFnNlcnZlckBpbnRlZ3JhbGlzdC5jb20wggEi
60 | MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3ldTGLtEZ5Y7Z/P6VZkE6cvDt
61 | VlcJclP4FCcxMLzFTFUANDy0+Rnqgf6ZnxXga/P7ot3U+OUyld2FWlSE6Bb70gD5
62 | +E7Z7qaj6KDXlB8LdldbBfe357fp1ibLRT4vrIU2yyL9DoTOwQowy1dJB6VqeUEi
63 | QbI2UW9/NdPIQ1DkfIZ7baRtyLChZTkxohBHk1reox9PSUDn8+GiKFSlNdj6ZUAR
64 | B4y5RZXjQaNBE/sRvmZ73CnMetGv41KfOvVg0/bQcgCAkmc/MBgafRG6vIz2h3DO
65 | Pcuzkx6OiXpB7p8O9/8KWXeeDLWkIDL8hRSvSqquzgRKTeJ5Y4d6+LBDapDFAgMB
66 | AAGjgYUwgYIwCQYDVR0TBAIwADAdBgNVHQ4EFgQUqbYPdq7l35NPZv8JI0PTu72Q
67 | yNMwHwYDVR0jBBgwFoAUQzp1QeGuRvBfrPQkajrb0TF+J2swNQYDVR0fBC4wLDAq
68 | oCigJoYkaHR0cDovL3d3dy55b3VyZG9tYWluLmNvbS9jYS9jcmwucGVtMA0GCSqG
69 | SIb3DQEBBAUAA4GBAGyC2ut0g63gb0RzaH6IftyLe0uvrue1IfExMOfKtKpYg3YB
70 | DMU/qjQ769NiwLnblcFKzKATxKS+c/elhSndGD+zqr+OJvY6y3vy6ypzuh4Evtr/
71 | 6csApywIlDEdlmJf3pkwI8w6FY2KZUx3arT2m6USUGJFXqTQcOCi+vZFBbOH
72 | -----END CERTIFICATE-----
73 |
--------------------------------------------------------------------------------
/Nginx-ClientCertAccess/docker-nginx/CertificateManagement/certs/100002.pem:
--------------------------------------------------------------------------------
1 | Certificate:
2 | Data:
3 | Version: 3 (0x2)
4 | Serial Number: 1048578 (0x100002)
5 | Signature Algorithm: md5WithRSAEncryption
6 | Issuer: C=UK, O=IntegralistLtd, CN=Integralist/emailAddress=ca@integralist.com
7 | Validity
8 | Not Before: Oct 3 14:23:07 2015 GMT
9 | Not After : Oct 2 14:23:07 2016 GMT
10 | Subject: C=UK, CN=TheClient/emailAddress=client@integralist.com
11 | Subject Public Key Info:
12 | Public Key Algorithm: rsaEncryption
13 | RSA Public Key: (2048 bit)
14 | Modulus (2048 bit):
15 | 00:af:0f:fc:45:0c:a8:15:d5:49:c2:37:8f:4f:d7:
16 | 64:97:db:30:36:a9:ac:ef:c6:a4:06:fe:11:ab:32:
17 | b5:0d:15:e0:64:b9:69:b8:0e:bc:85:73:05:ba:c0:
18 | 7b:58:fe:e1:65:f3:b5:aa:fd:63:17:c4:9c:62:7d:
19 | 27:3a:9c:e8:45:45:e0:a7:36:ee:c4:7f:da:34:78:
20 | 15:d6:72:58:77:61:07:d1:c4:91:6a:b8:b0:e7:53:
21 | be:58:df:ca:59:f4:e0:70:3a:d4:fa:d7:ec:d1:51:
22 | 82:b1:a4:ec:a8:ad:9b:4a:8b:40:c6:61:c3:ee:bb:
23 | 6e:61:52:f8:0f:a2:3f:06:d1:4c:55:c6:70:ca:39:
24 | ff:74:7a:52:10:da:92:99:83:6a:93:32:13:ee:63:
25 | b7:a3:53:12:ea:60:7c:07:0f:cb:a0:84:3c:e6:9b:
26 | f6:8b:5a:17:f7:56:60:c6:cb:0c:ac:fe:2b:0d:f6:
27 | fa:f8:d4:14:cc:66:a7:99:fd:75:b7:21:8b:3c:a4:
28 | a5:b0:06:1c:6e:f9:7d:22:08:66:84:67:f8:8a:44:
29 | e8:42:8b:da:f4:7a:31:ec:44:0f:04:3d:c5:30:f4:
30 | f0:3f:f1:17:16:b3:f8:5c:53:03:8d:84:fb:2d:bb:
31 | 2f:f6:95:07:c4:77:be:ca:00:fa:59:d9:8c:8e:7c:
32 | ad:89
33 | Exponent: 65537 (0x10001)
34 | X509v3 extensions:
35 | X509v3 Basic Constraints:
36 | CA:FALSE
37 | X509v3 Subject Key Identifier:
38 | 6D:F6:71:54:38:DA:C5:3A:25:24:2C:F5:37:BA:98:72:E4:C2:1C:09
39 | X509v3 Authority Key Identifier:
40 | keyid:43:3A:75:41:E1:AE:46:F0:5F:AC:F4:24:6A:3A:DB:D1:31:7E:27:6B
41 |
42 | X509v3 CRL Distribution Points:
43 | URI:http://www.yourdomain.com/ca/crl.pem
44 |
45 | Signature Algorithm: md5WithRSAEncryption
46 | 09:f8:64:1f:82:a1:bc:57:ce:b6:66:ba:cc:5e:f3:04:3e:d0:
47 | 82:96:20:ae:d0:80:2e:71:49:5c:01:38:46:bf:71:49:24:44:
48 | 3d:88:63:29:d1:12:9b:9f:bb:49:a5:47:0a:a2:10:4d:55:92:
49 | 84:37:7c:ee:96:18:18:6b:3d:6a:2e:e5:65:6e:c8:38:81:11:
50 | d2:aa:c6:c8:17:f5:0b:0e:b3:b4:4e:ae:6c:50:13:2e:e6:d2:
51 | d9:50:f2:3b:26:1b:a6:94:26:5a:a6:06:2a:a7:65:0a:7d:15:
52 | 5f:e5:4e:d5:f0:7d:1a:e7:07:0b:b0:c8:2c:63:b5:47:d8:cb:
53 | 61:38
54 | -----BEGIN CERTIFICATE-----
55 | MIIDKTCCApKgAwIBAgIDEAACMA0GCSqGSIb3DQEBBAUAMF8xCzAJBgNVBAYTAlVL
56 | MRcwFQYDVQQKEw5JbnRlZ3JhbGlzdEx0ZDEUMBIGA1UEAxMLSW50ZWdyYWxpc3Qx
57 | ITAfBgkqhkiG9w0BCQEWEmNhQGludGVncmFsaXN0LmNvbTAeFw0xNTEwMDMxNDIz
58 | MDdaFw0xNjEwMDIxNDIzMDdaMEgxCzAJBgNVBAYTAlVLMRIwEAYDVQQDEwlUaGVD
59 | bGllbnQxJTAjBgkqhkiG9w0BCQEWFmNsaWVudEBpbnRlZ3JhbGlzdC5jb20wggEi
60 | MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvD/xFDKgV1UnCN49P12SX2zA2
61 | qazvxqQG/hGrMrUNFeBkuWm4DryFcwW6wHtY/uFl87Wq/WMXxJxifSc6nOhFReCn
62 | Nu7Ef9o0eBXWclh3YQfRxJFquLDnU75Y38pZ9OBwOtT61+zRUYKxpOyorZtKi0DG
63 | YcPuu25hUvgPoj8G0UxVxnDKOf90elIQ2pKZg2qTMhPuY7ejUxLqYHwHD8ughDzm
64 | m/aLWhf3VmDGywys/isN9vr41BTMZqeZ/XW3IYs8pKWwBhxu+X0iCGaEZ/iKROhC
65 | i9r0ejHsRA8EPcUw9PA/8RcWs/hcUwONhPstuy/2lQfEd77KAPpZ2YyOfK2JAgMB
66 | AAGjgYUwgYIwCQYDVR0TBAIwADAdBgNVHQ4EFgQUbfZxVDjaxTolJCz1N7qYcuTC
67 | HAkwHwYDVR0jBBgwFoAUQzp1QeGuRvBfrPQkajrb0TF+J2swNQYDVR0fBC4wLDAq
68 | oCigJoYkaHR0cDovL3d3dy55b3VyZG9tYWluLmNvbS9jYS9jcmwucGVtMA0GCSqG
69 | SIb3DQEBBAUAA4GBAAn4ZB+CobxXzrZmusxe8wQ+0IKWIK7QgC5xSVwBOEa/cUkk
70 | RD2IYynREpufu0mlRwqiEE1VkoQ3fO6WGBhrPWou5WVuyDiBEdKqxsgX9QsOs7RO
71 | rmxQEy7m0tlQ8jsmG6aUJlqmBiqnZQp9FV/lTtXwfRrnBwuwyCxjtUfYy2E4
72 | -----END CERTIFICATE-----
73 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Docker
2 |
3 | - [Introduction](#introduction)
4 | - [Exposing the Docker daemon](#exposing-the-docker-daemon)
5 | - [Help with Docker commands](#help-with-docker-commands)
6 | - [CMD vs ENTRYPOINT](#cmd-vs-entrypoint)
7 | - [Alternative CoreOS/Vagrantfile](#alternative-coreosvagrantfile)
8 | - [Example Docker Containers](#example-docker-containers)
9 | - [VMWare Provider](#vmware-provider)
10 |
11 | ## Introduction
12 |
13 | Getting Docker set-up on a non-Linux environment (such as a Mac) can be done in a few ways; below are a few popular options:
14 |
15 | 1. Use Docker's "Boot2Docker" VM (uses VirtualBox to set-up the VM)
16 | 2. Use a CoreOS VM via Vagrant (with some modifications, such as exposing a private ip)
17 |
18 | We're going to use the latter option. The host will attempt to connect directly to the VM's private ip (although, as we'll see in the next section, the Docker daemon needs to be exposed too for that to happen).
19 |
20 | ## Exposing the Docker daemon
21 |
22 | > UPDATE: the Vagrantfile executes a `provision.sh` which automates all of the below steps for you
23 |
24 | If you just do a `vagrant up` and try to run a Docker command (such as `docker ps`) then you'll get an error, like: `Cannot connect to the Docker daemon. Is 'docker -d' running on this host?`.
25 |
26 | For the host to be able to use the Docker CLI, the Docker daemon on CoreOS needs to be exposed via a TCP port (as we're setting an ip address to access the CLI like so: `export DOCKER_HOST=tcp://172.17.8.100:2375`).
27 |
28 | The following are the steps required to do this:
29 |
30 | Add `export DOCKER_HOST=tcp://172.17.8.100:2375` to your `.zshrc` (or `.bashrc`) configuration file (as per the private ip defined inside the CoreOS Vagrantfile).
31 |
32 | Read: http://coreos.com/docs/launching-containers/building/customizing-docker/ but effectively the steps are:
33 |
34 | - `vagrant up`
35 | - `vagrant ssh`
36 | - `sudo touch /etc/systemd/system/docker-tcp.socket`
37 | - Add following content into above socket file:
38 |
39 | ```
40 | [Unit]
41 | Description=Docker Socket for the API
42 |
43 | [Socket]
44 | ListenStream=2375
45 | Service=docker.service
46 | BindIPv6Only=both
47 |
48 | [Install]
49 | WantedBy=sockets.target
50 | ```
51 |
52 | - `sudo systemctl enable docker-tcp.socket`
53 | - `sudo systemctl stop docker`
54 | - `sudo systemctl start docker-tcp.socket`
55 | - `sudo systemctl start docker`
56 | - `exit`
57 | - `docker ps`
58 |
59 | > Note: if you're using Ubuntu and not CoreOS then see https://github.com/Integralist/Linux-and-Docker-Development-Environment/blob/master/provision.sh#L49-L55 for example of exposing the Docker daemon ip
60 |
61 | ## Help with Docker commands
62 |
63 | - `docker help` lists all commands
64 | - `docker help [command]` lists all options for specified command
65 |
66 | ## CMD vs ENTRYPOINT
67 |
68 | http://stackoverflow.com/questions/21553353/what-is-the-difference-between-cmd-and-entrypoint-in-a-dockerfile
69 |
70 | Effectively, Docker has a default `ENTRYPOINT` which is `/bin/sh -c`.
71 |
72 | A typical Docker command will look like (where, for example `{COMMAND}` is `bash`):
73 |
74 | `docker run -i -t {IMAGE_NAME} {COMMAND}`
75 |
76 | e.g. `docker run -i -t MY_IMAGE bash`
77 |
78 | In the above example you're passing the command `bash` to the default `ENTRYPOINT` (`/bin/sh -c`) which would drop us into a Bash shell ready to execute some more commands within the Docker container.
79 |
80 | In the `Dockerfile` you can change the `ENTRYPOINT` to be something else, so you could change it to be the `cat` command instead of `sh` (e.g. `ENTRYPOINT ["/bin/cat"]`).
81 |
82 | If you did that for your Docker container then you could pass in a "command" to the container like so:
83 |
84 | `docker run -i -t MY_IMAGE /etc/passwd` which would pass the command `/etc/passwd` to the `cat` command
85 |
86 | > You can also override the ENTRYPOINT via the command-line using the `--entrypoint` flag:
87 | `docker run --rm -it --entrypoint=/bin/bash my_image`
88 |
89 | ## Alternative CoreOS/Vagrantfile
90 |
91 | The following is a simplified `Vagrantfile`. It's similiar but minus the comments and also doesn't work-around everything that the `Vagrantfile` within this repo caters for:
92 |
93 | ```rb
94 | Vagrant.configure('2') do |config|
95 | config.vm.box = "coreos"
96 | config.vm.box_url = "http://storage.core-os.net/coreos/amd64-generic/dev-channel/coreos_production_vagrant.box"
97 | config.vm.network "private_network", ip: "172.17.8.100"
98 | config.vm.synced_folder ".", "/home/core/share",
99 | id: "core",
100 | :nfs => true,
101 | :mount_options => ['nolock,vers=3,udp']
102 | end
103 | ```
104 |
105 | ## Example Docker Containers
106 |
107 | This repository has basic Dockerfiles for both NodeJS and Ruby Sinatra applications. To build the containers please read the instructions for each container.
108 |
109 | ## VMWare Provider
110 |
111 | If you're using VMWare as your provider (e.g. `vagrant up --provider=vmware_fusion`) then you might run into an issue mounting your folders into the CoreOS VM.
112 |
113 | The error might look something like the following...
114 |
115 | ```
116 | Bringing machine 'default' up with 'vmware_fusion' provider...
117 | ==> default: Cloning VMware VM: 'coreos-alpha'. This can take some time...
118 | ==> default: Checking if box 'coreos-alpha' is up to date...
119 | ==> default: Verifying vmnet devices are healthy...
120 | ==> default: Preparing network adapters...
121 | ==> default: Fixed port collision for 22 => 2222. Now on port 2200.
122 | ==> default: Starting the VMware VM...
123 | ==> default: Waiting for machine to boot. This may take a few minutes...
124 | default: SSH address: 172.16.82.134:22
125 | default: SSH username: core
126 | default: SSH auth method: private key
127 | ==> default: Machine booted and ready!
128 | ==> default: Forwarding ports...
129 | default: -- 22 => 2200
130 | ==> default: Setting hostname...
131 | ==> default: Configuring network adapters within the VM...
132 | ==> default: Exporting NFS shared folders...
133 | ==> default: Preparing to edit /etc/exports. Administrator privileges will be required...
134 | ==> default: Mounting NFS shared folders...
135 | The following SSH command responded with a non-zero exit status.
136 | Vagrant assumes that this means the command failed!
137 |
138 | mount -o 'nolock,vers=3,udp' 172.17.8.1:'/Users/foobar/path/to/current/directory' /home/core/share
139 |
140 | Stdout from the command:
141 |
142 |
143 |
144 | Stderr from the command:
145 |
146 | mount.nfs: access denied by server while mounting 172.17.8.1:/Users/foobar/path/to/current/directory
147 | ```
148 |
149 | It turns out this might be an issue with CoreOS not assigning the private "host-only" network ip address properly: https://github.com/coreos/coreos-vagrant/issues/159#issuecomment-54267821
150 |
151 | If you were to `vagrant ssh` onto the box and run `ifconfig` you would notice the ip address assigned is not the one requested in the `Vagrantfile`. But if you then checked the CoreOS network settings (run `cat /etc/systemd/network/50-vagrant1.network`) then you'll see that the ip address listed matches what is defined inside our `Vagrantfile`.
152 |
153 | ### Work around
154 |
155 | To work around this issue (temporarily, until an official fix is found) I would suggest running through the following steps:
156 |
157 | #### Host machine (i.e. your Mac)
158 |
159 | - Run `sudo vim /etc/exports/` and edit the relevant command so that the ip address (the one that matches what's defined in the `Vagrantfile`) is removed -> this means the VM makes the mount available to all users
160 | - Run `sudo nfsd restart`
161 |
162 | #### CoreOS VM
163 |
164 | - `sudo mount -o 'nolock,vers=3,udp' 172.17.8.1:'/Users/foo/path/to/directory' /home/core/share` (make sure to change `/Users/foo/path/to/directory` to your directory -> you can get this command out of the failed `vagrant up` output)
165 |
--------------------------------------------------------------------------------