Шифрование в MySQL: хранилище ключей / Блог компании OTUS. Онлайн-образование / Хабр

Шифрование в MySQL: хранилище ключей / Блог компании OTUS. Онлайн-образование / Хабр Электронная цифровая подпись

Ios: как создать серверное хранилище pkcs12 (p12) из ​​секретного ключа и x509 сертификата в приложении программно? – authentication |

Этот вопрос был, по-видимому, схожим, но не имел никаких ответов: Программно создать сертификат x509 для iPhone без использования OpenSSL

В нашем приложении (сервере, клиенте) мы реализуем аутентификацию клиента (SSL на основе X509Certificate). У нас уже есть способ сгенерировать keypair, создать PKCS10 Certificate Signing Request, подписаться на self-signed CA и создать X509Certificate, отправить это обратно. Однако, чтобы использовать этот сертификат в запросах SSL, private key и X509Certificate должны быть экспортированы в PKCS12 (P12) keystore.

Кто-нибудь знает что-нибудь о том, как это сделать, или даже если это возможно? Клиент имеет для создания файла P12 (мы не хотим выдавать закрытый ключ), а клиент работает под управлением iOS и является мобильным устройством. Решение работало на Android с помощью BouncyCastle (SpongyCastle), но мы ничего не нашли для iOS.

EDIT: в Java этот экспорт выполняется следующим образом:

    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    KeyStore ks = KeyStore.getInstance("PKCS12", BouncyCastleProvider.PROVIDER_NAME);
    ks.load(null);
    ks.setKeyEntry("key-alias", (Key) key, password.toCharArray(),
            new java.security.cert.Certificate[] { x509Certificate });
    ks.store(bos, password.toCharArray());
    bos.close();
    return bos.toByteArray();

Mysql keyring

Keyring — это плагины, которые позволяют серверу запрашивать, создавать и удалять ключи в локальном файле (keyring_file) или на удаленном сервере (например, в HashiCorp Vault). Ключи всегда кэшируются локально, чтобы ускорить их получение.

Плагины можно разделить на две категории:

  • Локальное хранилище. Например, локальный файл (мы называем это файловым хранилищем ключей, file-based keyring).
  • Удаленное хранилище. Например Vault Server (мы называем это серверным хранилищем ключей, server-based keyring).


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

Извлечение открытого / закрытого ключа из файла pkcs12 для последующего использования в ssh-pk-аутентификации

OpenSSH не может использовать файлы PKCS#12 из коробки. Как предлагали другие, вы должны извлечь закрытый ключ в формате PEM, который доставит вас из земли OpenSSL в OpenSSH. Другие решения, упомянутые здесь, не работают для меня. Я использую OS X 10.9 Mavericks (10.9.3 на данный момент) с “расфасованными” утилитами (OpenSSL 0.9.8 y, OpenSSH 6.2p2).

Читайте также:  Подписание документов PDF в Adobe Acrobat Reader.

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

openssl pkcs12 -in filename.p12 -clcerts -nodes -nocerts | openssl rsa > ~/.ssh/id_rsa

я настоятельно рекомендую зашифровать закрытый ключ с паролем:

openssl pkcs12 -in filename.p12 -clcerts -nodes -nocerts | openssl rsa -passout 'pass:Passw0rd!' > ~/.ssh/id_rsa

очевидно, что писать простой текстовый пароль в командной строке тоже небезопасно, поэтому вы должны удалить последнюю команду из истории или просто сделать так, чтобы она туда не попала. Разные оболочки имеют разные способы. Вы можете префикс вашей команды с пространством, чтобы предотвратить его сохранение в историю в Bash и многих других оболочках. Вот также, Как удалить команду из истории в Bash:

history -d $(history | tail -n 2 | awk 'NR == 1 { print  }')

кроме того, вы можете использовать различные способ передачи пароля закрытого ключа OpenSSL-consult документация OpenSSL для Аргументов фразы пароля.

затем создайте открытый ключ OpenSSH, который можно добавить в файл authorized_keys:

ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub

Импорт закрытого ключа в jks-хранилище

Для работы с ключами/сертификатами в java активно использую keytool: просто, понятно и “всегда под рукой”.

Но иногда случается так, что на руках оказывается пара “закрытый ключ сертификат”, которую надо импортировать в

jks

:

Certificate.cer
Private.key

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

Потребуется

openssl

. Сначала
сделаем из нашего ключа и сертификата пару в формате

PKCS12

:

D:cert_>openssl pkcs12 -export -in Certificate.cer -inkey
Private.key -certfile Certificate.cer -name “alias_” -out keystore.p12
D:cert_rapida>openssl pkcs12 -export -in Certificate.cer -inkey Private.key -name “alias_” -out keystore.p12
Loading ‘screen’ into random state – done

Enter pass phrase for Certificate.key: //secret – это пароль на ключ
Enter Export Password: //secret – Пароль на новое хранилище
Verifying – Enter Export Password: //secret – Пароль на новое хранилище

В результате появится новое хранилище keystore.p12. И именно его уже можно импортировать в jks-формат с помощью keytool.

D:cert_>keytool -importkeystore -srckeystore keystore.p12
-srcstoretype pkcs12 -destkeystore rapida-ks.jks -deststoretype JKS

Enter destination keystore password: //secret – Пароль на новое хранилище
Re-enter new password: //secret – Пароль на новое хранилище
Enter source keystore password: //secret – Пароль на исходное хранилище
Entry for alias my certificate successfully imported.
Import command completed:  1 entries successfully imported, 0 entries failed or cancelled

Теперь есть keystore, с которым можно работать в java-приложениях.

D:cert_rapidatest>keytool -list -keystore ks.jks
Enter keystore password: //secret
Keystore type: JKS
Keystore provider: SUN
Your keystore contains 1 entry
alias_, Nov 22, 2020, PrivateKeyEntry,
Certificate fingerprint (SHA1): 80:CD:5F:4D:E2:49:C0:CA:9C:78:CE:E8:FC:E2:40:9E:BC:E4:A1:F5

Читайте также:  КриптоПро | КриптоПро ЭЦП - Использование

Готово!

Копирование с помощью криптопро csp

     1. Выбрать Пуск / Панель Управления / КриптоПро CSP.

     2. Перейти на вкладку Сервис и кликнуть по кнопке Скопировать контейнер. 

     3. В окне «Копирование контейнера закрытого ключа» нажмите на кнопку «Обзор».

     4. Выберите контейнер, который необходимо скопировать, и кликните по кнопке «Ок», затем «Далее». 

     5. Если вы копируете с защищённого ключевого носителя, то появится окно ввода, в котором следует указать pin-код. 

     6. Если вы не меняли pin-код на носителе, стандартный pin-код необходимо вводить соответственно его типу:

Rutoken – стандартный pin-код 12345678eToken /JaCarta  – 1234567890

     7. В следующем окне необходимо ввести имя Вашей копии. Придумайте и укажите вручную имя для нового контейнера. В названии контейнера допускается русская раскладка и пробелы. Затем кликните «Готово».

     8. В окне «Выбор ключевого носителя» выберите носитель, на который будет помещен новый контейнер.

9. На новый контейнер будет предложено установить пароль. Рекомендуем установить такой пароль, чтобы вам было легко его запомнить, но посторонние не могли его угадать или подобрать. Если вы не хотите устанавливать пароль, можно оставить поле пустым и нажать «ОК».

В случае утери пароля/pin-кода использование контейнера станет невозможным.

     10. Если вы копируете контейнер на смарт-карту ruToken/eToken /JaCarta, окно запроса будет выглядеть так: 

     11. В окне ввода укажите pin-код. Если вы не меняли pin-код на носителе, стандартный pin-код 

Rutoken – 12345678eToken /JaCarta  – 1234567890

     12. После копирования система вернется на вкладку «Сервис» КриптоПро CSP. Копирование завершено. 

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

     14. В меню Пуск выберите пункт «КРИПТО-ПРО», запустите приложение «КриптоПро CSP»

     15. Перейдите на вкладку «Сервис» и нажмите кнопку «Просмотреть сертификаты в контейнере»:

     16. В следующем окне нажмите кнопку Обзор, чтобы выбрать контейнер для просмотра (в нашем примере контейнер находится в Реестре):

     17. После выбора контейнера нажмите кнопку Ок, затем Далее

     18. Если после нажатия на кнопку Далее Вы видите такое сообщение:

     19. «В контейнере закрытого ключа отсутствует открытый ключ шифрования», следует установить сертификат по рекомендациям, описанным в разделе «Установка через меню «Установить личный сертификат».

     20. В окне Сертификат для просмотра нажмите кнопку Установить:

     21. Если откроется сообщение «Этот сертификат уже присутствует в хранилище сертификатов. Заменить существующий сертификат новым, с проставленной ссылкой на закрытый ключ?», нажмите Да:

Читайте также:  Регистрация и работа в ЕИС и ЕРУЗ — Удостоверяющий центр СКБ Контур

     22. Дождитесь сообщения об успешной установке:

     23. Сертификат установлен. Можно закрыть все открытые окна КриптоПро.

Установка через меню «установить личный сертификат».

     1. Для установки сертификата этим способом Вам понадобится файл сертификата (файл с расширением.cer). 

     2. В меню Пуск выберите пункт «КРИПТО-ПРО», запустите приложение «КриптоПро CSP»

     3. Перейдите на вкладку «Сервис» и нажмите кнопку «Установить личный сертификат»:

     4. В следующем окне нажмите кнопку Обзор, чтобы выбрать файл сертификата. Укажите путь к файлу сертификата и нажмите кнопку Открыть (в нашем примере файл сертификата находится на Рабочем столе):

     5. В следующем окне нажмите кнопку Далее; в окне Сертификат для установки нажмите Далее.

     6. Поставьте галку в окне Найти контейнер автоматически (в нашем примере контейнер находится в Реестре компьютера) и нажмите Далее:

     7. В следующем окне отметьте пункт Установить сертификат (цепочку сертификатов) в контейнер и нажмите Далее:

     8. В окне Завершение мастера установки личного сертификата нажмите Готово.

     9. Если КриптоПро CSP запрашивает pin-код от контейнера, введите нужный код или попробуйте стандартные pin-коды носителей:

Rutoken – 12345678eToken /JaCarta  – 1234567890

     10. Если откроется сообщение «Этот сертификат уже присутствует в хранилище сертификатов. Заменить существующий сертификат новым, с проставленной ссылкой на закрытый ключ?», нажмите Да:

     11. Сертификат установлен. Можно закрыть все открытые окна КриптоПро.

Остались вопросы? 

Экспорт закрытого ключа (rsa private key) из пакета сертификата с закрытым ключом pkcs12 (*.p12)

Для того, чтобы заставить работать Apache 2 по SSL-протоколу, сервису необходимо предоставить: сертификат для веб-сайта, закрытый ключ для этого сертификата (RSA Private Key) и сертификат центра сертификации, которым это все было выдано.

Наши безопасники выдали мне p12-файл сертификата с закрытым ключом, который был защищен паролем. Как из p12-файла получить RSA-ключ?

Берем openssl.exe и выполняем команды:

openssl pkcs12 -in www.website.com.p12 -nocerts -out www.website.com.key.pem -nodes
openssl pkcs12 -in www.website.com.p12 -nokeys -out www.website.com.cert.pem -nodes
openssl rsa -in www.website.com.key.pem -out www.website.com.key.txt.pem -text

В итоге на выходе вы получите три файла, в одном из них будет блок ключа в границах

-----BEGIN RSA PRIVATE KEY-----
.....
-----END RSA PRIVATE KEY-----

Берем этот весь блок, включая begin и end, и копируем в текстовый файл.

Все, это и есть нужный нам ключ.

Оцените статью
ЭЦП Эксперт
Добавить комментарий