Jak zrobić samopodpisany certyfikat dla hosta lokalnego?

23

Zrobiłem to z hasłem i z następującymi polami jako root

openssl req -x509 -days 365 -newkey rsa:2048 -keyout /etc/ssl/apache.key \
    -out /etc/ssl/apache.crt

Pola

Country: FI
State: Pirkanmaa
Locality: Tampere
Organization: masi
Organizational Unit Name: SSL Certificate Test
CommonName: 192.168.1.107/owncloud
EmailAddress: [email protected]

Dane wyjściowe: błąd uzgadniania SSL w HTTPS. Oczekiwany wynik: połączenie HTTPS. HTTP działa.

CommonName powinien zawierać adres URL, do którego chcesz się udać, wątek owncloud tutaj . Próbowałem bez powodzenia pod wspólną nazwą

  • 192.168.1.107/owncloud
  • 192.168.1.107/

Testuj system operacyjny dla serwera: Debian 8.5.
Serwer: Raspberry Pi 3b. Owncloud-server: 8.2.5. Owncloud-client: 2.1.1. Klient-system: Debian 8.5.

Léo Léopold Hertz 준영
źródło
Jeśli szukasz sposobu na wygenerowanie nowego certyfikatu SSL przy użyciu SAN dla localhost, kroki w tym poście działały dla mnie Centos 7 / Vagrant / Chrome Browser.
Damodar Bashyal,
@DamodarBashyal Proszę nie podawać tylko linku odpowiedzi, ale także opis jako odpowiedź.
Léo Léopold Hertz

Odpowiedzi:

11

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 wgeti 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.confi przekazywany do polecenia OpenSSL przez -config example-com.conf.


Również pamiętać, dobrze : wszystkie maszyny twierdzą, że są localhost, localhost.localdomainitp 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 localhostsą: (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 curli wgetnie 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.pmto 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        = [email protected]

# 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
Społeczność
źródło
Czy możesz dodać domyślną ścieżkę do pliku konfiguracyjnego? - - Czy możesz pokazać pełny przepływ pracy? O przekazywaniu pliku do komendy openssl itp. - - Nie udało mi się z poprzednią odpowiedzią, więc wszystkie potrzebne informacje są doceniane.
Léo Léopold Hertz -
@Masi - „Czy możesz dodać domyślną ścieżkę do pliku konfiguracyjnego?” - Nie wiem co masz na myśli. Możesz go zapisać gdziekolwiek chcesz. Uruchamiam go z komputera na wielu komputerach, a mój katalog domowy na innych. Zauważyłem, że wykorzystałeś sudo. Być może twój .rndplik jest własnością root. Jeśli tak, spróbuj sudo chown -R masi:masi /home/masi. Wtedy będziesz mógł z niego czytać i pisać.
Teraz używam tylko Debiana, a nie Ubuntu, więc tylko root. Dodaj przepływ pracy jako przykład dotyczący przechowywania pliku na pulpicie i przekazywania dalej. Nie mam jasnego obrazu systemu.
Léo Léopold Hertz -
1
Uruchom jedno z poleceń wymienionych na początku pliku. Komentarze są dostępne do kopiowania / wklejania. Wybierz ten, który Ci odpowiada. Jeśli nadal próbujesz wygenerować samopodpisany, uruchom w nim polecenie x509(tak jak mówi komentarz).
Autor poprosił o usunięcie tego postu „z powodu zmian CA / B”, ale ze względu na liczbę głosów i potencjalną pomoc, jaką zapewnia on przez lata, przywróciłem go. Przyjmij radę zawartą w poście w takiej postaci, w jakiej została udzielona.
Jeff Schaller
1

CommonNamePowinna odpowiadać co jest wysyłane jako Host: nagłówka żądania HTTP. W twoim przypadku byłoby to 192.168.1.107 (bez końcowego ukośnika).

Skonfiguruj nazwę hosta dla serwera WWW

Osobiście skonfigurowałbym przyjazną nazwę hosta dla serwera WWW. W swojej konfiguracji serwera Apache lub konfiguracji hosta wirtualnego (prawdopodobnie w /etc/apache2/sites-enabled/000-default.confprzypadku dystrybucji opartych na Debianie), użyj dyrektywy ServerNamelub ServerAlias, np.

ServerName owncloud.masi

Zrestartuj Apache, a następnie skonfiguruj DNS lub (prościej) dodaj wpis w każdym kliencie, /etc/hostsaby wskazał prawidłowy adres IP, np.

192.168.1.107   owncloud.masi
Anthony G - sprawiedliwość dla Moniki
źródło
Mój własny dostęp do chmury jest pod adresem 192.168.1.107. Drugi wątek mówi, że powinieneś dołączyć subdomenę. Myślę, że to implikuje 192.168.1.107/owncloud. Mogę się jednak mylić.
Léo Léopold Hertz
Załóżmy, że używasz ServerName owncloud.masiw .../sites-enabled/000-default.conf. Czy nazwa pospolita klucza SSL to owncloud.masi ?
Léo Léopold Hertz
Czy adres IP przestanie działać? Podobnie jeśli używasz ServerAlias?
Léo Léopold Hertz -
1
Dostęp przez adres IP powinien nadal działać dla HTTP. BTW, osiągnęliśmy limit komentarzy (więc usunąłem moje poprzednie odpowiedzi na twoje pytania) i wkrótce będę musiał przejść do trybu offline.
Anthony G - sprawiedliwość dla Moniki
1
„Nazwa pospolita powinna być zgodna z tym, co jest wysyłane jako nagłówek Host: w żądaniu HTTP” - Źle. Umieszczenie nazwy hosta to nazwa pospolita jest przestarzała zarówno na forach IETF, jak i CA / B. Nazwy serwerów i adresy IP zawsze znajdują się w alternatywnej nazwie podmiotu na forach IETF i CA / B. Zobacz także Jak podpisać wniosek o podpisanie certyfikatu w urzędzie certyfikacji i Jak utworzyć samopodpisany certyfikat za pomocą openssl?