====== Let's encrypt ====== Сервис по выдаче и автоматическому обновлению бесплатных SSL-сертификатов. Для Windows пока нет стандартной процедуры, но есть [[https://community.letsencrypt.org/t/list-of-client-implementations/2103|сторонние разработки]]. ===== Установка ===== [[https://certbot.eff.org/#ubuntuxenial-apache|Вариант для Apache on Ubuntu 16.04 (xenial)]] Чтобы сделать сертификат для домена, отличающегося от имени сервера, запустить certbot с параметром --domain, например certbot --apache --domain test.example.org ===== Настройка автообновления ===== Проверять актуальность сертификата и обновлять при необходимости каждый день в 8:00 и 20:00. nano /etc/crontab Добавить туда 0 8,20 * * * root letsencrypt renew ===== Для Haproxy ===== Штука в том, что порты 80 и 443 заняты, и certbot должен работать на другом порту (здесь: 54321). Помимо этого, нужно настроить Haproxy на проброс его URL на localhost сервера Haproxy. Затем необходимо слепить сертификат с ключом в единый .pem и положить их в каталог, куда Haproxy смотрит. # На фронтенде :80 # Let's Encrypt URL acl letsencrypt_url path_beg /.well-known/acme-challenge/ # Не пробрасывать на HTTPS http-request redirect scheme https if !{ ssl_fc } !no-https-domains !letsencrypt_url # Let's Encrypt backend use_backend be_letsencrypt if letsencrypt_url # Бэкенд backend be_letsencrypt server letsencrypt 127.0.0.1:54321 # Получить сертификат для example.com и www.example.com certbot certonly --standalone --preferred-challenges http-01 --http-01-port 54321 --keep --agree-tos --expand -m ssl@example.com -d example.com -d www.example.com :' Saving debug log to /var/log/letsencrypt/letsencrypt.log Requesting a certificate for example.com and www.example.com Successfully received certificate. Certificate is saved at: /etc/letsencrypt/live/example.com/fullchain.pem Key is saved at: /etc/letsencrypt/live/example.com/privkey.pem This certificate expires on 2022-08-18. These files will be updated when the certificate renews. Certbot has set up a scheduled task to automatically renew this certificate in the background. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - If you like Certbot, please consider supporting our work by: * Donating to ISRG / Let`s Encrypt: https://letsencrypt.org/donate * Donating to EFF: https://eff.org/donate-le - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ' "Certbot has set up a scheduled task to automatically renew this certificate in the background."\\ Если Certbot установлен через snap, то вместо cron он добавляет задачи на обновление сертификата в systemd timer. Посмотреть: systemctl list-timers https://eff-certbot.readthedocs.io/en/stable/using.html#automated-renewals\\ [[https://habr.com/ru/company/ruvds/blog/512868/|Использование таймеров systemd вместо заданий cron]] #!/bin/bash LE_CERT_DIR=/etc/letsencrypt/live HAPROXY_CERT_DIR=/etc/ssl/certs/haproxy # Cat the certificate chain and the private key together for haproxy for path in $(find $LE_CERT_DIR/* -type d -exec basename {} \;); do cat $LE_CERT_DIR/$path/{fullchain.pem,privkey.pem} > $HAPROXY_CERT_DIR/${path}.pem done https://certbot.eff.org/instructions?ws=haproxy&os=ubuntufocal\\ https://eff-certbot.readthedocs.io/en/stable/using.html#certbot-command-line-options\\ https://gist.github.com/lmmendes/7fad9a2c8f389b39b6661d0945b72cb7\\ https://www.digitalocean.com/community/tutorials/how-to-secure-haproxy-with-let-s-encrypt-on-ubuntu-14-04\\ https://www.digitalocean.com/community/tutorials/how-to-use-certbot-standalone-mode-to-retrieve-let-s-encrypt-ssl-certificates-on-ubuntu-20-04 ==== Выпуск сертификата для HAProxy ==== #!/bin/bash for d in "$@"; do domains+="-d $d " done certbot certonly --standalone --preferred-challenges http-01 --http-01-port 54321 --keep --agree-tos --expand -m ssl@example.com $domains && \ cat /etc/letsencrypt/live/$1/{fullchain.pem,privkey.pem} > /etc/ssl/certs/haproxy/$1.pem && \ systemctl reload haproxy Использование: chmod u+x /scripts/haproxy-cert-issue.sh # Файл сертификата будет назван по имени первого аргумента (/etc/ssl/certs/haproxy/example.com.pem) # Все аргументы будут добавлены в команду как домены (-d example.com -d www.example.com и т. д.) /scripts/haproxy-cert-issue.sh example.com www.example.com example2.com www.example2.com ==== Перевыпуск сертификата для HAProxy (автомат) ==== #!/bin/bash cat $RENEWED_LINEAGE/{fullchain.pem,privkey.pem} > /etc/ssl/certs/haproxy/$(basename $RENEWED_LINEAGE).pem # --deploy-hook DEPLOY_HOOK # Command to be run in a shell once for each # successfully issued certificate. For this command, the # shell variable $RENEWED_LINEAGE will point to the # config live subdirectory (for example, # "/etc/letsencrypt/live/example.com") containing the # new certificates and keys; the shell variable # $RENEWED_DOMAINS will contain a space-delimited list # of renewed certificate domains (for example, # "example.com www.example.com") (default: None) Перезапуск HAProxy ### /scripts/haproxy-reload-if-new-certs.sh #!/bin/bash if [[ $(find /etc/ssl/certs/haproxy/* -mtime -1) ]] then systemctl reload haproxy.service fi # to cron echo -e "\n# Reload HAProxy if there are new certs\n0 3\t* * *\troot\t/scripts/haproxy-reload-if-new-certs.sh" >> /etc/crontab ===== Для Cisco ASA ===== Сама она не умеет (asa5545X). Сетевики должны прокинуть на ней 80-й порт на внутренний/DMZ-сервер, завести отдельную учётку и разрешить для этой учётки некоторые команды и вход на ASA по ssh. Далее всё делается на сервере. # Необходимо установить certbot и expect для автоматизации работы с Cisco через ssh. sudo snap install --classic certbot sudo apt install expect -y # Выпустить сертификат certbot certonly --standalone --preferred-challenges http-01 --keep --agree-tos --expand -m ssl@example.com -d vpn.example.com Конфиг состоит из 3 файлов. # скрипт, выполняющийся при обновлении сертификата touch /etc/letsencrypt/renewal-hooks/deploy/vpncert-asa.sh chmod 700 /etc/letsencrypt/renewal-hooks/deploy/vpncert-asa.sh # скрипт expect touch /scripts/vpncert-install.exp chmod 700 /scripts/vpncert-install.exp # пароль экспорта сертификата для openssl touch /scripts/vpncert-asa.txt chmod 600 /scripts/vpncert-asa.txt # Записать пароль в файл пароля nano /scripts/vpncert-asa.txt #!/bin/bash openssl pkcs12 -export \ -password file:/scripts/vpncert-asa.txt \ -in $RENEWED_LINEAGE/fullchain.pem \ -inkey $RENEWED_LINEAGE/privkey.pem \ -out /root/gate.pfx && \ openssl base64 -in /root/gate.pfx -out /root/gate.base64 && \ /scripts/vpncert-install.exp #!/usr/bin/expect -f set timeout 5 set send_slow {10 .001} set sshUser "sshuser" set sshIP "192.168.1.254" set sshPass "sshPass12345" set exportPass [exec cat /scripts/vpncert-asa.txt] #set log "/root/vpncert.log" #log_file -noappend $log #log_user 0 spawn ssh -o KexAlgorithms=+diffie-hellman-group1-sha1 -o HostKeyAlgorithms=+ssh-rsa -o StrictHostKeyChecking=no $sshUser@$sshIP expect "password:" send -- "$sshPass\r" expect ">" send -- "enable\r" expect "Password:" send -- "$sshPass\r" expect "#" #log_user 1 send -- "configure terminal\r" expect "(config)#" send -- "no crypto ca trustpoint ca_le\r" expect { "]:" {send -- "yes\r"; exp_continue} "(config)#" } send -- "crypto ca trustpoint ca_le\r" expect "trustpoint)#" send -- "enrollment terminal\r" expect "#" send -- "exit\r" expect "(config)#" #log_user 0 send -- "crypto ca import ca_le pkcs12 $exportPass\r" expect "itself:" send -- [exec cat /root/gate.base64]\n send -s "quit\r" # % The CA cert is not self-signed. # % Do you also want to create trustpoints for CAs higher in the hierarchy? [yes/no]: # OR # % You already have RSA or ECDSA keys named ca_le. # % If you replace them, all device certs issued using these keys # % will be removed. # % Do you really want to replace them? [yes/no]: expect { "]:" {send -- "yes\r"; exp_continue} "(config)#" } #log_user 1 send -- "ssl trust-point ca_le outside\r" expect "(config)#" send -- "exit\r" expect "#" send -- "exit\r" expect eof ++++ Пример выполнения скрипта | spawn ssh -o KexAlgorithms=+diffie-hellman-group1-sha1 -o HostKeyAlgorithms=+ssh-rsa -o StrictHostKeyChecking=no sshuser@192.168.1.254 sshuser@192.168.1.254's password: User sshuser logged in to gate Logins over the last 91 days: 54. Last login: 11:39:24 MSK Jan 9 2023 from 192.168.1.100 Failed logins since the last login: 0. Type help or '?' for a list of available commands. gate> enable Password: ********** gate# configure terminal gate(config)# no crypto ca trustpoint ca_le WARNING: Removing an enrolled trustpoint will destroy all certificates received from the related Certificate Authority. Are you sure you want to do this? [yes/no]: yes INFO: Be sure to ask the CA administrator to revoke your certificates. gate(config)# crypto ca trustpoint ca_le gate(config-ca-trustpoint)# enrollment terminal gate(config-ca-trustpoint)# exit gate(config)# crypto ca import ca_le pkcs12 verySecretPassword12345 Enter the base 64 encoded pkcs12. End with the word "quit" on a line by itself: MIIWzwIBAzCCFoUGCSqGSIb3DQEHAaCCFnYEghZyMIIWbjCCEOIGCSqGSIb3DQEH BqCCENMwghDPAgEAMIIQyAYJKoZIhvcNAQcBMFcGCSqGSIb3DQEFDTBKMCkGCSqG ... dt/zTsIeIqQq05PLFpOTIzBBMDEwDQYJYIZIAWUDBAIBBQAEIMyVqqTQhaaqlHOH D3XnctPJR1TYytiVRCaVWuZHz+G0BAiEKmqw9Y6C4AICCAA= quit % You already have RSA or ECDSA keys named ca_le. % If you replace them, all device certs issued using these keys % will be removed. % Do you really want to replace them? [yes/no]: yes Trustpoint 'ca_le' is a subordinate CA and holds a non self-signed certificate. Trustpoint CA certificate accepted. WARNING: CA certificates can be used to validate VPN connections, by default. Please adjust the validation-usage of this trustpoint to limit the validation scope, if necessary. INFO: Import PKCS12 operation completed successfully. gate(config)# ssl trust-point ca_le outside gate(config)# exit gate# exit Logoff Connection to 192.168.1.254 closed by remote host. Connection to 192.168.1.254 closed. ++++ [[https://linux.die.net/man/1/expect|expect(1)]]\\ [[https://likegeeks.com/expect-command/|Expect command and how to automate shell scripts like magic]]\\ [[https://www.cisco.com/c/en/us/support/docs/security-vpn/public-key-infrastructure-pki/200339-Configure-ASA-SSL-Digital-Certificate-I.html#anc15|SSL Certificate Installation on the ASA: Installation of a PEM Certificate with the CLI]]\\