SSL-сертификат Google Firebase - в моем сертификате содержится большое количество других веб-сайтов - PullRequest
0 голосов
/ 26 ноября 2018

Проблема: другие домены перечислены в моем SSL-сертификате Google Firebase.

Я создал проект firebase для проверки электронных писем с аутентификацией firebase от Cloud Functions. firebase.jhanley.com

У меня есть отдельный код, который работает в облачных функциях и проверяет сертификаты SSL для каждого домена, которым я владею / управляю (код ниже).Основная цель этого кода - отправить электронное письмо, когда срок действия SSL-сертификата домена истекает.Некоторые из наших SSL-сертификатов необходимо обновить вручную.

Проблема в том, что мой код, который проверяет SSL-сертификат, возвращает огромное количество других доменных имен для моего SSL-сертификата.Когда я смотрю на SSL-сертификат в Chrome, я также вижу эти другие доменные имена.Я хочу, чтобы мой сайт был связан с этими другими сайтами.

Сокращенный список доменов, которые я вижу в своем SSL-сертификате для Firebase:

2r5consultoria.com.br
addlix.com
admin.migrationcover.ae
admin.thermoply.com
akut-med.zeitnachweise.de
...
firebase.jhanley.com
...

В) Почему этопроисходит с Firebase SSL и есть ли решение?

В) Поддерживает ли Firebase установку собственного сертификата SSL?

Код Python 3.x, который выполняется вОблачные функции, которые обрабатывают сертификаты SSL путем подключения к каждому имени домена из списка.

Примечание. Этот код не имеет никаких (известных) проблем.Я включил исходный код для создания добавленной стоимости для других в сообществе.

""" Routines to process SSL certificates """

import  sys
import  datetime
import  socket
import  ssl
import  time
import  myhtml

g_email_required = False    # This is set during processing if a warning or error was detected

def get_email_requred():
    return g_email_required

def ssl_get_cert(hostname):
    """ This function returns an SSL certificate from a host """

    context = ssl.create_default_context()

    conn = context.wrap_socket(
        socket.socket(socket.AF_INET),
        server_hostname=hostname)

    # 3 second timeout because Google Cloud Functions has runtime limitations
    conn.settimeout(3.0)

    try:
        conn.connect((hostname, 443))
    except Exception as ex:
        print("{}: Exception: {}".format(hostname, ex), file=sys.stderr)
        return False, str(ex)

    host_ssl_info = conn.getpeercert()

    return host_ssl_info, ''

def get_ssl_info(host):
    """ This function retrieves the SSL certificate for host """
    # If we receive an error, retry up to three times waiting 10 seconds each time.

    retry = 0
    err = ''

    while retry < 3:
        ssl_info, err = ssl_get_cert(host)

        if ssl_info is not False:
            return ssl_info, ''

        retry += 1
        print('    retrying ...')
        time.sleep(10)

    return False, err

def get_ssl_issuer_name(ssl_info):
    """ Return the IssuerName from the SSL certificate """

    issuerName = ''

    issuer = ssl_info['issuer']

    # pylint: disable=line-too-long
    # issuer looks like this:
    # This is a set of a set of a set of key / value pairs.
    # ((('countryName', 'US'),), (('organizationName', "Let's Encrypt"),), (('commonName', "Let's Encrypt Authority X3"),))

    for item in issuer:
        # item will look like this as it goes thru the issuer set
        # Note that this is a set of a set
        #
        # (('countryName', 'US'),)
        # (('organizationName', "Let's Encrypt"),)
        # (('commonName', "Let's Encrypt Authority X3"),)

        s = item[0]

        # s will look like this as it goes thru the isser set
        # Note that this is now a set
        #
        # ('countryName', 'US')
        # ('organizationName', "Let's Encrypt")
        # ('commonName', "Let's Encrypt Authority X3")

        # break the set into "key" and "value" pairs
        k = s[0]
        v = s[1]

        if k == 'organizationName':
            if v != '':
                issuerName = v
                continue

        if k == 'commonName':
            if v != '':
                issuerName = v

    return issuerName

def get_ssl_subject_alt_names(ssl_info):
    """ Return the Subject Alt Names """

    altNames = ''

    subjectAltNames = ssl_info['subjectAltName']

    index = 0
    for item in subjectAltNames:
        altNames += item[1]
        index += 1

        if index < len(subjectAltNames):
            altNames += ', '

    return altNames

def process_hostnames(msg_body, hostnames, days_left):
    """ Process the SSL certificate for each hostname """

    # pylint: disable=global-statement
    global g_email_required

    ssl_date_fmt = r'%b %d %H:%M:%S %Y %Z'

    for host in hostnames:
        f_expired = False

        print('Processing host:', host)

        ssl_info, err = get_ssl_info(host)

        if ssl_info is False:
            msg_body = myhtml.add_row(msg_body, host, err, '', '', '', True)
            g_email_required = True
            continue

        #print(ssl_info)

        issuerName = get_ssl_issuer_name(ssl_info)

        altNames = get_ssl_subject_alt_names(ssl_info)

        l_expires = datetime.datetime.strptime(ssl_info['notAfter'], ssl_date_fmt)

        remaining = l_expires - datetime.datetime.utcnow()

        if remaining < datetime.timedelta(days=0):
            # cert has already expired - uhoh!
            cert_status = "Expired"
            f_expired = True
            g_email_required = True
        elif remaining < datetime.timedelta(days=days_left):
            # expires sooner than the buffer
            cert_status = "Time to Renew"
            f_expired = True
            g_email_required = True
        else:
            # everything is fine
            cert_status = "OK"
            f_expired = False

        msg_body = myhtml.add_row(msg_body, host, cert_status, str(l_expires), issuerName, altNames, f_expired)

    return msg_body

1 Ответ

0 голосов
/ 26 ноября 2018

Это происходит потому, что Firebase автоматически создает общие сертификаты для клиентов.Это не представляет угрозы для безопасности вашего сайта, поскольку Firebase сохраняет полный контроль над закрытыми ключами сертификата.Совместное использование сертификатов позволяет нам предлагать HTTPS + пользовательские домены без дополнительной платы для наших клиентов бесплатного плана.

Если вы используете план Blaze (с оплатой по мере использования) для своего проекта, вы можетеОтправьте запрос на Поддержка Firebase , и мы сможем перенести вас в специальный сертификат.Это доступно только для клиентов плана Blaze.

Хостинг Firebase в настоящее время не поддерживает загрузку пользовательских сертификатов.Если это важный для вас вариант использования, я бы порекомендовал подать запрос на функцию (снова через Поддержка Firebase ), чтобы мы могли оценить его для будущих улучшений продукта.

...