Как создать самозаверяющий сертификат без парольной фразы с помощью OpenSSL

В этом руководстве мы рассмотрим различные методы создания самозаверяющего сертификата SSL/TLS с использованием OpenSSL без необходимости ввода парольной фразы. Мы предоставим примеры кода для каждого метода, чтобы вам было легче следовать им. Итак, начнем!

Метод 1: создание самозаверяющего сертификата без парольной фразы с использованием командной строки OpenSSL
OpenSSL предоставляет интерфейс командной строки, который позволяет создавать самозаверяющий сертификат без парольной фразы. Используйте следующую команду:

openssl req -x509 -newkey rsa:2048 -keyout server.key -out server.crt -days 365 -nodes

Объяснение:

  • req: указывает на создание запроса на подпись сертификата (CSR).
  • -x509: указывает, что должен быть создан самозаверяющий сертификат.
  • -newkey rsa:2048: генерирует новый закрытый ключ RSA длиной 2048 бит.
  • -keyout server.key: указывает выходной файл для закрытого ключа.
  • -out server.crt: указывает выходной файл для самозаверяющего сертификата.
  • -days 365: устанавливает срок действия сертификата на 365 дней.
  • -nodes: удаляет парольную фразу из закрытого ключа.

Метод 2: создание самозаверяющего сертификата без парольной фразы с использованием файла конфигурации OpenSSL
Другой подход — использовать файл конфигурации OpenSSL для создания самозаверяющего сертификата без парольной фразы. Вот пример файла конфигурации:

# openssl.cnf
[req]
prompt = no
encrypt_key = no
default_md = sha256
distinguished_name = dn
[dn]
CN = YourCommonName

Чтобы сгенерировать сертификат, используйте следующую команду:

openssl req -x509 -newkey rsa:2048 -config openssl.cnf -keyout server.key -out server.crt -days 365 -nodes

Объяснение:

  • Файл конфигурации (openssl.cnf) определяет общее имя (CN) сертификата в разделе [dn].
  • -config openssl.cnf: предписывает OpenSSL использовать файл конфигурации.

Метод 3. Создание самозаверяющего сертификата без парольной фразы с использованием OpenSSL с API библиотеки OpenSSL
Если вы предпочитаете использовать API библиотеки OpenSSL в своем собственном коде, вот пример на C:

#include <openssl/x509.h>
#include <openssl/pem.h>
int main() {
    X509 *cert;
    EVP_PKEY *key;
    X509_NAME *name;
    FILE *fp;
    // Generate a new RSA key
    key = EVP_PKEY_new();
    RSA *rsa = RSA_generate_key(2048, RSA_F4, NULL, NULL);
    EVP_PKEY_assign_RSA(key, rsa);
    // Create a new certificate
    cert = X509_new();
    X509_set_version(cert, 2);
    X509_set_pubkey(cert, key);
    // Set the certificate's validity period
    X509_gmtime_adj(X509_get_notBefore(cert), 0);
    X509_gmtime_adj(X509_get_notAfter(cert), 31536000L); // 1 year
    // Set the certificate's subject name
    name = X509_get_subject_name(cert);
    X509_NAME_add_entry_by_txt(name, "CN", MBSTRING_ASC,
                               (unsigned char *)"YourCommonName", -1, -1, 0);
    // Sign the certificate with the private key
    X509_sign(cert, key, EVP_sha256());
    // Write the certificate to a file
    fp = fopen("server.crt", "wb");
    PEM_write_X509(fp, cert);
    fclose(fp);
    // Write the private key to a file
    fp = fopen("server.key", "wb");
    PEM_write_PrivateKey(fp, key, NULL, NULL, 0, NULL, NULL);
    fclose(fp);
    // Clean up
    X509_free(cert);
    EVP_PKEY_free(key);
    return 0;
}

Объяснение:

  • Этот код генерирует новый ключ RSA, создает сертификат, устанавливает срок его действия и подписывает его закрытым ключом.
  • Сертификат и закрытый ключ затем записываются в отдельные файлы (server.crtи server.keyсоответственно).