Я помещаю сертификаты в репозиторий, который не позволяет последующий сертификат с более ограниченным использованием, чем предыдущий. Мне нужен исходный фиктивный сертификат / ключ / цепочка для начальной загрузки процесса, использование которого не более открыто, чем сертификаты хоста Let's Encrypt, которые разрешают serverAuth и clientAuth. Все, что мне нужно, это фиктивный сертификат хоста, который имеет эти или меньшие значения. Однако я не смог создать это из-за множества итераций команд после прочтения множества статей и сообщений SO вчера и сегодня.
Вот с чем я работаю:
gen.sh
#!/bin/bash -e
rm dummy*
days=100
openssl genrsa -out dummy-root.key 2048
openssl req -new -x509 -days $days -subj '/C=US/ST=TX/O=foo/OU=bar/CN=dummy-root.com' -key dummy-root.key -out dummy-root.crt
openssl genrsa -out dummy-class2.key 2048
openssl req -new -subj '/C=US/ST=TX/O=foo/OU=bar/CN=dummy-class2.com' -key dummy-class2.key -out dummy-class2.csr
openssl x509 -req -days $days -in dummy-class2.csr -CA dummy-root.crt -CAkey dummy-root.key -CAcreateserial -out dummy-class2.crt
openssl genrsa -out dummy-host.key 2048
openssl req -new -config gen.host.cfg -key dummy-host.key -out dummy-host.csr -extensions my_server_exts
openssl x509 -req -days $days -in dummy-host.csr -CA dummy-class2.crt -CAkey dummy-class2.key -set_serial 1 -out dummy-host.crt -sha256 -ext subjAltName
rm *.srl *.csr
cat dummy-host.crt dummy-class2.crt dummy-root.crt > dummy-chain.crt
# this always fails?
# openssl verify --CAfile dummy-root.crt -untrusted dummy-class2.crt dummy-host.crt
openssl x509 -noout -ext extendedKeyUsage < dummy-host.crt
И для файла конфигурации, необходимого для расширений (упомянутых выше):
gen.host.cfg
[ req ]
prompt = no
default_bits = 2048
default_md = sha256
distinguished_name = my_dn
req_extensions = my_server_exts
[ my_dn ]
# The bare minimum is probably a commonName
commonName = dummy-host2.com
countryName = US
organizationName = foo
organizationalUnitName = bar
[ my_server_exts ]
basicConstraints = critical,CA:false
keyUsage = keyEncipherment
# extendedKeyUsage = serverAuth
extendedKeyUsage = 1.3.6.1.5.5.7.3.1
Последняя строка gen.sh пытается прочитать расширения и всегда говорит «Нет расширений в сертификате», который при отправке в репозиторий сертификатов интерпретируется как «ЛЮБОЕ» использование, а затем отказывается уменьшить использование при обновлении с помощью Lets Encrypt сертификат
Почему указанные мной EKU не попадают в сертификат? Или как еще я могу создать сертификат, который имеет ограниченное использование?
К вашим сертификатам добавляются только расширения корневого ЦС, поскольку вы используете файл конфигурации по умолчанию. в x509
вызовы команд, которые вы не предоставляете -extfile
и -extensions
параметры командной строки.
Чтобы иметь больше контроля над добавленными расширениями, вам, вероятно, следует явно указать расширения для каждого сертификата в вашем файле конфигурации, добавьте keyUsage
расширение для сертификатов CA и subjectKeyIdentifier
и authorityKeyIdentifier
всем им:
[ req ]
default_bits = 2048
default_md = sha256
distinguished_name = dn
[ dn ]
# -subj used instead
[ root_exts ]
basicConstraints = critical,CA:true
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer
keyUsage = keyCertSign, cRLSign
[ intermediate_exts ]
# Can not sign other CA certificates
basicConstraints = critical,CA:true,pathlen:0
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer
keyUsage = keyCertSign, cRLSign
[ server_exts ]
basicConstraints = critical,CA:false
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
keyUsage = keyEncipherment
extendedKeyUsage = serverAuth
subjectAltName = DNS:dummy-host.com
и вызовите все команды создания сертификатов с -extfile
или -config
вариант, в зависимости от того, что подходит:
#!/bin/bash
set -e
days=100
openssl genrsa -out dummy-root.key 2048
openssl req -x509 -key dummy-root.key -out dummy-root.crt -days $days \
-subj '/C=US/ST=TX/O=foo/OU=bar/CN=dummy-root.com' \
-config gen.host.cfg -extensions root_exts
openssl genrsa -out dummy-class2.key 2048
openssl req -new -key dummy-class2.key -out dummy-class2.csr \
-subj '/C=US/ST=TX/O=foo/OU=bar/CN=dummy-class2.com'
openssl x509 -req -in dummy-class2.csr -out dummy-class2.crt -days $days \
-CAkey dummy-root.key -CA dummy-root.crt -CAcreateserial \
-extfile gen.host.cfg -extensions intermediate_exts
openssl genrsa -out dummy-host.key 2048
openssl req -new -key dummy-host.key -out dummy-host.csr \
-subj '/C=US/ST=TX/O=foo/OU=bar/CN=dummy-host.com'
openssl x509 -req -in dummy-host.csr -out dummy-host.crt -days $days \
-CAkey dummy-class2.key -CA dummy-class2.crt -CAcreateserial \
-extfile gen.host.cfg -extensions server_exts
rm *.csr
cat dummy-{host,class2,root}.crt > dummy-chain.crt
openssl verify -CAfile dummy-root.crt -untrusted dummy-class2.crt dummy-host.crt
openssl x509 -noout -ext extendedKeyUsage -in dummy-host.crt