Skip to content

Commit 14a90de

Browse files
committed
add support for SSL
1 parent a0b09c7 commit 14a90de

File tree

9 files changed

+135
-37
lines changed

9 files changed

+135
-37
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
/dev
2+
/*.retry

files/nginx.conf

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@ http {
1818
# this is necessary for us to be able to disable request buffering in all cases
1919
proxy_http_version 1.1;
2020

21-
#SSLCONFIG
22-
2321
# will run before forking out nginx worker processes
2422
init_by_lua_block { require "cjson" }
2523

@@ -29,9 +27,9 @@ http {
2927
}
3028

3129
server {
32-
listen LISTEN default_server;
30+
listen PORT SSL_LISTEN default_server;
3331

34-
#AUTHCONFIG
32+
SSL_INCLUDE
3533

3634
# Cache
3735
add_header X-Cache-Status $upstream_cache_status;
@@ -52,28 +50,21 @@ http {
5250

5351
# disable proxy request buffering
5452
proxy_request_buffering off;
55-
proxy_cache cache;
56-
proxy_cache_key $scheme$uri$args$request_method;
57-
proxy_cache_valid 200 1s;
58-
proxy_cache_use_stale error timeout invalid_header updating
59-
http_500 http_502 http_503 http_504;
60-
proxy_cache_lock on;
6153

6254
add_header 'Docker-Distribution-Api-Version' $docker_distribution_api_version always;
6355
add_header "Access-Control-Allow-Origin" "*";
6456

6557
location / {
6658
set $url UPSTREAM;
6759
proxy_pass $url;
68-
proxy_redirect $url http://$host:PORT;
60+
proxy_redirect $url SCHEME://$host:PORT;
6961

7062
# Add AWS ECR authentication headers
7163
proxy_set_header X-Real-IP $remote_addr;
7264
proxy_set_header X-Forwarded-For $remote_addr;
7365
proxy_set_header X-Forwarded-User "Basic $http_authorization";
7466
proxy_set_header Authorization "Basic $http_authorization";
7567
proxy_set_header X-Forwarded-Proto $scheme;
76-
proxy_set_header Authorization "";
7768

7869
}
7970

@@ -82,15 +73,14 @@ http {
8273
location ~ ^/v2/.*/blobs/[a-z0-9]+:[a-f0-9]+$ {
8374
set $url UPSTREAM;
8475
proxy_pass $url;
85-
proxy_redirect $url http://$host:PORT;
76+
proxy_redirect $url SCHEME://$host:PORT;
8677

8778
# Add AWS ECR authentication headers
8879
proxy_set_header X-Real-IP $remote_addr;
8980
proxy_set_header X-Forwarded-For $remote_addr;
9081
proxy_set_header X-Forwarded-User "Basic $http_authorization";
9182
proxy_set_header Authorization "Basic $http_authorization";
9283
proxy_set_header X-Forwarded-Proto $scheme;
93-
proxy_set_header Authorization "";
9484

9585
# When accessing image blobs using HTTP GET AWS ECR redirects with
9686
# s3 buckets uri to download the image. This needs to handled by
@@ -106,7 +96,7 @@ http {
10696
set $saved_redirect_location '$upstream_http_location';
10797
proxy_pass $saved_redirect_location;
10898
proxy_cache cache;
109-
proxy_cache_key $scheme$uri$args$request_method;
99+
proxy_cache_key CACHE_KEY;
110100
proxy_cache_valid 200 1y;
111101
proxy_cache_use_stale error timeout invalid_header updating
112102
http_500 http_502 http_503 http_504;
@@ -115,7 +105,6 @@ http {
115105

116106
location ~ ^/v2/.*/.*/tags/list+$ {
117107
# get paginated list of tags
118-
proxy_set_header Authorization "";
119108
content_by_lua_block {
120109
local location, tags, cjson = ngx.var.uri, {}, require "cjson"
121110
while true do
@@ -147,7 +136,6 @@ http {
147136
internal;
148137
set_unescape_uri $req_uri $arg_req_uri;
149138
proxy_pass UPSTREAM$req_uri;
150-
proxy_set_header Authorization "";
151139

152140
# Add AWS ECR authentication headers
153141
proxy_set_header X-Real-IP $remote_addr;

files/ssl.conf

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,3 @@ ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECD
66
ssl_prefer_server_ciphers on;
77

88
add_header Strict-Transport-Security max-age=31536000;
9-

files/startup.sh

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -34,31 +34,30 @@ echo Using resolver $RESOLVER and $UPSTREAM [$(dig +short ${UPSTREAM_WITHOUT_PO
3434
CACHE_MAX_SIZE=${CACHE_MAX_SIZE:-75g}
3535
echo Using cache max size $CACHE_MAX_SIZE
3636

37-
CONFIG=/usr/local/openresty/nginx/conf/nginx.conf
37+
CACHE_KEY=${CACHE_KEY:='$scheme$uri$request_method'}
38+
echo Using cache key $CACHE_KEY
3839

39-
ENABLESSL=''
40-
SSLINCLUDE=''
41-
SSLCONFIG=/usr/local/openresty/nginx/conf/ssl.conf
42-
if [ ! -z "$REGISTRY_HTTP_TLS_CERTIFICATE" ] && [ ! -z "$REGISTRY_HTTP_TLS_KEY" ]; then
43-
sed -i -e s!REGISTRY_HTTP_TLS_CERTIFICATE!"$REGISTRY_HTTP_TLS_CERTIFICATE"!g $SSLCONFIG
44-
sed -i -e s!REGISTRY_HTTP_TLS_KEY!"$REGISTRY_HTTP_TLS_KEY"!g $SSLCONFIG
45-
ENABLESSL='ssl'
46-
SSLINCLUDE="include $SSLCONFIG;"
47-
fi
40+
SCHEME=http
41+
CONFIG=/usr/local/openresty/nginx/conf/nginx.conf
42+
SSL_CONFIG=/usr/local/openresty/nginx/conf/ssl.conf
4843

49-
AUTHCONFIG=''
50-
if [ ! -z "$REGISTRY_AUTH_HTPASSWD_PATH" ] && [ ! -z "$REGISTRY_AUTH_HTPASSWD_REALM" ]; then
51-
AUTHCONFIG="auth_basic ${REGISTRY_AUTH_HTPASSWD_REALM};\n auth_basic_user_file ${REGISTRY_AUTH_HTPASSWD_PATH};"
44+
if [ "$ENABLE_SSL" ]; then
45+
sed -i -e s!REGISTRY_HTTP_TLS_CERTIFICATE!"$REGISTRY_HTTP_TLS_CERTIFICATE"!g $SSL_CONFIG
46+
sed -i -e s!REGISTRY_HTTP_TLS_KEY!"$REGISTRY_HTTP_TLS_KEY"!g $SSL_CONFIG
47+
SSL_LISTEN="ssl"
48+
SSL_INCLUDE="include $SSL_CONFIG;"
49+
SCHEME="https"
5250
fi
5351

5452
# Update nginx config
5553
sed -i -e s!UPSTREAM!"$UPSTREAM"!g $CONFIG
56-
sed -i -e s!LISTEN!"$PORT $ENABLESSL"!g $CONFIG
5754
sed -i -e s!PORT!"$PORT"!g $CONFIG
5855
sed -i -e s!RESOLVER!"$RESOLVER"!g $CONFIG
5956
sed -i -e s!CACHE_MAX_SIZE!"$CACHE_MAX_SIZE"!g $CONFIG
60-
sed -i -e s!#SSLCONFIG!"$SSLINCLUDE"!g $CONFIG
61-
sed -i -e s!#AUTHCONFIG!"$AUTHCONFIG"!g $CONFIG
57+
sed -i -e s!CACHE_KEY!"$CACHE_KEY"!g $CONFIG
58+
sed -i -e s!SCHEME!"$SCHEME"!g $CONFIG
59+
sed -i -e s!SSL_INCLUDE!"$SSL_INCLUDE"!g $CONFIG
60+
sed -i -e s!SSL_LISTEN!"$SSL_LISTEN"!g $CONFIG
6261

6362
# setup ~/.aws directory
6463
AWS_FOLDER='/root/.aws'

hosts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
[docker-registry-proxy]
2-
registry-proxy.example.com
2+
localhost ansible_connection=local

roles/docker-registry-proxy/defaults/main.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,7 @@ docker_proxy_backend_resolver: "8.8.8.8"
88
docker_proxy_ecr_access_id:
99
docker_proxy_ecr_secret_key:
1010
docker_proxy_ecr_region:
11+
12+
docker_proxy_ssl_enabled:
13+
docker_proxy_ssl_host_path: /registry
14+
docker_proxy_ssl_container_path: /opt/nginx
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIFcTCCA1mgAwIBAgIJALWdZASytQRkMA0GCSqGSIb3DQEBCwUAME8xCzAJBgNV
3+
BAYTAkRFMRUwEwYDVQQHDAxEZWZhdWx0IENpdHkxFTATBgNVBAoMDGVTYWlsb3Jz
4+
IExURDESMBAGA1UEAwwJbG9jYWxob3N0MB4XDTE5MDkwMjA4NTYzNloXDTI5MDgz
5+
MDA4NTYzNlowTzELMAkGA1UEBhMCREUxFTATBgNVBAcMDERlZmF1bHQgQ2l0eTEV
6+
MBMGA1UECgwMZVNhaWxvcnMgTFREMRIwEAYDVQQDDAlsb2NhbGhvc3QwggIiMA0G
7+
CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCrznLzCWlKJO4fXD/E8hx4cXUqbd9U
8+
VwpcAzWq3xGjC6gettYSp171elDXj23ddDJ1wwOl2U0bjN/DceRCl4Tnb3O86fzt
9+
Bwj8xA/stYGvZQqOvEhSfFh85qvDf1niu2uW1Zx4kMemUvNdhpXsqa9RPSu0Mb0G
10+
ZeHnCQkuz3KTjUMhQqwomg/6BY4G7tDmCZYsZezGSgAgoa+Q4vffW+H8S9nuKi8o
11+
EXUf9NuJHUTjtdgcVcCihPj54jXAQsqS9JzWSWxDnKxTaOZuRWEkG+vqGoKEL5+q
12+
PeH8x8aAM7wErsdxTqTV4XCJU0nS9om1Z6sz0Lrva/loyKciulTO8jYWqZIuBL8J
13+
GVeizcoYl9KcW8I66XkeuYWlNWCsWhGii7zEWVcXDdSuLCv1wLagRE9MJHoT64nd
14+
KAR2UQml/MSPlz8419K4r87hcVmNU6FFBP2RZO7UGW5eHbbKT+whhDdBTaig2NNL
15+
Ml7pVFq6ciemNr6IVsTuzS0VPJpuOoZa86+6UPqgw49jg4cBlKxgJxanDy2a2Hbm
16+
zx2dPAkbz3kMKDeBmgFzk3xt10czPXvIXUSnJdhi8NdQUCBHdu9yjT3s7Cc12NCQ
17+
3H0NPWUklHlqJrPY9IbGnNrmJblwZ7hyrI3eISV9njQf3etL2QdDXksLJpgeQsv7
18+
vcXEBje+aluNqQIDAQABo1AwTjAdBgNVHQ4EFgQUyBLOw8nyo6W4BJWI9L24TTta
19+
RbcwHwYDVR0jBBgwFoAUyBLOw8nyo6W4BJWI9L24TTtaRbcwDAYDVR0TBAUwAwEB
20+
/zANBgkqhkiG9w0BAQsFAAOCAgEAkYdRTaZuVAcxY1MI7V8PVnvTDxJ1izAWsr2W
21+
aQMSX0UxAZ/Aed+Q056Ya50/x5ffSigHY5Dap4eP36i/4+dhIeoaMpRjlz/sWCb5
22+
fE6judBvrMlMwrnKpi/eN0QC1KiCptPbPVPyonRj1ydrvQTPPDxLSeqgzCn3q5kf
23+
Gb6VlPDhj/CmIoVXkA9gYNlCwSpZ49DJJ2gTmI+MXolXnlZCvXuR+VsgTsjn96vH
24+
j0AczAZ+g7gD8XTl/K9Z/gcs06DcmMonYrgOGuaFDDiEuBwgABo8gajCFg4xwxi2
25+
bw7B+opMrOXH9ZGhaoF2eySDGXXgw7TLRqkGXDghZNzWajnGuN7vSaiQfnr0EmW+
26+
020gJDDUZyc9Ky165SQe3Bfin1cLc2W6mZYmV9lDtUYw80Gth52L9uOiEBIbV6mI
27+
ZBZFyslxQ7IYWOxseoU9xrxzscTtxa+MGs47w6Hzxh38zYPe/I0Yt62yMRtUmJJ7
28+
ebQZti7qLeW+QOZAruUzei7fpOZOrq8vy4GBUm0pkg8eOVdDaCAQAWMwaGaHH9/5
29+
q+AvDLjvR6zvJdV2dxA3XsVmcIA45zOA2mZkRrcTWyf5DZ7bDcQvSnd7R4anv3hG
30+
YJXeKyzcI7SWfMxo0hU6p9fv66xYn6x9d5oA/ZU/5XRn1bFL7kuKj7BmB+LcS0BE
31+
XipqaCA=
32+
-----END CERTIFICATE-----
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
-----BEGIN PRIVATE KEY-----
2+
MIIJQQIBADANBgkqhkiG9w0BAQEFAASCCSswggknAgEAAoICAQCrznLzCWlKJO4f
3+
XD/E8hx4cXUqbd9UVwpcAzWq3xGjC6gettYSp171elDXj23ddDJ1wwOl2U0bjN/D
4+
ceRCl4Tnb3O86fztBwj8xA/stYGvZQqOvEhSfFh85qvDf1niu2uW1Zx4kMemUvNd
5+
hpXsqa9RPSu0Mb0GZeHnCQkuz3KTjUMhQqwomg/6BY4G7tDmCZYsZezGSgAgoa+Q
6+
4vffW+H8S9nuKi8oEXUf9NuJHUTjtdgcVcCihPj54jXAQsqS9JzWSWxDnKxTaOZu
7+
RWEkG+vqGoKEL5+qPeH8x8aAM7wErsdxTqTV4XCJU0nS9om1Z6sz0Lrva/loyKci
8+
ulTO8jYWqZIuBL8JGVeizcoYl9KcW8I66XkeuYWlNWCsWhGii7zEWVcXDdSuLCv1
9+
wLagRE9MJHoT64ndKAR2UQml/MSPlz8419K4r87hcVmNU6FFBP2RZO7UGW5eHbbK
10+
T+whhDdBTaig2NNLMl7pVFq6ciemNr6IVsTuzS0VPJpuOoZa86+6UPqgw49jg4cB
11+
lKxgJxanDy2a2Hbmzx2dPAkbz3kMKDeBmgFzk3xt10czPXvIXUSnJdhi8NdQUCBH
12+
du9yjT3s7Cc12NCQ3H0NPWUklHlqJrPY9IbGnNrmJblwZ7hyrI3eISV9njQf3etL
13+
2QdDXksLJpgeQsv7vcXEBje+aluNqQIDAQABAoICAQCjIxe3expFUyfhE2FiC1vJ
14+
akKNFWNY3IVztYCCTeqbXXg4IfjIIbFjes/Ev+bcv3cipxiRpPM4092t4jmSmfmT
15+
IRtPKQgHsgRwr2NHq1oHR/RscJBj8rq7bvVuX0DksH6K7S70tNU/M8ju59r4rG9S
16+
vrj/E7OfnaKSFNxpXIY5YYt6y6pZq2C8UgX4w1AM/tFgOzBHYQEZ+y2QcFRZ/Q9q
17+
2EOJiPjaHSmQPJsxaV9+sa8RyMNwDr+z136en01nmWpLd9CbqutfEF6uGqcQ+Ipc
18+
8us3xVjg+H3b3363QWipMaUkDD8s8DJB05pn/b3pSRUh0HOQ4IAlZVJ/AVuCXi/I
19+
amEVq5hClLL16OhyM4u/50BxSn673jNCi3uRPxcJlnR0cFy8u6XEs8rbU1ezxlz3
20+
SJBpTfXyvvWhNdvEQzNy+AOf8XQLzKgcnoLYYx9nhFUBv3pSU+7hW11RKmjHSu9v
21+
0NNcUGq+Ig3QTB/4CTM1YJ/usL9kVdJY+tK1wVKHiIm0O58fcyrfN05kUpqJ5NMg
22+
4ByeXkm8JR8A9jiNmJy/bBuFEIXTsxalsQjonGw4WHcRZCke0eqMSOgzp50CNad2
23+
NIRqNWD0EInTatXtjTQ+zbCkDoUdgW4NhCnmf4OxVLEpKIYFw/y1271mVZp9zbYU
24+
aAfaTXi/mZ+hAspQlTOPAQKCAQEA3BhyO90ACUtKbbBPwUVgEHxtsKZ1lyIgyGMQ
25+
D8PDh+ixdvRYD4m4rewTzY346kaEPcWzjKUp2sU0G1/moBQWLBb9gKyBll8LKSNG
26+
yA5MAMENyI9rIFpzOoJkkTrnu8iwIPXjVgAShrRqBa+eKAa5XEOR6x+L5UhIEZIQ
27+
mfCqyPAKKieODiykqqmDURCadRC3LrIbjDSdnX6VEMS7Sun6pNRz7s1u5CYnLQGZ
28+
QhZeRMkcdmYuAThfwWpX/GdtIxqM08jWX9RFKpMiSisKX8YsXv0W0IbesuDj/bkc
29+
4BQou03sEUJxC6P8O+jiKtOkygwTdqmjIpDRf1EHiPGibv+f+QKCAQEAx9VfJ/5e
30+
zmLWwEEqSxpwWpMQdB5ir68VjnnvFNDVms/XVHr/EV7TuI092cXJdntqqynCZGBA
31+
IP1Wv2eSqGibIyOXdbTXv1qWmSxZdeECIj11vtRQ5etK977/F0llNYav6WAn3pDp
32+
0IRzofaD6SEFhTJKoGiv86gFcqm2tO4lrTU1B30KnqKfYER6mUdBwto///Rwrpoy
33+
B5+EWbrjJmKOqKuXP+M/YnlQXeBtyVHlQlaog2sea9OSCJEbTrmkZqJ1ZXmBH8T+
34+
D91QOF+5rxPVKLG5Ybnfen7Fu3dHAotD8WM77iQR+EDmffvrxS+ddZUXzINS9jml
35+
kKkaG9zOvEcnMQKCAQEAyIo1u7nYSJ+jh2I4qT9PEnZtc6GYT0a3XB53CgYzaOhq
36+
mpp0imPQNBiAyrBrdvsdjzNOL/5lroI0wiSVfJIQyceA3/dOc/bRsoAEBFCSi7Vb
37+
m7yhvW7swwkAHRvw/bcUVFP2+etC9h345Ilpr8rApgKjN/sceqNrlybhnYId+sxM
38+
VrCHzP58Y0vk7L4WHkhGwHNkilF+s3wc0pSOmumqiPlTUOk5+wOQen+UZxT+e+pK
39+
1s6vaEk3ZoJA/Sg31t5gJrA+ND6zbuF1QuMIps9oqnwsh3/79jzXP92lI776hf+v
40+
8uH5IsQeFXBScvc4lSh/q4VRsTMGz9zC4tJYUI718QKB/3qNYM4mMf5gn1NIo6dr
41+
j3v8tRqBiAQ2XAIExZr+eAF5dZVZ2RPOFAoalNP5eJQxHDncYlssrCePNqQr4MVn
42+
Yb0rFrgZMDcqVzGZAURJugVFq/BcRUC8DD3j5I1jda5d64Q0dD8KoFpA4KlzhXJz
43+
ze7h6OJ3UXEcmjq32lUbt/+BogP1q42eLh/b31QhXzMgph9SychKyGPkcEaXVrcz
44+
ukm28gs8UqMRwzfPa4ULtI36l14BU6bNGcInO5gMQcav209gNNBG/4i7MXdhPX8h
45+
qphKZmaIl4WIObu+as4kmoZvVVG2zU5yfujEltNXYDm8Ndw2rapTsDYHfvuXbzII
46+
cQKCAQBW3LAfFAkmu1+NJBXYt86rftOF+VSNWkN1/YkPwIMX1y647aVMGMegr7yF
47+
xUh1DSQQAuD2ACzII1ufoUWRrhdCMsgr3o9b0ApCXQwTaaFsZjGIr33bsnqNHW3e
48+
FJEfTrNW5PLTkkEjJQH0N/6W0TRowjpYSpgRz/fpJjdFLmQ1A+RLVoyHCVq/Qhzj
49+
Ywk6hsYjI432aebdFH8pqWl8Hhcq6DW9jAyKkuVnX/p60OZ6tp6cZ75nIj7bdB7W
50+
zcrUs4/igRY8HUwZlQJK5X2D+LWuN1Ag8DBbbjOmqziKDBikV/GmOcuCRgltckrT
51+
UFg2hiaXvnBuMgGHodqIzeQarqKv
52+
-----END PRIVATE KEY-----

roles/docker-registry-proxy/tasks/main.yaml

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,16 @@
22
become: true
33
file: path={{ docker_proxy_cache_path }} state=directory mode=0755 recurse=true
44

5+
- name: Copy the ssl certificates
6+
become: true
7+
copy:
8+
src: "{{ item }}"
9+
dest: "{{ docker_proxy_ssl_host_path }}/{{ item }}"
10+
with_items:
11+
- certificate.pem
12+
- key.pem
13+
when: docker_proxy_ssl_enabled | bool
14+
515
- name: Print current cache directory size information
616
become: true
717
command: du -hs {{ docker_proxy_cache_path }}
@@ -10,6 +20,8 @@
1020
become: true
1121
command: >
1222
docker pull esailors/aws-ecr-http-proxy:{{ docker_proxy_version }}
23+
tags:
24+
- pull-image
1325

1426
- name: Remove previous proxy container
1527
become: true
@@ -29,11 +41,21 @@
2941
--net host
3042
--restart=unless-stopped
3143
32-
-v {{ docker_proxy_cache_path }}:/cache
44+
-v {{ docker_proxy_cache_path }}:/cache
45+
46+
{% if docker_proxy_ssl_enabled | bool %}
47+
-v {{ docker_proxy_ssl_host_path }}/certificate.pem:{{ docker_proxy_ssl_container_path }}/certificate.pem
48+
-v {{ docker_proxy_ssl_host_path }}/key.pem:{{ docker_proxy_ssl_container_path }}/key.pem
49+
50+
-e ENABLE_SSL=true
51+
-e REGISTRY_HTTP_TLS_KEY={{ docker_proxy_ssl_container_path }}/key.pem
52+
-e REGISTRY_HTTP_TLS_CERTIFICATE={{ docker_proxy_ssl_container_path }}/certificate.pem
53+
{% endif %}
54+
3355
-e RESOLVER={{ docker_proxy_backend_resolver }}
3456
-e PORT=5000
3557
-e UPSTREAM={{ docker_proxy_backend_schema }}://{{ docker_proxy_backend }}
36-
-e CACHE_MAX_SIZE={{ docker_proxy_cache_limit }}
58+
-e CACHE_MAX_SIZE={{ docker_proxy_cache_limit }}
3759
-e AWS_ACCESS_KEY_ID={{ docker_proxy_ecr_access_id }}
3860
-e AWS_SECRET_ACCESS_KEY={{ docker_proxy_ecr_secret_key }}
3961
-e AWS_REGION={{ docker_proxy_ecr_region }}

0 commit comments

Comments
 (0)