LINUX.ORG.RU

Сгенерить ключ в openssl и вообще в этом разобраться

 


2

1

Не очень понимаю момент, связанный с криптографией, уже кучу статей прочитал, но что в меня это не входит.
Что такое ключи шифрования понятно. Есть алгоритмы симметричного шифрования: AES, DES. Есть ассиметричное шифрование, алгоритмы RSA, DSA где используется ключевая пара: закрытым ключём шифруем, открытым дешифруем.
Что такое ЭЦП менее понятно. Вроде как берём файл, вычисляем его хэш, шифруем хэш закрытым ключём и добавляем данные о владельце. Так или не так?
И почти не понятно что такое сертификат. Это вроде как файл, содержащий и ключ, и ЭЦП, и данные о владельце? Для создания сертификата открытого ключа ведь нужно как минимум две ключевые пары: сам открытый ключ, закрытый ключ в пару к нему, закрытый ключ CA, которым будет создаваться ЭЦП и открытый ключ CA, чтоб можно было сверять подпись. Так или не так? А что значит самоподписной сертификат? Это при создании его одна ключевая пара используется как две, и для ключа и для CA одновременно? Вот командой openssl req можно создавать самоподписные сертификаты одной командой, но ведь эта команда работает как три команды, какие именно?
Вобщем я с этими комадами openssl уже мозг сломал. Подскажите проще как создать ключи CA, файл списка отзыва сертификатов, а также сертификат, подписанный этим CA, алгоритм - RSA, битность - 2048 и чтоб при создавании он пароль не спрашивал.



Последнее исправление: Isur (всего исправлений: 1)

Возьми easy-rsa и не парься

anonymous
()

Подскажите проще как создать ключи CA, файл списка отзыва сертификатов, а также сертификат, подписанный этим CA, алгоритм - RSA, битность - 2048 и чтоб при создавании он пароль не спрашивал.

Зачем?

anonymous
()

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

Т.е. Сертификат - это ОткКлюч1 + Подпись_ОткКлюча1_сделанная_ЗакКлючом2 + информация о владельцах Ключа1 и Ключа2 + ОткКлюч2.

Самоподписанный Сертификат - это когда Ключ2 = Ключ1.

OpenSSL, насколько я знаю, позволяет работать с сертификатами, причём в разных форматах (их кучу понаплодили).

Кстати, сертификат может содержать не одну ЭЦП, а много (хоть 10), в этом случае будут прилагаться все ОткКлюч2...ОткКлюч11, ну и инфа о всех 11ти владельцах.

Лично я считаю сертификаты говном. Они - порождение централизованных тоталитарных систем с, так называемыми, «удостоверяющими центрами» (УЦ). Вместо них нужно использовать децентрализованные сети доверия:
https://ru.wikipedia.org/wiki/WOT:_Web_of_Trust
https://habrahabr.ru/post/245111/

Novator ★★★★★
()
Последнее исправление: Novator (всего исправлений: 2)

Что касается шифрования, то для ассиметричных алгоритмов используется два способа:

1) шифруем на ОткКлюч, чел расшифровывает на ЗакКлюч,
используется для передачи шифротекста владельцу зак. ключа:

encrypted_cifer = key.public_encrypt(cifer)
cifer = key.private_decrypt(encrypted_cifer)

2) шифруем на ЗакКлюч, чел расшифровывает на ОткКлюч,
используется для создания ЭЦП, чтоб другие могли проверить:

encrypted_hash = key.private_encrypt(hash)
hash = key.public_decrypt(encrypted_hash)

Первый способ обычно используется для шифровки симметричного ключа (например, AES). Второй способ используется внутри функции key.sign(), тебе напрямую private_encrypt() не надо вызывать.

P.S. Можешь глянуть как я использую OpenSSL:
https://github.com/Novator/Pandora/blob/master/lib/crypto.rb

Novator ★★★★★
()
Последнее исправление: Novator (всего исправлений: 1)
Ответ на: комментарий от Novator

Лор, что ты делаешь?
Я спросил совета по OpenSSL - мне вместо этого посоветовали какие-то XCA, какие-то сети довери и какой-то код на ruby.

Isur
() автор топика

Что такое ЭЦП менее понятно. Вроде как берём файл, вычисляем его хэш, шифруем хэш закрытым ключём и добавляем данные о владельце. Так или не так?

Только зашифрованный хэш, информация о владельце мимо

И почти не понятно что такое сертификат. Это вроде как файл, содержащий и ключ, и ЭЦП, и данные о владельце? Для создания сертификата открытого ключа ведь нужно как минимум две ключевые пары: сам открытый ключ, закрытый ключ в пару к нему, закрытый ключ CA, которым будет создаваться ЭЦП и открытый ключ CA, чтоб можно было сверять подпись. Так или не так?

Так

А что значит самоподписной сертификат? Это при создании его одна ключевая пара используется как две, и для ключа и для CA одновременно?

Именно так

Harald ★★★★★
()
Ответ на: комментарий от Isur

А при чем здесь «код на руби»?
Ты думаешь работа с OpenSSL различается на разных языках?

Novator ★★★★★
()
Ответ на: комментарий от Isur

Читай маны по командам «openssl genrsa», «openssl req», «openssl x509», «openssl ca»

Я каждый раз перечитываю при необходимости, в голове не держится :)

Harald ★★★★★
()

Так или не так? А что значит самоподписной сертификат? Это при создании его одна ключевая пара используется как две, и для ключа и для CA одновременно?

На русском несколько непонятно, но название self-signed само несет в себе ответ. CSR подписывается с тем же приватным ключом «Сам себя» короче.
Если ты создаешь свой CA, и будешь подписывать им, то это уже не будет считаться самоподписанным сертификатом. Другое дело что в trust store, тебя конечно никто не добавит, но это уже совсем другая история. И да создавать rsa сертификаты, по крайней мере для backend'ов уже не актуально.
Проще наверно с easyrsa.
Окей лови почти пасту, количество дней и странные названия ключей, специально выбраны, чтобы ты так просто не копипастил.

#Создаешь CA:
openssl genrsa -aes256 -out yourawesomeCA.key 4096
openssl req -x509 -new -nodes -key yourawesomeCA.key -out yourawesomeCA.pem -days 3650

#RSA (серьезно 2048?, ну окей):
openssl genrsa -aes256 -out secretlorclub.key 2048
openssl req -new -key secretlorclub.key -out secretlorclub.csr
cp secretlorclub.key secretlorclub.key.org; openssl rsa -in secretlorclub.key.org -out secretlorclub.key
Подписываешь:
openssl x509 -req -days 666 -in secretlorclub.csr -CA yourawesomeCA.pem -CAkey yourawesomeCA.key -set_serial yourawesomeserial -out secretlorclub.crt

#ECDSA:
openssl ecparam -genkey -name secp384r1 | openssl ec -out secretlorclubecdsa.key -aes256
openssl req -new -sha256 -key secretlorclubecdsa.key -out secretlorclubecdsa.csr -config fastuser.cnf
cp secretlorclubecdsa.key secretlorclubecdsa.key.org; openssl ec -in secretlorclubecdsa.key.org -out secretlorclubecdsa.key
Подписываешь:
openssl x509 -req -days 666 -in secretlorclubecdsa.csr -CA yourawesomeCA.pem -CAkey yourawesomeCA.key -set_serial yourawesomeserial -out secretlorclubecdsa.crt

#Без паролей:
#RSA:
openssl genrsa > secretlorclub.key 2048
#ECDSA:
openssl ecparam -genkey -name secp384r1 > secretlorclubecdsa.key
Revoke, OCSP:
http://withagrainofsalt.co.uk/2013/07/21/creating-a-ca-using-openssl-with-ocsp/

anonymous_sama ★★★★★
()
Ответ на: комментарий от anonymous_sama

Не понимаю почему команда genrsa на выходе выдаёт один ключ. Ведь алгоритм RSA предполагает пару ключей

Isur
() автор топика
Ответ на: комментарий от Isur

Для юзера схема простая:
приватный ключ - CSR -> CA подписывает CSR и ты получаешь сертификат. А там ты уже устанавливаешь и раскладываешь ключ и сертификат (как правило в форме base64 DER или DER ), причем иногда даже в одном файле, в зависимости от софта. Подробней можешь почитать, поискав X.509, также можешь посмотреть содержание сертификата с openssl x509 -in crtname -noout -text
Файл с сертификатом уже содержит в том числе и публичный ключ в себе.

anonymous_sama ★★★★★
()
Ответ на: комментарий от anonymous_sama

Файл с сертификатом уже содержит в том числе и публичный ключ в себе.

Ну вот я выполнил генерацию ключей без шифрования aes256 - сгенерился файл с таким содержимым:

-----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY-----
Приватный ключ есть. А где идущий с ним в паре публичный ключ искать?

Isur
() автор топика
Ответ на: комментарий от Isur

Далее CSR, так-то пусть кто-то другой объяснит или читай дальше, если тебе до сих пор не ясно. И не забудь ключ сменить, приватными ключами так просто не разбрасываются.

anonymous_sama ★★★★★
()
Ответ на: комментарий от anonymous_sama

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

Isur
() автор топика
Ответ на: комментарий от Isur

А вообще я основы криптографии как бы в ВУЗе изучал.

Isur
() автор топика
Ответ на: комментарий от Novator

Т.е. Сертификат - это ОткКлюч1 + Подпись_ОткКлюча1_сделанная_ЗакКлючом2 + информация о владельцах Ключа1 и Ключа2 + ОткКлюч2.

Это - сертификат открытого ключа. А бывают вроде ещё сертификаты закрытого ключа. Они для чего нужны?

Isur
() автор топика
Ответ на: комментарий от Isur

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

Давать удостоверянту закрый ключ (а без него ЭЦП/сертификат не сделать) глупо и бессмысленно - доступ к закрытому ключу должен иметь только владелец ключевой пары.

Более того, в аппаратных криптожелезках даже владелец ключевой пары не имеет доступа к своему закрытому ключу (криптоплата показывает только открытый ключ). И это самый лучший вариант при использовании криптографии:
http://www.opennet.ru/opennews/art.shtml?num=44823

Novator ★★★★★
()
Последнее исправление: Novator (всего исправлений: 2)
Ответ на: комментарий от Harald

Всё разобрался. Попробовал сгенерить ключ с опцией -text и увидел, в файле несколько бинарных элементов. Открытый ключ содержится в закрытом, а командой pkey его можно оттуда вычленить:

openssl genpkey -outform PEM -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out mykey.pem
openssl pkey -inform PEM -in mykey.pem -pubout -out mykey_pub.pem

Isur
() автор топика
Ответ на: комментарий от Novator

Нашёл инфу.
Сертификаты открытого ключа - это формат X.509
Сертификаты закрытого ключа - это формат PKCS#12

Isur
() автор топика
Ответ на: комментарий от Novator

Вместо них нужно использовать децентрализованные сети доверия
https://ru.wikipedia.org/wiki/WOT:_Web_of_Trust
В результате расследования журналистов немецкой общественной телерадиовещательной компании NDR выяснилось, что сервис Web of Trust продавал собранные данные о своих пользователях сторонним лицам. C 4 ноября 2016 года расширение заблокировано Google и Mozilla после появления этой информации.

Ссылка так себе =)

FedyaPryanichkov ★★
()
Ответ на: комментарий от anonymous_sama

Неделю уже мозгую данную тему, развеял несколько своих заблуждений. Например то, что файл закрытого ключа в формате PEM может содержать также открытый ключ. Есть ещё одим момент, который также кажется мне нелогичным, о нём позже.
У меня не получается подписать открытый ключ для пользователя User1 закрытым ключём удостоверяющего центра CA.
Что я делаю:
Я написал конфиг для создания самоподписного сертификата CA CA.cnf:

[ req ]
default_bits = 2048
distinguished_name = req_dn
x509_extensions = v3_ca

[ req_dn ]
commonName = Имя пользователя
commonName_default = CA

[ v3_ca ]
basicConstraints = CA:true
Генерю закрытый ключ CA и самоподписной сертификат CA:
openssl genrsa -rand /dev/urandom -out CA_key_priv.pem 2048
openssl req -new -x509 -key CA_key_priv.pem -config CA.cnf -days 3650 -out CA_cert.pem
Потом пишу конфиг для создания запроса на сертификат пользователя req.cnf:
[ req ]
default_bits = 2048
distinguished_name = req_dn
x509_extensions = v3_ca

[ req_dn ]
commonName = Имя пользователя
commonName_default = User

[ v3_ca ]
basicConstraints = CA:false
И генерю закрытый ключ пользователя, открытый ключ и запрос на подпись сертификата открытого ключа:
openssl genrsa -rand /dev/urandom -out user_key_priv.pem
openssl pkey -in user_key_priv.pem -pubout -out user_key_pub.pem
openssl req -new -key user_key_priv.pem -config req.cnf -out user_req.pem
Вот тут как раз и нелогичный момент. Если сертификат открытого ключа - это открытый ключ + данные о владельце + ЭЦП + данные о подписанте, то запрос на подпись - это открытый ключ + данные о владельце, так? Стало быть для создания файла запроса мне нужно было скормить openssl не закрытый ключ user_key_priv.pem, а открытый user_key_pub.pem. Но в этом случае я получаю ошибку.
Дальше я пытаюсь подписать сертификат и тут получаю фейл:
$ openssl x509 -req -in user_req.pem -CA CA_cert.pem -CAkey CA_key_priv.pem -days 3650 -out user_cert.pem
Signature ok
subject=/CN=User
Getting CA Private Key
CA_cert.srl: No such file or directory
139653248415648:error:02001002:system library:fopen:No such file or directory:bss_file.c:398:fopen('CA_cert.srl','r')
139653248415648:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:400:
Что за CA_cert.srl он хочет и что я вообще не так делаю?

Isur
() автор топика

Я тут запарился для настройки kubernetes с этим, вот тебе Makefile который делает это.

В кратце все довольно просто - у тебя есть сертификат некоторого Authority - это сертификат которому ты просто доверяешь. Конечно для того, что бы этим сертификатом оперировать, нужен ключ. Поэтому сначала ты генерируешь ключ, потом сертификат, согласно этому ключу. Алгоритмы щас не очень важны, я саму суть объясняю.

У тебя теперь есть Authority, сертификат которому ты доверяешь. Теперь тебе нужно сделать сертификат, которому будут доверять все, кто доверяет этому Authority. Делается это через цифровую подпись.

То есть ты генерируешь новый ключ, согласно ему генерируешь сертификат и потом используешь Authority твою, что бы подписать новый сертификат. То есть этому сертификату будут доверять все, кто доверяет твоей Authority, без дополнительных вопросов. Этот сертификат ты используешь для своего сервера какого-нибудь. Ессно dns имя/IP сервака должны совпадать с указанными в сертификате. Можно указывать много имен - у меня в Makefile это используется.

Ты еще можешь сгенерировать промежуточные Authority основываясь на корневой.

Ну и дальше пошли всякие расширения - есть исключительно серверные сертификаты, есть сертификаты клиентские, есть комбинированные когда все в одном. Опять же, генерировать все эти ключи и подписывать можно разные алгоритмами, но на суть процесса это влияет мало (ну кроме того, что какой-нибудь устаревший алгоритм скомпроментировать могут). Потом openssl может сгенерировать тебе такую штуку когда сертификат и приватный ключ все вместе упаковано - у меня в Makefile такой момент тоже есть.

Надеюсь все это хоть немного поможет.

Крутая ссылка по теме

Makefile:

ROOT_DIR = $(shell pwd)

CA_DIR = ca
CA_DB = index.db
CA_SERIAL = serial

ETCD_DIR = etcd
KUBEAPI_DIR = api-server
KUBEAPI_CLIENT_DIR = api-client
FLANNEL_DIR = flannel
USER_DIR = user
SCHEDULER_DIR = scheduler
CONTROLLER_DIR = controller

OPENSSL_CFG_FILE = /tmp/openssl.cfg

define OPENSSL_CFG
[ca]
default_ca = CA_default

[CA_default]
dir = $(ROOT_DIR)/$(CA_DIR)
database = $$dir/$(CA_DB)
private_key = $$dir/key.pem
certificate = $$dir/crt.pem
new_certs_dir = $$dir
default_md = sha256
policy = policy_strict
serial = $$dir/$(CA_SERIAL)

[ policy_strict ]
# The root CA should only sign intermediate certificates that match.
# See the POLICY FORMAT section of `man ca`.
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName  = optional
commonName = supplied
emailAddress = optional

[req]
default_bits = 4096
distinguished_name = req_distinguished_name
string_mask = utf8only

default_md = sha256
x509_extensions = v3_ca
req_extensions = v3_req

[req_distinguished_name]
countryName = AU
stateOrProvinceName = New South Wales
localityName = Sydney
0.organizationName = N/A
organizationUnitName = N/A
commonName = MyApp Cluster
emailAddress = aner@fastmail.com

countryName_default = AU
stateOrProvinceName_default = New South Wales
localityName_default = Sydney
0.organizationName_default = N/A
organizationUnitName_default = N/A
commonName_default = MyApp Cluster
emailAddress_default = aner@fastmail.com

[v3_ca]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = critical, CA:true
keyUsage = critical, digitalSignature, cRLSign, keyCertSign

[v3_req]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = master.local
DNS.2 = master.myapp
DNS.3 = api.myapp
DNS.4 = scheduler.myapp
DNS.5 = controller.myapp
DNS.6 = etcd.myapp
IP.1 = 10.0.0.1

[ v3_intermediate_ca ]
# Extensions for a typical intermediate CA (`man x509v3_config`).
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = critical, CA:true, pathlen:0
keyUsage = critical, digitalSignature, cRLSign, keyCertSign

[ usr_cert ]
# Extensions for client certificates (`man x509v3_config`).
basicConstraints = CA:FALSE
nsCertType = client, email
nsComment = "OpenSSL Generated Client Certificate"
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = clientAuth, emailProtection

[ server_cert ]
# Extensions for server certificates (`man x509v3_config`).
basicConstraints = CA:FALSE
nsCertType = server
nsComment = "OpenSSL Generated Server Certificate"
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer:always
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

endef

define gen-key
	openssl genrsa \
		-out key.pem \
		4096
endef

define gen-csr
	openssl req \
		-new \
		-key  key.pem \
		-out csr.pem \
		-config $(OPENSSL_CFG_FILE)
endef

define sign-csr
	openssl ca  \
		-extensions $(1) \
		-days 10000 \
		-notext \
		-cert ../$(CA_DIR)/crt.pem \
		-keyfile ../$(CA_DIR)/key.pem \
		-in csr.pem \
		-out crt.pem \
		-config $(OPENSSL_CFG_FILE)
endef

define gen-crt
	@mkdir -p $(1)
	cd $(1) && \
	$(call gen-key) && \
	$(call gen-csr) && \
	$(call sign-csr,$(2))
endef

define gen-srv-crt
	$(call gen-crt,$(1),server_cert)
endef

define gen-usr-crt
	$(call gen-crt,$(1),usr_cert)
endef


define msg
	@echo "---------- $(1) ----------"
endef

clean:
	@ls | grep -v Makefile | xargs rm -rf

all: etcd kubeapi user flannel scheduler

controller: create-ca-crt
	@$(call gen-usr-crt,$(CONTROLLER_DIR))

scheduler: create-ca-crt
	@$(call gen-usr-crt,$(SCHEDULER_DIR))

flannel: create-ca-crt
	$(call msg,FLANNEL CERTIFICATE)
	@$(call gen-usr-crt,$(FLANNEL_DIR))

user: create-ca-crt
	$(call msg,USER CERTIFICATE)
	@$(call gen-usr-crt,$(USER_DIR))
	@openssl pkcs12 \
		-export \
		-out $(USER_DIR)/user.pfx \
		-inkey $(USER_DIR)/key.pem \
		-in $(USER_DIR)/crt.pem

kubeapi: create-ca-crt
	$(call msg,API SERVER CERTIFICATE)
	@$(call gen-srv-crt,$(KUBEAPI_DIR))
	$(call msg,API SERVER CLIENT CERTIFICATE)
	@$(call gen-usr-crt,$(KUBEAPI_CLIENT_DIR))

etcd: create-ca-crt
	$(call msg,ETCD CERTIFICATE)
	@$(call gen-srv-crt,$(ETCD_DIR))

create-ca-crt: prepare-openssl-cfg create-ca-key create-ca-dir
	$(call msg,ROOT CERTIFICATE)
	@cd $(CA_DIR) && \
	openssl req \
		-x509 \
		-new \
		-nodes \
		-key key.pem \
		-days 10000 \
		-out crt.pem \
		-config $(OPENSSL_CFG_FILE)

create-ca-key:  create-ca-dir
	@cd $(CA_DIR) && \
		$(call gen-key)
	
create-ca-dir:
	@mkdir -p $(CA_DIR) && \
		touch $(CA_DIR)/$(CA_DB) && \
		touch $(CA_DIR)/$(CA_SERIAL) && \
		echo 1000 > $(CA_DIR)/$(CA_SERIAL) 


prepare-openssl-cfg: export OPENSSL_CFG_CONTENT:=$(OPENSSL_CFG)
prepare-openssl-cfg:
	@echo "$${OPENSSL_CFG_CONTENT}" > $(OPENSSL_CFG_FILE)


DiKeert ★★
()
Последнее исправление: DiKeert (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.