Czy coś brakuje? Czy to właściwy sposób na zbudowanie certyfikatu z podpisem własnym?
Łatwo jest utworzyć samopodpisany certyfikat. Wystarczy użyć openssl req
polecenia. Stworzenie takiego, które może być wykorzystywane przez największy wybór klientów, takich jak przeglądarki i narzędzia wiersza poleceń, może być trudne.
Jest to trudne, ponieważ przeglądarki mają własny zestaw wymagań i są bardziej restrykcyjne niż IETF . Wymagania stosowane przez przeglądarki są dokumentowane na forach CA / Browser (patrz odnośniki poniżej). Ograniczenia występują w dwóch kluczowych obszarach: (1) kotwice zaufania i (2) nazwy DNS.
Nowoczesne przeglądarki (takie jak Warez, którego używamy w 2014/2015 r.) Chcą certyfikatu, który łączy się z kotwicą zaufania, i chcą, aby nazwy DNS były prezentowane w określony sposób w certyfikacie. Przeglądarki aktywnie działają na podstawie certyfikatów serwerów z podpisem własnym.
Niektóre przeglądarki nie ułatwiają importu certyfikatu serwera z podpisem własnym. W rzeczywistości nie można tego zrobić za pomocą niektórych przeglądarek, takich jak przeglądarka Androida. Zatem kompletnym rozwiązaniem jest stać się własnym autorytetem.
W przypadku braku stania się własnym autorytetem, musisz poprawnie ustawić nazwy DNS, aby dać certyfikatowi największą szansę na sukces. Ale zachęcam cię, abyś stał się swoim własnym autorytetem. Łatwo jest stać się własnym autorytetem i ominie on wszystkie problemy związane z zaufaniem (komu lepiej zaufać niż tobie?).
Prawdopodobnie nie jest to strona, której szukasz!
Certyfikat bezpieczeństwa tej witryny nie jest zaufany!
Wynika to z faktu, że przeglądarki używają wstępnie zdefiniowanej listy kotwic zaufania do sprawdzania poprawności certyfikatów serwerów. Samopodpisany certyfikat nie łączy się z zaufaną kotwicą.
Najlepszym sposobem na uniknięcie tego jest:
- Utwórz własny organ (tj. Zostań urzędem certyfikacji )
- Utwórz żądanie podpisania certyfikatu (CSR) dla serwera
- Podpisz CSR serwera za pomocą klucza CA
- Zainstaluj certyfikat serwera na serwerze
- Zainstaluj certyfikat CA na kliencie
Krok 1 - Utworzenie własnego urzędu oznacza po prostu utworzenie certyfikatu z podpisem własnym CA: true
i właściwego użycia klucza. Oznacza to, że przedmiotowe a Emitent jest ten sam podmiot, CA ma wartość true w podstawowe ograniczenia (to powinno być również oznaczona jako krytyczna), klucz wykorzystywany jest keyCertSign
i crlSign
(jeśli używasz CRL) i Subject Key Identifier (SKI) jest taki sam jak identyfikator klucza urzędu (AKI).
Aby stać się własnym urzędem certyfikacji, zobacz * W jaki sposób podpisujesz wniosek o podpisanie certyfikatu w swoim urzędzie certyfikacji? na przepełnienie stosu. Następnie zaimportuj swój CA do Trust Store używanego przez przeglądarkę.
Kroki 2–4 są mniej więcej tym, co robisz teraz dla publicznego serwera, gdy rejestrujesz usługi urzędu certyfikacji, takiego jak Startcom lub CAcert . Kroki 1 i 5 pozwalają uniknąć autorytetu osoby trzeciej i działać jako własny autorytet (komu lepiej zaufać niż tobie?).
Następnym najlepszym sposobem uniknięcia ostrzeżenia przeglądarki jest zaufanie do certyfikatu serwera. Ale niektóre przeglądarki, takie jak domyślna przeglądarka Androida, nie pozwalają na to. Więc nigdy nie będzie działać na platformie.
Problem przeglądarek (i innych podobnych aplikacji klienckich) nie ufających certyfikatom z podpisem własnym będzie dużym problemem w Internecie przedmiotów (IoT). Na przykład, co się stanie po podłączeniu do termostatu lub lodówki w celu zaprogramowania? Odpowiedź brzmi: nic dobrego, jeśli chodzi o wrażenia użytkownika.
Grupa robocza WebAppSec W3C zaczyna przyglądać się temu problemowi. Zobacz na przykład Propozycja: Oznaczanie HTTP jako niezabezpieczonego .
Jak utworzyć samopodpisany certyfikat za pomocą OpenSSL
Poniższe polecenia i plik konfiguracyjny tworzą samopodpisany certyfikat (pokazuje również, jak utworzyć żądanie podpisania). Różnią się one od innych odpowiedzi pod jednym względem: nazwy DNS używane dla certyfikatu z podpisem własnym znajdują się w alternatywnej nazwie podmiotu (SAN) , a nie w nazwie zwykłej (CN) .
Nazwy DNS są umieszczane w sieci SAN poprzez plik konfiguracyjny z linią subjectAltName = @alternate_names
(nie ma sposobu, aby to zrobić za pomocą wiersza poleceń). Następnie alternate_names
w pliku konfiguracyjnym znajduje się sekcja (należy ją dostosować do własnych upodobań):
[ 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
# IP.1 = 127.0.0.1
# IP.2 = ::1
Ważne jest, aby umieścić nazwę DNS w sieci SAN, a nie w CN, ponieważ zarówno IETF, jak i fora CA / Browser określają tę praktykę. Określają również, że nazwy DNS w CN są przestarzałe (ale nie zabronione). Jeśli umieścisz nazwę DNS w CN, musi ona zostać uwzględniona w sieci SAN zgodnie z zasadami CA / B. Nie możesz więc uniknąć używania alternatywnej nazwy podmiotu.
Jeśli nie umieścisz nazw DNS w sieci SAN, certyfikat nie będzie sprawdzany pod kątem przeglądarki i innych programów użytkownika zgodnych z wytycznymi CA / Browser Forum.
Powiązane: przeglądarki przestrzegają zasad CA / Browser Forum; a nie zasady IETF. Jest to jeden z powodów, dla których certyfikat utworzony za pomocą OpenSSL (który zwykle jest zgodny z IETF) czasami nie sprawdza się w przeglądarce (przeglądarki stosują się do CA / B). Są to różne standardy, mają różne zasady wydawania i różne wymagania dotyczące walidacji.
Utwórz samopodpisany certyfikat (zauważ dodanie -x509
opcji):
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
Utwórz prośbę o podpisanie (zauważ brak -x509
opcji):
openssl req -config example-com.conf -new -sha256 -newkey rsa:2048 -nodes \
-keyout example-com.key.pem -days 365 -out example-com.req.pem
Wydrukuj certyfikat z podpisem własnym :
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 (przekazany przez -config
opcję)
[ 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).
# Its 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
# You only need digitalSignature below. *If* you don't allow
# RSA Key transport (i.e., you use ephemeral cipher suites), then
# omit keyEncipherment because that's key transport.
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
# In either case, you probably only need serverAuth.
# 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
# In either case, you probably only need serverAuth.
# 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
W przypadku Chrome może być konieczne wykonanie następujących czynności. W przeciwnym razie Chrome może złożyć skargę, ż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
Istnieją inne zasady dotyczące obsługi nazw DNS w certyfikatach X.509 / PKIX. Zasady znajdują się w tych dokumentach:
RFC 6797 i RFC 7469 są wymienione, ponieważ są bardziej restrykcyjne niż inne dokumenty RFC i CA / B. RFC 6797 i 7469 również nie pozwalają na adres IP.