openssl rex -x509 -days 365 -newkey rsa: 2048 -keyout /etc/ssl/apache.key -out /etc/ssl/apache.crt
Tego polecenia nie można użyć do wygenerowania poprawnie sformułowanego certyfikatu X.509. Zostanie zniekształcony, ponieważ nazwa hosta znajduje się we wspólnej nazwie (CN) . Umieszczenie nazwy hosta lub adresu IP w CN jest nieaktualne zarówno przez IETF (większość narzędzi, takich jak wget
i curl
) , jak i fora CA / B (CA i przeglądarki).
Zgodnie zarówno z forami IETF, jak i CA / B nazwy serwerów i adresy IP zawsze znajdują się w alternatywnej nazwie podmiotu (SAN) . Aby zapoznać się z regułami, zobacz RFC 5280, Internetowy klucz infrastruktury certyfikatu X.509 i profil listy odwołania certyfikatów (CRL) oraz wymagania linii bazowej forum CA / przeglądarki .
Najczęściej potrzebujesz użyć pliku konfiguracyjnego OpenSSL i dostosować go do swoich potrzeb. Poniżej znajduje się przykład jednego, którego używam. Jest wywoływany example-com.conf
i przekazywany do polecenia OpenSSL przez -config example-com.conf
.
Również pamiętać, dobrze : wszystkie maszyny twierdzą, że są localhost
, localhost.localdomain
itp Bądź ostrożny o wydawanie świadectw dla localhost
. Ja nie mówiąc nie rób tego; po prostu zrozum, że wiąże się to z pewnym ryzykiem.
Alternatywami localhost
są: (1) uruchomienie DNS i wydawanie certyfikatów na nazwę DNS urządzenia. Lub (2) użyj statycznego adresu IP i dołącz statyczny adres IP.
Przeglądarki nadal ostrzegają o certyfikacie z podpisem własnym, który nie łączy się z zaufanym katalogiem głównym. Narzędzia takie jak curl
i wget
nie będą narzekać, ale nadal musisz zaufać swojemu własnemu podpisowi z opcją taką jak cURL --cafile
. Aby rozwiązać problem z zaufaniem przeglądarki, musisz stać się własnym urzędem certyfikacji.
„Stawanie się własnym urzędem certyfikacji” jest znane jako prowadzenie prywatnej infrastruktury PKI. Nie ma tego wiele. Możesz zrobić wszystko, co może zrobić publiczny urząd certyfikacji. Jedyną rzeczą jest inny trzeba będzie zainstalować swój głównego urzędu certyfikacji certyfikat w różnych sklepach. Nie różni się niczym od, powiedzmy, używania cURL cacerts.pm
. cacerts.pm
to tylko kolekcja Root CA's, a teraz dołączyłeś do klubu.
Jeśli zostaniesz własnym urzędem certyfikacji, pamiętaj o spaleniu klucza prywatnego głównego urzędu certyfikacji na dysku i pozostawieniu go w trybie offline. Następnie włóż go do napędu CD / DVD, aby podpisać prośbę o podpisanie. Teraz wydajesz certyfikaty tak jak publiczny urząd certyfikacji.
Nic nie jest strasznie trudne po podpisaniu jednego lub dwóch żądań podpisania. Od lat prowadzę prywatną PKI w domu. Wszystkie moje urządzenia i gadżety ufają mojemu urzędowi certyfikacji.
Aby uzyskać więcej informacji o tym, jak zostać własnym urzędem certyfikacji, zobacz Jak podpisać wniosek o podpisanie certyfikatu w urzędzie certyfikacji i Jak utworzyć samopodpisany certyfikat za pomocą openssl? .
Z komentarzy w pliku konfiguracyjnym poniżej ...
Samopodpisany (zwróć uwagę na dodanie -x509)
openssl req -config example-com.conf -new -x509 -sha256 -newkey rsa:2048 -nodes -keyout example-com.key.pem -days 365 -out example-com.cert.pem
Żądanie podpisania (zauważ brak -x509)
openssl req -config example-com.conf -new -newkey rsa:2048 -nodes -keyout example-com.key.pem -days 365 -out example-com.req.pem
Wydrukuj własny podpis
openssl x509 -in example-com.cert.pem -text -noout
Wydrukuj prośbę o podpisanie
openssl req -in example-com.req.pem -text -noout
Plik konfiguracyjny
# Self Signed (note the addition of -x509):
# openssl req -config example-com.conf -new -x509 -sha256 -newkey rsa:2048 -nodes -keyout example-com.key.pem -days 365 -out example-com.cert.pem
# Signing Request (note the lack of -x509):
# openssl req -config example-com.conf -new -newkey rsa:2048 -nodes -keyout example-com.key.pem -days 365 -out example-com.req.pem
# Print it:
# openssl x509 -in example-com.cert.pem -text -noout
# openssl req -in example-com.req.pem -text -noout
[ req ]
default_bits = 2048
default_keyfile = server-key.pem
distinguished_name = subject
req_extensions = req_ext
x509_extensions = x509_ext
string_mask = utf8only
# The Subject DN can be formed using X501 or RFC 4514 (see RFC 4519 for a description).
# It's sort of a mashup. For example, RFC 4514 does not provide emailAddress.
[ subject ]
countryName = Country Name (2 letter code)
countryName_default = US
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = NY
localityName = Locality Name (eg, city)
localityName_default = New York
organizationName = Organization Name (eg, company)
organizationName_default = Example, LLC
# Use a friendly name here because it's presented to the user. The server's DNS
# names are placed in Subject Alternate Names. Plus, DNS names here is deprecated
# by both IETF and CA/Browser Forums. If you place a DNS name here, then you
# must include the DNS name in the SAN too (otherwise, Chrome and others that
# strictly follow the CA/Browser Baseline Requirements will fail).
commonName = Common Name (e.g. server FQDN or YOUR name)
commonName_default = Example Company
emailAddress = Email Address
emailAddress_default = test@example.com
# Section x509_ext is used when generating a self-signed certificate. I.e., openssl req -x509 ...
[ x509_ext ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
# If RSA Key Transport bothers you, then remove keyEncipherment. TLS 1.3 is removing RSA
# Key Transport in favor of exchanges with Forward Secrecy, like DHE and ECDHE.
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
subjectAltName = @alternate_names
nsComment = "OpenSSL Generated Certificate"
# RFC 5280, Section 4.2.1.12 makes EKU optional
# CA/Browser Baseline Requirements, Appendix (B)(3)(G) makes me confused
# extendedKeyUsage = serverAuth, clientAuth
# Section req_ext is used when generating a certificate signing request. I.e., openssl req ...
[ req_ext ]
subjectKeyIdentifier = hash
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
subjectAltName = @alternate_names
nsComment = "OpenSSL Generated Certificate"
# RFC 5280, Section 4.2.1.12 makes EKU optional
# CA/Browser Baseline Requirements, Appendix (B)(3)(G) makes me confused
# extendedKeyUsage = serverAuth, clientAuth
[ alternate_names ]
DNS.1 = example.com
DNS.2 = www.example.com
DNS.3 = mail.example.com
DNS.4 = ftp.example.com
# Add these if you need them. But usually you don't want them or
# need them in production. You may need them for development.
# DNS.5 = localhost
# DNS.6 = localhost.localdomain
# DNS.7 = 127.0.0.1
# IPv6 localhost
# DNS.8 = ::1
# DNS.9 = fe80::1
W przypadku Chrome może być konieczne wykonanie następujących czynności. W przeciwnym razie Chrome może narzekać, że nazwa pospolita jest nieprawidłowa ( ERR_CERT_COMMON_NAME_INVALID
) . W tym przypadku nie jestem pewien, jaki jest związek między adresem IP w sieci SAN a CN.
# IPv4 localhost
# IP.1 = 127.0.0.1
# IPv6 localhost
# IP.2 = ::1
Centos 7 / Vagrant / Chrome Browser
.