Skip to content
Snippets Groups Projects
Commit a4212400 authored by Jan Alexander Steffens (heftig)'s avatar Jan Alexander Steffens (heftig)
Browse files

Merge branch 'legacy-certs' into 'master'

Add support for "legacy" RSA 4096 certs

Closes releng#22

See merge request archlinux/infrastructure!852
parents 92376891 b713f5b3
No related branches found
No related tags found
1 merge request!852Add support for "legacy" RSA 4096 certs
Pipeline #103387 passed
...@@ -27,6 +27,7 @@ The basic configuration looks like this: ...@@ -27,6 +27,7 @@ The basic configuration looks like this:
service_name: "<service name>" service_name: "<service name>"
service_domain: "{{ service_domain }}" service_domain: "{{ service_domain }}"
service_alternate_domains: [] service_alternate_domains: []
service_legacy_domains: []
service_nginx_conf: "{{ service_nginx_conf }}" service_nginx_conf: "{{ service_nginx_conf }}"
when: maintenance is defined when: maintenance is defined
``` ```
......
archweb_dir: '/srv/http/archweb' archweb_dir: '/srv/http/archweb'
archweb_domain: 'archlinux.org' archweb_domain: 'archlinux.org'
archweb_alternate_domains: ['www.archlinux.org', 'master-key.archlinux.org', 'dev.archlinux.org', 'packages.archlinux.org', 'ipxe.archlinux.org', 'planet.archlinux.org'] archweb_alternate_domains: ['www.archlinux.org', 'master-key.archlinux.org', 'dev.archlinux.org', 'packages.archlinux.org', 'planet.archlinux.org']
archweb_legacy_domains: ['ipxe.archlinux.org']
archweb_domains_redirects: archweb_domains_redirects:
'www.archlinux.org': '$request_uri' 'www.archlinux.org': '$request_uri'
'master-key.archlinux.org': '/master-keys/' 'master-key.archlinux.org': '/master-keys/'
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
service_name: "site" service_name: "site"
service_domain: "{{ archweb_domain }}" service_domain: "{{ archweb_domain }}"
service_alternate_domains: "{{ archweb_alternate_domains }}" service_alternate_domains: "{{ archweb_alternate_domains }}"
service_legacy_domains: "{{ archweb_legacy_domains }}"
service_nginx_conf: "{{ archweb_nginx_conf }}" service_nginx_conf: "{{ archweb_nginx_conf }}"
service_nginx_template: "maintenance-nginx.d.conf.j2" service_nginx_template: "maintenance-nginx.d.conf.j2"
when: maintenance is defined and archweb_site when: maintenance is defined and archweb_site
...@@ -29,6 +30,15 @@ ...@@ -29,6 +30,15 @@
domains: "{{ [archweb_domain] + archweb_alternate_domains }}" domains: "{{ [archweb_domain] + archweb_alternate_domains }}"
when: archweb_site | bool and maintenance is not defined when: archweb_site | bool and maintenance is not defined
- name: Create legacy ssl cert
include_role:
name: certificate
vars:
cert_name: "{{ archweb_domain }}_legacy"
domains: "{{ archweb_legacy_domains }}"
legacy: true
when: archweb_site | bool and maintenance is not defined
- name: Set up nginx - name: Set up nginx
template: src=nginx.d.conf.j2 dest="{{ archweb_nginx_conf }}" owner=root group=root mode=644 template: src=nginx.d.conf.j2 dest="{{ archweb_nginx_conf }}" owner=root group=root mode=644
notify: Reload nginx notify: Reload nginx
......
...@@ -27,9 +27,9 @@ server { ...@@ -27,9 +27,9 @@ server {
ssl_ciphers AES128-SHA:AES256-SHA:AES128-SHA256:AES256-SHA256; ssl_ciphers AES128-SHA:AES256-SHA:AES128-SHA256:AES256-SHA256;
ssl_certificate /etc/letsencrypt/live/{{ archweb_domain }}/fullchain.pem; ssl_certificate /etc/letsencrypt/live/{{ archweb_domain }}_legacy/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/{{ archweb_domain }}/privkey.pem; ssl_certificate_key /etc/letsencrypt/live/{{ archweb_domain }}_legacy/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/{{ archweb_domain }}/chain.pem; ssl_trusted_certificate /etc/letsencrypt/live/{{ archweb_domain }}_legacy/chain.pem;
location /releng/netboot/ { location /releng/netboot/ {
access_log /var/log/nginx/{{ archweb_domain }}/access.log main; access_log /var/log/nginx/{{ archweb_domain }}/access.log main;
......
...@@ -2,9 +2,7 @@ upstream archweb { ...@@ -2,9 +2,7 @@ upstream archweb {
server unix:///run/uwsgi/archweb.sock; server unix:///run/uwsgi/archweb.sock;
} }
{% if service_alternate_domains %} {% for domain in service_alternate_domains | default([]) %}
{% for domain in service_alternate_domains %}
server { server {
listen 80; listen 80;
listen [::]:80; listen [::]:80;
...@@ -18,7 +16,7 @@ server { ...@@ -18,7 +16,7 @@ server {
location / { location / {
access_log off; access_log off;
return 301 https://$server_name$request_uri; return 302 https://$server_name$request_uri;
} }
} }
...@@ -38,16 +36,51 @@ server { ...@@ -38,16 +36,51 @@ server {
location / { location / {
access_log off; access_log off;
return 301 https://{{ service_domain }}; return 302 https://{{ service_domain }};
} }
} }
{% endfor %} {% endfor %}
{% for domain in service_legacy_domains | default([]) %}
server {
listen 80;
listen [::]:80;
server_name {{ domain }};
access_log {{ maintenance_logs_dir }}/{{ service_domain }}-access.log reduced;
access_log {{ maintenance_logs_dir }}/{{ service_domain }}-access.log.json json_reduced;
error_log {{ maintenance_logs_dir }}/{{ service_domain }}-error.log;
include snippets/letsencrypt.conf;
location / {
access_log off;
return 302 https://$server_name$request_uri;
}
}
server { server {
{% else %} listen 443 ssl;
listen [::]:443 ssl;
http2 on;
server_name {{ domain }};
access_log {{ maintenance_logs_dir }}/{{ service_domain }}-access.log reduced;
access_log {{ maintenance_logs_dir }}/{{ service_domain }}-access.log.json json_reduced;
error_log {{ maintenance_logs_dir }}/{{ service_domain }}-error.log;
ssl_certificate /etc/letsencrypt/live/{{ service_domain }}_legacy/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/{{ service_domain }}_legacy/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/{{ service_domain }}_legacy/chain.pem;
location / {
access_log off;
return 302 https://{{ service_domain }};
}
}
{% endfor %}
server { server {
{% endif %}
listen 80; listen 80;
listen [::]:80; listen [::]:80;
server_name {{ service_domain }}; server_name {{ service_domain }};
...@@ -60,7 +93,7 @@ server { ...@@ -60,7 +93,7 @@ server {
location / { location / {
access_log off; access_log off;
return 301 https://$server_name$request_uri; return 302 https://$server_name$request_uri;
} }
} }
......
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
vars: vars:
service_name: "wiki" service_name: "wiki"
service_domain: "{{ archwiki_domain }}" service_domain: "{{ archwiki_domain }}"
service_alternate_domains: []
service_nginx_conf: "{{ archwiki_nginx_conf }}" service_nginx_conf: "{{ archwiki_nginx_conf }}"
when: maintenance is defined when: maintenance is defined
......
...@@ -3,7 +3,7 @@ Description=Let's Encrypt renewal ...@@ -3,7 +3,7 @@ Description=Let's Encrypt renewal
[Service] [Service]
Type=oneshot Type=oneshot
ExecStart=/usr/bin/certbot renew --key-type ecdsa \ ExecStart=/usr/bin/certbot renew \
--no-random-sleep-on-renew \ --no-random-sleep-on-renew \
--pre-hook "/etc/letsencrypt/hook.sh pre" \ --pre-hook "/etc/letsencrypt/hook.sh pre" \
--post-hook "/etc/letsencrypt/hook.sh post" \ --post-hook "/etc/letsencrypt/hook.sh post" \
......
- name: Create ssl cert (HTTP-01) - name: Create ssl cert (HTTP-01) named {{ cert_name | default(domains | first) }}
shell: | shell: |
set -o pipefail set -o pipefail
# We can't start nginx without the certificate and we can't issue a certificate without nginx running. # We can't start nginx without the certificate and we can't issue a certificate without nginx running.
# So use Python built-in http.server for the initial certificate issuance # So use Python built-in http.server for the initial certificate issuance
python -m http.server --directory {{ letsencrypt_validation_dir }} 80 & python -m http.server --directory {{ letsencrypt_validation_dir }} 80 &
trap "jobs -p | xargs --no-run-if-empty kill" EXIT trap "jobs -p | xargs --no-run-if-empty kill" EXIT
certbot certonly --email {{ certificate_contact_email }} --agree-tos --key-type ecdsa --renew-by-default --webroot -w {{ letsencrypt_validation_dir }} -d {{ domains | join(' -d ') }} certbot certonly --email {{ certificate_contact_email }} --agree-tos --key-type {{ 'ecdsa' if not (legacy | default(false)) else 'rsa --rsa-key-size 4096' }} --renew-by-default --webroot -w {{ letsencrypt_validation_dir }} -d {{ domains | join(' -d ') }} --cert-name {{ cert_name | default(domains | first) }}
args: args:
creates: '/etc/letsencrypt/live/{{ domains | first }}/fullchain.pem' creates: '/etc/letsencrypt/live/{{ cert_name | default(domains | first) }}/fullchain.pem'
when: challenge | default(certificate_challenge) == "HTTP-01" when: challenge | default(certificate_challenge) == "HTTP-01"
- name: Create ssl cert (DNS-01) - name: Create ssl cert (DNS-01) named {{ cert_name | default(domains | first) }}
command: certbot certonly --email {{ certificate_contact_email }} --agree-tos --key-type ecdsa --renew-by-default --dns-rfc2136 --dns-rfc2136-credentials /etc/letsencrypt/rfc2136.ini -d {{ domains | join(' -d ') }} command: certbot certonly --email {{ certificate_contact_email }} --agree-tos --key-type {{ 'ecdsa' if not (legacy | default(false)) else 'rsa --rsa-key-size 4096' }} --renew-by-default --dns-rfc2136 --dns-rfc2136-credentials /etc/letsencrypt/rfc2136.ini -d {{ domains | join(' -d ') }} --cert-name {{ cert_name | default(domains | first) }}
args: args:
creates: '/etc/letsencrypt/live/{{ domains | first }}/fullchain.pem' creates: '/etc/letsencrypt/live/{{ cert_name | default(domains | first) }}/fullchain.pem'
when: challenge | default(certificate_challenge) == "DNS-01" when: challenge | default(certificate_challenge) == "DNS-01"
...@@ -34,7 +34,7 @@ ...@@ -34,7 +34,7 @@
registry_external_url 'https://registry.archlinux.org' registry_external_url 'https://registry.archlinux.org'
nginx['client_max_body_size'] = '10g' nginx['client_max_body_size'] = '10g'
nginx['listen_addresses'] = {{ gitlab_primary_addresses }} nginx['listen_addresses'] = {{ gitlab_primary_addresses }}
nginx['custom_gitlab_server_config'] = "set $bypass 0;\nif ($remote_addr = \"{{ hostvars['gemini.archlinux.org']['ipv4_address'] }}\") {\nset $bypass 1;\n}\nif ($remote_addr = \"{{hostvars['gemini.archlinux.org']['ipv6_address']}}\") {\nset $bypass 1;\n}\nproxy_set_header Gitlab-Bypass-Rate-Limiting $bypass;\n" nginx['custom_gitlab_server_config'] = "set $bypass 0;\nif ($remote_addr = \"{{ hostvars['gemini.archlinux.org']['ipv4_address'] }}\") {\nset $bypass 1;\n}\nif ($remote_addr = \"{{ hostvars['gemini.archlinux.org']['ipv6_address'] }}\") {\nset $bypass 1;\n}\nproxy_set_header Gitlab-Bypass-Rate-Limiting $bypass;\n"
registry_nginx['listen_addresses'] = {{ gitlab_primary_addresses }} registry_nginx['listen_addresses'] = {{ gitlab_primary_addresses }}
gitlab_pages['inplace_chroot'] = true gitlab_pages['inplace_chroot'] = true
pages_external_url "http://{{ gitlab_domain }}" pages_external_url "http://{{ gitlab_domain }}"
......
{% if service_alternate_domains %} {% for domain in service_alternate_domains | default([]) %}
{% for domain in service_alternate_domains %}
server { server {
listen 80; listen 80;
listen [::]:80; listen [::]:80;
...@@ -14,7 +12,7 @@ server { ...@@ -14,7 +12,7 @@ server {
location / { location / {
access_log off; access_log off;
return 301 https://$server_name$request_uri; return 302 https://$server_name$request_uri;
} }
} }
...@@ -34,16 +32,51 @@ server { ...@@ -34,16 +32,51 @@ server {
location / { location / {
access_log off; access_log off;
return 301 https://{{ service_domain }}; return 302 https://{{ service_domain }};
} }
} }
{% endfor %} {% endfor %}
{% for domain in service_legacy_domains | default([]) %}
server {
listen 80;
listen [::]:80;
server_name {{ domain }};
access_log {{ maintenance_logs_dir }}/{{ service_domain }}-access.log reduced;
access_log {{ maintenance_logs_dir }}/{{ service_domain }}-access.log.json json_reduced;
error_log {{ maintenance_logs_dir }}/{{ service_domain }}-error.log;
include snippets/letsencrypt.conf;
location / {
access_log off;
return 302 https://$server_name$request_uri;
}
}
server { server {
{% else %} listen 443 ssl;
listen [::]:443 ssl;
http2 on;
server_name {{ domain }};
access_log {{ maintenance_logs_dir }}/{{ service_domain }}-access.log reduced;
access_log {{ maintenance_logs_dir }}/{{ service_domain }}-access.log.json json_reduced;
error_log {{ maintenance_logs_dir }}/{{ service_domain }}-error.log;
ssl_certificate /etc/letsencrypt/live/{{ service_domain }}_legacy/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/{{ service_domain }}_legacy/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/{{ service_domain }}_legacy/chain.pem;
location / {
access_log off;
return 302 https://{{ service_domain }};
}
}
{% endfor %}
server { server {
{% endif %}
listen 80; listen 80;
listen [::]:80; listen [::]:80;
server_name {{ service_domain }}; server_name {{ service_domain }};
...@@ -56,7 +89,7 @@ server { ...@@ -56,7 +89,7 @@ server {
location / { location / {
access_log off; access_log off;
return 301 https://$server_name$request_uri; return 302 https://$server_name$request_uri;
} }
} }
......
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
vars: vars:
service_name: "security tracker" service_name: "security tracker"
service_domain: "{{ security_tracker_domain }}" service_domain: "{{ security_tracker_domain }}"
service_alternate_domains: []
service_nginx_conf: "{{ security_tracker_nginx_conf }}" service_nginx_conf: "{{ security_tracker_nginx_conf }}"
when: maintenance is defined when: maintenance is defined
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment