Netgate Discussion Forum
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Search
    • Register
    • Login

    Обновление сертификатов

    Scheduled Pinned Locked Moved Russian
    9 Posts 3 Posters 668 Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • G
      grommir
      last edited by

      Есть с десяток пфсенсов и новый сетрификат, который нужно на них поставить. Есть ли какой-то вариант это автоматизировать, чтобы не бегать по всем серверам и не ставить его вручную через UI?

      Так же было бы неплохо, если бы была возможность заменить этим сетрификатом старый, который сейчас используется для SSL оффлоадинга в haproxy.

      1 Reply Last reply Reply Quote 0
      • werterW
        werter
        last edited by werter

        Вкл на пф SSH
        Поискать ГДЕ живут на пф эти сертификаты
        Если Win, то с пом pscp попробовать их заменить (написать bat-ник).
        Или попробовать что-то типа ansible. если есть *nix.
        Но не уверен, что пф ваши изменения не перепишет.

        1 Reply Last reply Reply Quote 0
        • G
          grommir
          last edited by

          Насколько я понимаю - все они живут в /cf/conf/config.xml
          Можно конечно тупо заменить их sed-ом, но я не уверен, что это правильный вариант.

          K 1 Reply Last reply Reply Quote 0
          • werterW
            werter
            last edited by

            Пробуем. Отписываемся )

            1 Reply Last reply Reply Quote 0
            • K
              Konstanti @grommir
              last edited by Konstanti

              @grommir

              Насколько я понимаю - все они живут в /cf/conf/config.xml
              Можно конечно тупо заменить их sed-ом, но я не уверен, что это правильный вариант.

              По-моему , тоже это неверный вариант
              Все серты и ключи в конфиге переведены в кодировку base64

              Те если обратите внимание, то увидите
              что ключи , например, в моем случае начинаются с текста
              LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0t

              а должны ( опять же мой случай)

              -----BEGIN EC PRIVATE KEY-----

              G 1 Reply Last reply Reply Quote 0
              • G
                grommir @Konstanti
                last edited by

                @Konstanti Потому я и интересуюсь - вдруг в cli есть иснструменты для добавления/удаления сетрификатов.

                K 1 Reply Last reply Reply Quote 0
                • K
                  Konstanti @grommir
                  last edited by

                  @grommir
                  По-моему, эту задачу можно решить если только самому написать php скрипт для добавления/обновления сертификатов , при удалении могут быть неприятные последствия , потому что сертификат может быть использован разными модулями и надо отслеживать все ссылки на этот серт .
                  Но написание и отладка такого скрипта может занят больше времени , чем обновить сертификаты вручную.

                  1 Reply Last reply Reply Quote 0
                  • G
                    grommir
                    last edited by

                    На просторах интернета нашел такой скрипт. Судя по коментам - должно работать.

                    #!/bin/bash
                    host="ipaddress"
                    username="username"
                    password="password"
                    certificate="certificate.pem"
                    privatekey="privatekey.pem"
                    oldcertificate=$(<certificate.crt.old.txt)
                    oldprivatekey=$(<certificate.key.old.txt)
                    
                    mv $certificate $certificate.combo
                    csplit -f $certificate.part $certificate.combo '/-----BEGIN CERTIFICATE-----/' '{*}'
                    
                    for file in $certificate.part*;
                    do echo "Processing $file file..";
                    output=$(openssl x509 -noout -subject -in $file);
                    if [[ $output = *CN=*.* ]]
                    then
                            mv $file certificate.pem
                    fi
                    if [[ $output = *Authority* ]]
                    then
                            mv $file CA_LetsEncrypt.pem
                    fi
                    done
                    
                    cert=$(base64 $certificate)
                    cert=$(echo $cert | sed "s/ //g")
                    key=$(base64 $privatekey)
                    key=$(echo $key | sed "s/ //g")
                    
                    sshpass -p $password scp $username@$host:/conf/config.xml config.xml
                    
                    if grep "$cert" config.xml > /dev/null
                    then
                        echo "Identical certificate found, renewal not required"
                    else
                        echo "Certificate not found, renewal required"
                        sed -i -e "s|$oldcertificate|$cert|g" config.xml
                        sed -i -e "s|$oldprivatekey|$key|g" config.xml
                        echo $cert > certificate.crt.old.txt
                        echo $key > certificate.key.old.txt
                        sshpass -p $password scp config.xml $username@$host:/conf/config.xml
                        sshpass -p $password ssh $username@$host rm /tmp/config.cache
                        sshpass -p $password ssh $username@$host /etc/rc.restart_webgui
                        find . -size  0 -name $certificate.part* -print0 |xargs -0 rm --
                        rm $certificate.combo
                        rm certificate.pem
                        rm privatekey.pem
                        rm CA_LetsEncrypt.pem
                        rm config.xml
                    fi
                    
                    
                    1 Reply Last reply Reply Quote 0
                    • G
                      grommir
                      last edited by

                      В итоге решил сделать с помощью ансибла.
                      Нашёл модули для pFsense https://github.com/bevhost/ansible-module-pfsense

                      Плэйбук выглядел приблизительно так:

                      ---
                      - name: Install requirement pythoon libs
                        local_action: pip name=hvac
                      
                      - name: Load SSL Certificate
                        pfsense_cert:
                          refid: "{{ refid }}"
                          descr: "{{ cert_descr }}"
                          crt: "{{ certs['data']['cert'] | b64encode }}"
                          prv: "{{ certs['data']['key'] | b64encode }}"
                      
                      - name: Restart the web GUI
                        shell: /etc/rc.restart_webgui
                      
                      - name: Restart HAProxy
                        shell: /usr/local/etc/rc.d/haproxy.sh restart
                      

                      refid - ID сертификата в конфиге. если мы хотим автоматом заменить старый на новый, то он должен быть таким же как у старого (я использовал: refid: "{{ cert_name | hash('sha1') }}" )
                      descr - имя сертификата в pFsense
                      crt - сертификат
                      prv - ключ

                      1 Reply Last reply Reply Quote 1
                      • First post
                        Last post
                      Copyright 2025 Rubicon Communications LLC (Netgate). All rights reserved.