Почему iOS отклоняет сертификат с поддержкой LetsEncrypt?

#ios #ssl

Вопрос:

Я пытаюсь создать приложение Bitwarden для iOS для работы с моим автономным сервером Bitwarden. Сервер поддерживается обратным прокси (nginx). Я использовал сертификат с поддержкой letsencrypt, чтобы сделать его доступным через HTTPS. Он отлично работает через веб-интерфейс (не исключая Safari в iOS 15), но не работает в приложении iOS:

Уведомление об ошибке

Хотя это приложение, похоже, принимает сертификат https://bitwarden.com . По крайней мере, он показывает ошибку аутентификации, из которой я предположил, что сокет TLS был установлен нормально. Забавно, что этот сертификат также поддерживается LetsEncrypt. На самом деле это совсем не смешно, потому что это меня совершенно смущает.

Единственные требования к сертификатам TLS, влияющие на iOS 15, которые я обнаружил, указаны в требованиях к доверенным сертификатам в iOS 13 и macOS 10.15. Он накладывает пять ограничений на сертификаты, и кажется, что мой сертификат соответствует всем из них. Вот существенная часть его текстового представления с соответствующими комментариями.

     Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            04:3a:cc:90:eb:09:ca:f2:76:60:11:30:1a:30:27:dc:64:1b
    //>>>>>>
    //>>>>>> TLS server certificates and issuing CAs must use a hash algorithm from the SHA-2 family in the signature algorithm
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=US, O=Let's Encrypt, CN=R3
        Validity
            //>>>>>> 
            //>>>>>> TLS server certificates must have a validity period of 825 days or fewer
            Not Before: Nov 10 20:51:04 2021 GMT
            Not After : Feb  8 20:51:03 2022 GMT
        Subject: CN=bw.ivan-kondratyev.ru
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            //>>>>>> 
            //>>>>>> TLS server certificates and issuing CAs using RSA keys must use key sizes greater than or equal to 2048 bits.
                Public-Key: (2048 bit)
                Modulus:
                    00:c0:0b...
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Key Usage: critical
                Digital Signature, Key Encipherment
            //>>>>>> 
            //>>>>>> TLS server certificates must contain an ExtendedKeyUsage (EKU) extension containing the id-kp-serverAuth OID.
            X509v3 Extended Key Usage: 
                TLS Web Server Authentication, TLS Web Client Authentication
            X509v3 Basic Constraints: critical
                CA:FALSE
            X509v3 Subject Key Identifier: 
                FD:FF:3D:B7:C9:C3:B4:E2:6A:2E:1B:52:56:FC:B4:F8:78:84:9F:6E
            X509v3 Authority Key Identifier: 
                keyid:14:2E:B3:17:B7:58:56:CB:AE:50:09:40:E6:1F:AF:9D:8B:14:C2:C6

            Authority Information Access: 
                OCSP - URI:http://r3.o.lencr.org
                CA Issuers - URI:http://r3.i.lencr.org/
            //>>>>>>   
            //>>>>>> TLS server certificates must present the DNS name of the server in the Subject Alternative Name extension of the certificate
            X509v3 Subject Alternative Name: 
                DNS:bw.ivan-kondratyev.ru
            X509v3 Certificate Policies: 
                Policy: 2.23.140.1.2.1
                Policy: 1.3.6.1.4.1.44947.1.1.1
                  CPS: http://cps.letsencrypt.org
 

В моей конфигурации nginx есть параметры, связанные с ssl:

     ssl on;
    ssl_protocols       SSLv3 TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers         AES256-SHA:RC4-SHA:DES-CBC3-SHA;
    ssl_certificate /etc/letsencrypt/live/bw.ivan-kondratyev.ru/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/bw.ivan-kondratyev.ru/privkey.pem; # managed by Certbot
    ssl_session_cache   shared:SSL:10m;
    ssl_session_timeout 10m;
 

Я был бы очень признателен всем, кто разбирается в этой теме, за объяснение того, что я сделал не так, и есть ли шанс использовать автономный Bitwarden через iOS 15.

Ответ №1:

Почему IOS отклоняет сертификат с поддержкой LetsEncrypt?

В сообщении об ошибке ничего конкретно не говорится о проблемах с сертификатами, и для меня это не похоже на проблему с сертификатом. Вместо этого конфигурация SSL довольно небезопасна:

 ssl_protocols       SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers         AES256-SHA:RC4-SHA:DES-CBC3-SHA;
 

Хотя AES256-SHA все еще может быть приемлемым, другие шифры уже несколько лет считаются небезопасными и устаревшими. iOS может не принять ни один из них, потому что ни один из них не обеспечивает прямую секретность, что затем приводит к ошибке, которую вы видите.

Кроме того, предлагать SSLv3 тоже небезопасно.

Он отлично работает через веб-интерфейс

Поскольку браузеры должны работать с самыми разными сторонами, они обычно более терпимы и все равно будут работать с немного небезопасными настройками. В этом случае браузер, скорее всего, выберет AES256-SHA как достаточно безопасный.

В приложениях по умолчанию обычно применяются более строгие настройки безопасности, поскольку предполагается, что разработчик приложения также контролирует серверную часть и, следовательно, может настроить ее более безопасным способом. С этой точки зрения AES256-SHA неприемлем, поскольку он не обеспечивает прямую секретность.

Я не уверен, как вы придумали эту необычную конфигурацию, но для современных настроек, пожалуйста, обратитесь к moz:// генератор конфигурации SSL