Как исправить ошибку WordPress 60: Проблема с сертификатом SSL: Сертификат истек

# Как исправить ошибку WordPress 60: Проблема с сертификатом SSL: Сертификат истек

С 30 сентября 2021 года запросы HTTP API могут перестать работать на сайтах WordPress с установленным сертификатом Let's Encrypt.

Например, следующий запрос приведет к ошибке:

$res = wp_remote_get( 'https://wp-kama.com/' );

if( is_wp_error( $res ) ){
    echo $res->get_error_message();
}

Вы получите сообщение:

cURL error 60: SSL certificate problem: certificate has expired


Такую ошибку можно увидеть в разных местах, например:

- В административной панели при проверке обновлений WordPress.
- При проверке обновлений плагинов.
- При доступе к API любых сервисов. Например, перестанет работать плагин TinyPNG для сжатия изображений JPEG, PNG и WebP, а также множество других, использующих HTTP-запросы.

## Почему мы видим ошибку "Сертификат истек"?

Вкратце, ядро WordPress имеет файл корневых сертификатов по адресу /wp-includes/certificates/ca-bundle.crt, который используется для проверки SSL всех запросов, сделанных через HTTP API. В этом файле один из корневых сертификатов истек, что не позволяет запросу пройти проверку и вызывает указанную ошибку.

### Более подробное объяснение

Не углубляясь в сложные детали, многие системы, которые проверяют сертификаты, имеют свои репозитории доверенных корневых сертификатов. Система будет доверять сертификатам, подписанным с помощью приватного ключа одного из этих корневых сертификатов. Корневые сертификаты обычно имеют длительные сроки действия, их редко меняют, и они не используются для создания конечных сертификатов (например, сертификатов для доменного имени).

Когда появился Let's Encrypt, его корневой сертификат ISRG Root X1 не смог быстро попасть в доверенные хранилища сертификатов многих систем. Для успешного функционирования проекта выданные сертификаты с самого начала должны были доверяться как можно большему количеству систем "из коробки", без дополнительных действий от пользователей.

Чтобы избежать этой проблемы, для сертификатов Let's Encrypt использовали цепочку доверия, ведущую к корневому сертификату DST Root CA X3, который признается большинством систем.

При следующем обновлении WordPress эта ошибка исчезнет, но если вам нужно решение уже сейчас или вы не планируете обновлять WordPress, читайте далее.

## Решение проблемы: cURL error 60: SSL сертификат истек

Необходимо обновить содержимое файла /wp-includes/certificates/ca-bundle.crt. Вам нужно заменить его на содержание файла по адресу https://curl.se/ca/cacert.pem.

Изменение этого системного файла допустимо, так как при следующем обновлении WordPress проблема исчезнет.

### Как это сделать вручную

1. Скачайте файл по ссылке [cacert.pem](https://curl.se/ca/cacert.pem).
2. Обновите содержимое файла /wp-includes/certificates/ca-bundle.crt с использованием содержимого скачанного файла.
3. Готово! Всё должно теперь работать как прежде.

### Или используйте следующий код для выполнения э��ой операции программно

Использование кода удобно, если у вас есть возможность запускать его из административной панели, например, с помощью плагина [Code Snippets](https://ru.wordpress.org/plugins/code-snippets/).

1. Добавьте следующий код в файл functions.php вашей темы (или в плагин Code Snippets):

```php
/**
 * Перейдите по адресу http://yoursite.com/?update-wp-ca-bundle
 */
if( isset( $_GET['update-wp-ca-bundle'] ) ){

    $crt_file = ABSPATH . WPINC . '/certificates/ca-bundle.crt';
    $new_crt_url = 'http://curl.haxx.se/ca/cacert.pem';

    if( is_writable( $crt_file ) ){
        $new_str = file_get_contents( $new_crt_url );

        if( $new_str && strpos( $new_str, 'Bundle of CA Root Certificates' ) ){
            $up = file_put_contents( $crt_file, $new_str );

            echo $up ? 'OK: ca-bundle.crt обновлен' : 'ERROR: не удалось записать данные в ca-bundle.crt';
        }
        else {
            echo 'ERROR: не удалось скачать curl.haxx.se/ca/cacert.pem';
        }
    }
    else {
        echo 'ERROR: ca-bundle.crt не доступен для записи';
    }

    exit;
}
  1. Перейдите на страницу http://YOURSITE.com/?update-wp-ca-bundle.
    Замените YOURSITE.com на ваш домен.

  2. Готово! Всё должно теперь работать как прежде.

  3. Удалите этот код (он больше не нужен).

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *