Сертификат шифрования AES128-GCM-SHA256 с использованием openssl [duplicate]

Вместо того, чтобы бросать код на вас, есть два понятия, которые являются ключом к пониманию того, как JS обрабатывает обратные вызовы и асинхронность. (это даже слово?)

Модель цикла события и параллелизма

Есть три вещи, о которых вам нужно знать; Очередь; цикл события и стек

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

while (queue.waitForMessage()) {
   queue.processNextMessage();
}

Как только он получает сообщение для запуска чего-то, он добавляет его в очередь. Очередь - это список вещей, которые ждут выполнения (например, ваш запрос AJAX). Представьте себе это так:

 1. call foo.com/api/bar using foobarFunc
 2. Go perform an infinite loop
 ... and so on

Когда одно из этих сообщений будет исполнено, оно выталкивает сообщение из очереди и создает стек, стек - это все, что нужно выполнить JS для выполнения инструкции в сообщение. Таким образом, в нашем примере ему говорят позвонить foobarFunc

function foobarFunc (var) {
  console.log(anotherFunction(var));
}

. Так что все, что foobarFunc должно выполнить (в нашем случае anotherFunction), будет вставлено в стек. исполняемый, а затем забытый - цикл события затем переместится на следующую вещь в очереди (или прослушивает сообщения)

. Главное здесь - порядок выполнения. Это

КОГДА что-то будет запущено

Когда вы совершаете вызов с использованием AJAX для внешней стороны или выполняете любой асинхронный код (например, setTimeout), Javascript зависит от ответ, прежде чем он сможет продолжить.

Большой вопрос, когда он получит ответ? Ответ в том, что мы не знаем, поэтому цикл событий ждет, когда это сообщение скажет: «Эй, забери меня». Если JS просто ждал этого сообщения синхронно, ваше приложение замерзнет, ​​и оно сосать. Таким образом, JS продолжает выполнение следующего элемента в очереди, ожидая, пока сообщение не будет добавлено обратно в очередь.

Вот почему с асинхронной функциональностью мы используем вещи, называемые обратными вызовами. Это похоже на обещание буквально. Как и в I , обещание что-то вернуть в какой-то момент jQuery использует специальные обратные вызовы, называемые deffered.done deffered.fail и deffered.always (среди других). Вы можете увидеть их все здесь

Итак, вам нужно передать функцию, которая в какой-то момент будет выполнена с переданными ей данными.

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

function foo(bla) {
  console.log(bla)
}

, поэтому большую часть времени (но не всегда) вы пройдете foo не foo()

. Надеюсь, это будет иметь смысл. Когда вы сталкиваетесь с такими вещами, которые кажутся запутанными, я настоятельно рекомендую полностью прочитать документацию, чтобы хотя бы понять ее. Это сделает вас намного лучшим разработчиком.

866
задан jww 13 January 2015 в 21:38
поделиться

12 ответов

Вы можете сделать это с помощью одной команды:

openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365

Вы также можете добавить -nodes, если вы не хотите защищать свой закрытый ключ парольной фразой, иначе он предложит вам " как минимум 4 символа ". Параметр days (365) можно заменить любым числом, чтобы повлиять на дату истечения срока действия. Затем он предложит вам такие вещи, как «Имя страны», но вы можете просто нажать «Ввести» и принять значения по умолчанию.

Добавить -subj '/CN=localhost', чтобы подавить вопросы о содержимом сертификата (замените localhost на желаемый domain)

Самозаверяющие сертификаты не проверяются третьим лицом, если вы ранее не импортировали их в браузер. Если вам нужна дополнительная безопасность, вы должны использовать сертификат, подписанный CA.

1511
ответ дан TPAKTOPA 1 September 2018 в 07:06
поделиться

Сгенерировать ключи

Я использую /etc/mysql для хранения сертификатов, потому что /etc/apparmor.d/usr.sbin.mysqld содержит /etc/mysql/*.pem r.

sudo su -
cd /etc/mysql
openssl genrsa -out ca-key.pem 2048;
openssl req -new -x509 -nodes -days 1000 -key ca-key.pem -out ca-cert.pem;
openssl req -newkey rsa:2048 -days 1000 -nodes -keyout server-key.pem -out server-req.pem;
openssl x509 -req -in server-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem;
openssl req -newkey rsa:2048 -days 1000 -nodes -keyout client-key.pem -out client-req.pem;
openssl x509 -req -in client-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem;

Добавить конфигурацию

/etc/mysql/my.cnf

[client]
ssl-ca=/etc/mysql/ca-cert.pem
ssl-cert=/etc/mysql/client-cert.pem
ssl-key=/etc/mysql/client-key.pem

[mysqld]
ssl-ca=/etc/mysql/ca-cert.pem
ssl-cert=/etc/mysql/server-cert.pem
ssl-key=/etc/mysql/server-key.pem

В моей настройке сервер ubuntu зарегистрировался на: /var/log/mysql/error.log

Последующие примечания:

  • SSL error: Unable to get certificate from '...' Mysql может быть отказано в доступе к чтению вашего файла сертификата, если он не находится в apparmors config . Как упоминалось в предыдущих шагах ^, сохраните все наши сертификаты в виде .pem файлов в каталоге /etc/mysql/, которые по умолчанию одобрены apparmor (или измените ваш apparmor / SELinux, чтобы разрешить доступ туда, где вы их сохранили.)
  • SSL error: Unable to get private key Версия вашего сервера mysql может не поддерживать формат по умолчанию rsa:2048. Covert сгенерировал rsa:2048 равным rsa с помощью:
    openssl rsa -in server-key.pem -out server-key.pem
    openssl rsa -in client-key.pem -out client-key.pem
    
  • Проверьте, поддерживает ли локальный сервер ssl :
    mysql -u root -p
    mysql> show variables like "%ssl%"; 
    +---------------+----------------------------+
    | Variable_name | Value                      |
    +---------------+----------------------------+
    | have_openssl  | YES                        |
    | have_ssl      | YES                        |
    | ssl_ca        | /etc/mysql/ca-cert.pem     |
    | ssl_capath    |                            |
    | ssl_cert      | /etc/mysql/server-cert.pem |
    | ssl_cipher    |                            |
    | ssl_key       | /etc/mysql/server-key.pem  |
    +---------------+----------------------------+
    
  • Проверка соединения с db зашифрована ssl :

    Проверка соединения

    При входе в экземпляр MySQL вы можете выполнить запрос:
    show status like 'Ssl_cipher'; 
    
    Если ваше соединение не зашифровано, результат будет пустым:
    mysql> show status like 'Ssl_cipher'; 
    +---------------+-------+ 
    | Variable_name | Value | 
    +---------------+-------+ 
    | Ssl_cipher    |       |  
    +---------------+-------+ 
    1 row in set (0.00 sec) 
    
    В противном случае он отобразит ненулевую строку длины для используемого cypher:
    mysql> show status like 'Ssl_cipher'; 
    +---------------+--------------------+ 
    | Variable_name | Value              | 
    +---------------+--------------------+ 
    | Ssl_cipher    | DHE-RSA-AES256-SHA |  
    +---------------+--------------------+ 
    1 row in set (0.00 sec) 
    
  • Требовать ssl для подключения конкретного пользователя ('require ssl'): SSL Сообщает серверу разрешать только SSL-зашифрованные подключения для учетной записи.
    GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
      REQUIRE SSL;
    
    Чтобы подключиться, клиент должен указать параметр -ssl-ca для проверки подлинности сертификата сервера и может дополнительно указать опции -ssl-key и -ssl-cert. Если не указан параметр --ssl-ca или опция -ssl-capath, клиент не проверяет подлинность сертификата сервера.

Альтернативная ссылка: Длительный учебник здесь http://www.madirish.net/214

2
ответ дан 2 revs 1 September 2018 в 07:06
поделиться

Вот варианты, описанные в @ diegows's answer , более подробно описанные в документации :

openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days XXX
req

Запрос сертификата PKCS № 10 и утилита создания сертификатов.

-x509

эта опция выводит самозаверяющий сертификат вместо запроса сертификата. Обычно это используется для создания тестового сертификата или собственного корневого ЦС.

-newkey arg

этот параметр создает новый запрос сертификата и новый закрытый ключ. Аргумент принимает одну из нескольких форм. rsa: nbits, где nbits - количество бит, генерирует nbits ключа RSA в размере.

-keyout filename

это дает имя файла для записи вновь созданного закрытого ключа.

-out filename

Указывает выходное имя файла для записи или стандартного вывода по умолчанию.

-days n

, когда используется опция -x509, указывается количество дней для сертификации сертификата. Значение по умолчанию - 30 дней.

-nodes

Если этот параметр указан, то если создается закрытый ключ, он не будет зашифрован.

Документация на самом деле больше подробно, чем выше, я просто подвел его здесь.

393
ответ дан Community 1 September 2018 в 07:06
поделиться

Это сценарий, который я использую в локальных блоках для установки SAN (subjectAltName) в самозаверяющих сертификатах.

Этот скрипт принимает имя домена (example.com) и генерирует SAN для * .example.com и example.com в том же сертификате. Прокомментированы следующие разделы. Назовите сценарий (например, generate-ssl.sh) и предоставите ему права на выполнение. Файлы будут записаны в тот же каталог, что и скрипт.

Для Chrome 58 и далее требуется, чтобы SAN устанавливался в самозаверяющих сертификатах.

#!/usr/bin/env bash

# Set the TLD domain we want to use
BASE_DOMAIN="example.com"

# Days for the cert to live
DAYS=1095

# A blank passphrase
PASSPHRASE=""

# Generated configuration file
CONFIG_FILE="config.txt"

cat > $CONFIG_FILE <<-EOF
[req]
default_bits = 2048
prompt = no
default_md = sha256
x509_extensions = v3_req
distinguished_name = dn

[dn]
C = CA
ST = BC
L = Vancouver
O = Example Corp
OU = Testing Domain
emailAddress = webmaster@$BASE_DOMAIN
CN = $BASE_DOMAIN

[v3_req]
subjectAltName = @alt_names

[alt_names]
DNS.1 = *.$BASE_DOMAIN
DNS.2 = $BASE_DOMAIN
EOF

# The file name can be anything
FILE_NAME="$BASE_DOMAIN"

# Remove previous keys
echo "Removing existing certs like $FILE_NAME.*"
chmod 770 $FILE_NAME.*
rm $FILE_NAME.*

echo "Generating certs for $BASE_DOMAIN"

# Generate our Private Key, CSR and Certificate
# Use SHA-2 as SHA-1 is unsupported from Jan 1, 2017

openssl req -new -x509 -newkey rsa:2048 -sha256 -nodes -keyout "$FILE_NAME.key" -days $DAYS -out "$FILE_NAME.crt" -passin pass:$PASSPHRASE -config "$CONFIG_FILE"

# OPTIONAL - write an info to see the details of the generated crt
openssl x509 -noout -fingerprint -text < "$FILE_NAME.crt" > "$FILE_NAME.info"

# Protect the key
chmod 400 "$FILE_NAME.key"

Этот скрипт также записывает info file, чтобы вы могли проверить новый сертификат и проверить правильность установки SAN.

                ...
                28:dd:b8:1e:34:b5:b1:44:1a:60:6d:e3:3c:5a:c4:
                da:3d
            Exponent: 65537 (0x10001)
    X509v3 extensions:
        X509v3 Subject Alternative Name: 
            DNS:*.example.com, DNS:example.com
Signature Algorithm: sha256WithRSAEncryption
     3b:35:5a:d6:9e:92:4f:fc:f4:f4:87:78:cd:c7:8d:cd:8c:cc:
     ...

Если вы используете Apache, вы можете ссылаться на вышеуказанный сертификат в вашем файле конфигурации следующим образом:

<VirtualHost _default_:443>
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/htdocs

    SSLEngine on
    SSLCertificateFile path/to/your/example.com.crt
    SSLCertificateKeyFile path/to/your/example.com.key
</VirtualHost>

Не забудьте перезапустить сервер Apache (или Nginx или IIS), чтобы новый сертификат вступил в силу.

11
ответ дан Drakes 1 September 2018 в 07:06
поделиться

2017 Один лайнер:

openssl req \
-newkey rsa:2048 \
-x509 \
-nodes \
-keyout server.pem \
-new \
-out server.pem \
-subj /CN=localhost \
-reqexts SAN \
-extensions SAN \
-config <(cat /System/Library/OpenSSL/openssl.cnf \
    <(printf '[SAN]\nsubjectAltName=DNS:localhost')) \
-sha256 \
-days 3650

Это также работает в Chrome 57, так как он предоставляет SAN без наличия другого файла конфигурации. Взято из ответа здесь . Это создает один файл .pem, который содержит как закрытый ключ, так и сертификат. Вы можете переместить их, чтобы отделить файлы .pem, если это необходимо.

8
ответ дан joemillervi 1 September 2018 в 07:06
поделиться

Я бы рекомендовал добавить параметр -sha256, чтобы использовать алгоритм хэша SHA-2, потому что основные браузеры рассматривают, чтобы показать «сертификаты SHA-1» как небезопасные.

То же командная строка из принятый ответ - @diegows с добавленным -sha256

openssl req -x509 -sha256 -newkey rsa: 2048 -keyout key.pem -out cert.pem -days XXX

Дополнительная информация в блоге безопасности Google .

Обновление до 2018 года. Как отмечалось в комментариях, использование SHA-2 не добавляет никакой безопасности для самоподписанного сертификата. Но я по-прежнему рекомендую использовать его как хорошую привычку не использовать устаревшие / небезопасные криптографические хэш-функции. Полное объяснение доступно в: https://security.stackexchange.com/questions/91913/why-is-it-fine-for-certificates-above-the-end-entity-certificate-to-be-sha1 -base

64
ответ дан Maris B. 1 September 2018 в 07:06
поделиться

У вас правильная процедура. Синтаксис команды ниже.

openssl req -new -key {private key file} -out {output file}

Однако предупреждения отображаются, потому что браузер не смог проверить идентификацию, подтвердив сертификат с помощью известного центра сертификации (CA).

Поскольку это самоподписанный сертификат, нет CA, и вы можете спокойно проигнорировать предупреждение и продолжить. Если вы хотите получить реальный сертификат, который будет распознан кем-либо в общедоступном Интернете, тогда процедура будет ниже.

  1. Сгенерировать закрытый ключ
  2. Использовать этот закрытый ключ для создать файл CSR
  3. Отправить CSR в CA (Verisign или другие и т. д.)
  4. Установить полученный сертификат из CA на веб-сервере
  5. Добавить другие сертификаты в цепочку аутентификации в зависимости от на типе cert

У меня есть более подробная информация об этом в сообщении в https://bigthinkingapplied.com/secure-the-connection-installing-certificates-on-3- общий веб-сервера /

5
ответ дан nneko 1 September 2018 в 07:06
поделиться

Один вкладыш FTW. Мне нравится держать его простым. Почему бы не использовать одну команду, содержащую ВСЕ необходимые аргументы? Вот как мне это нравится: это создает сертификат x509 и это PEM-ключ:

openssl req -x509 \
 -nodes -days 365 -newkey rsa:4096 \
 -keyout self.key.pem \
 -out self-x509.crt \
 -subj "/C=US/ST=WA/L=Seattle/CN=example.com/emailAddress=someEmail@gmail.com" 

Эта единственная команда содержит все ответы, которые вы обычно указали для деталей сертификата. Таким образом, вы можете установить параметры и запустить команду, получить свой результат - затем пойти на кофе.

>> подробнее здесь & lt; & lt;

4
ответ дан OkezieE 1 September 2018 в 07:06
поделиться

Я не могу комментировать, поэтому поместим это как отдельный ответ. Я нашел несколько проблем с принятым однострочным ответом:

  • В однострочный файл входит ключевая фраза в ключе.
  • В однострочном пространстве используется SHA1, который во многих браузеры вызывают предупреждения в консоли.

Вот упрощенная версия, которая удаляет кодовую фразу, повышает безопасность для подавления предупреждений и включает предложение в комментарии для передачи в -subj для удаления полного списка вопросов:

openssl genrsa -out server.key 2048
openssl rsa -in server.key -out server.key
openssl req -sha256 -new -key server.key -out server.csr -subj '/CN=localhost'
openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt

Заменить «localhost» на любой домен, который вам нужен. Вам нужно будет выполнить первые две команды один за другим, так как openssl предложит кодовую фразу.

Чтобы объединить два файла в файл .pem:

cat server.crt server.key > cert.pem
109
ответ дан simonwo 1 September 2018 в 07:06
поделиться

oneliner v2017:

centos:

openssl req -x509 -nodes -sha256 -newkey rsa:2048 \
-keyout localhost.key -out localhost.crt \
-days 3650 \
-subj "CN=localhost" \
-reqexts SAN -extensions SAN \
-config <(cat /etc/pki/tls/openssl.cnf <(printf "\n[SAN]\nsubjectAltName=IP:127.0.0.1,DNS:localhost"))

ubuntu:

openssl req -x509 -nodes -sha256 -newkey rsa:2048 \
-keyout localhost.key -out localhost.crt \
-days 3650 \
-subj "CN=localhost" \
-reqexts SAN -extensions SAN \
-config <(cat /etc/ssl/openssl.cnf <(printf "\n[SAN]\nsubjectAltName=IP:127.0.0.1,DNS:localhost"))
2
ответ дан user327843 1 September 2018 в 07:06
поделиться

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

Самый быстрый способ снова запустить - это короткая, стоящая -alone conf file:

  1. Создать конфигурационный файл OpenSSL (пример: req.cnf)
    [req]
    distinguished_name = req_distinguished_name
    x509_extensions = v3_req
    prompt = no
    [req_distinguished_name]
    C = US
    ST = VA
    L = SomeCity
    O = MyCompany
    OU = MyDivision
    CN = www.company.com
    [v3_req]
    keyUsage = critical, digitalSignature, keyAgreement
    extendedKeyUsage = serverAuth
    subjectAltName = @alt_names
    [alt_names]
    DNS.1 = www.company.com
    DNS.2 = company.com
    DNS.3 = company.net
    
  2. Создать сертификат, ссылающийся на этот файл конфигурации
    openssl req -x509 -nodes -days 730 -newkey rsa:2048 \
     -keyout cert.key -out cert.pem -config req.cnf -sha256
    

Пример config из https://support.citrix.com/article/CTX135602

56
ответ дан vcsjones 1 September 2018 в 07:06
поделиться

Следующая команда:

openssl req -x509 -newkey rsa:4096 -sha256 -nodes -keyout example.key -out example.crt -subj "/CN=example.com" -days 3650

создает сертификат для домена example.com, который

  • относительно силен (по состоянию на 2018 год) и
  • , действительный для 3650 дней (~ 10 лет).

Он создает следующие файлы:

  • Закрытый ключ: example.key
  • Сертификат: example.crt

Поскольку вся информация предоставляется в командной строке, нет раздражающего интерактивного ввода. Кроме того, все эти шаги выполняются одним единственным вызовом OpenSSL: от создания секретного ключа до самозаверяющего сертификата.

Поскольку сертификат самоподписан и должен быть принят пользователями вручную,

В будущем вам может понадобиться больше, чем 4096 бит для ключа RSA и алгоритм хеширования, более сильный, чем sha256, но с 2018 года это нормальные значения.

Примечание: Теоретически вы можете оставить параметр -nodes (что означает «отсутствие шифрования DES»), в какой случай example.key будет зашифрован паролем. Тем не менее, это почти никогда не бывает полезно для установки сервера, потому что вам нужно будет либо хранить пароль на сервере, либо вам придется вводить его вручную при каждой перезагрузке.

113
ответ дан vog 1 September 2018 в 07:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: