GNU/Linux >> Znalost Linux >  >> Linux

Apache – vytvoření *.local Ssl certifikátu?

Snažím se nastavit jeden certifikát SSL, který umožní, aby jakýkoli web *.local fungoval přes https. Mám všechny domény .local směřující zpět na můj místní počítač. Používám je při tvorbě webových stránek. Mnoho nových funkcí (geografická poloha, servisní pracovníci atd.) vyžaduje SSL.

Domnívám se, že pro nejnovější verze prohlížeče Chrome/Firefox již nefunguje starý certifikát s vlastním podpisem.

Níže jsou kroky, které jsem provedl po provedení kombinace těchto průvodců:
https://deliciousbrains.com/https-locally-without-browser-privacy-errors/

https://codeghar.wordpress.com/2008/03/17/create-a-certificate-authority-and-certificates-with-openssl/

https://stackoverflow.com/questions/27294589/creating-self-signed-certificate-for-domain-and-subdomains-neterr-cert-commo

Zde je můj konfigurační soubor:

#..................................
[ ca ]
default_ca = CA_default
[ CA_default ]
dir = /home/*****/Sites/root-ca
serial = $dir/serial
database = $dir/index.txt
new_certs_dir = $dir/certs
certificate = $dir/certs/cacert.pem
private_key = $dir/private/cakey.pem
default_days = 3000
default_md = sha256
preserve = no
email_in_dn = no
nameopt = default_ca
certopt = default_ca
policy = policy_match
copy_extensions = copyall
[ policy_match ]
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[ req ]
default_bits = 2048 # Size of keys
default_keyfile = key.pem # name of generated keys
default_md = md5 # message digest algorithm
string_mask = nombstr # permitted characters
distinguished_name = req_distinguished_name
req_extensions = v3_req
[ req_distinguished_name ]
# Variable name Prompt string
#------------------------- ----------------------------------
0.organizationName = Organization Name (company)
organizationalUnitName = Organizational Unit Name (department, division)
emailAddress = Email Address
emailAddress_max = 40
localityName = Locality Name (city, district)
stateOrProvinceName = State or Province Name (full name)
countryName = Country Name (2 letter code)
countryName_min = 2
countryName_max = 2
commonName = Common Name (hostname, IP, or your name)
commonName_max = 64
# Default values for the above, for consistency and less typing.
# Variable name Value
#------------------------ ------------------------------
0.organizationName_default = *****
localityName_default = *****
stateOrProvinceName_default = *****
countryName_default = *****
emailAddress_default = *****
[ v3_ca ]
basicConstraints = CA:TRUE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer:always
subjectAltName       = @alternate_names
[ v3_req ]
subjectKeyIdentifier = hash
basicConstraints     = CA:FALSE
keyUsage             = digitalSignature, keyEncipherment
subjectAltName       = @alternate_names
nsComment            = "OpenSSL Generated Certificate"

[ alternate_names ]

DNS.1       = *.local

Nejprve vytvořím novou certifikační autoritu:

openssl req -new -x509 -extensions v3_ca -keyout private/cakey.pem -out certs/cacert.pem -days 3000 -config conf/caconfig.cnf

Jako své jméno jsem zde uvedl Common name

Common Name (hostname, IP, or your name) []:Jonathan Hodgson

Soubor certs/cacert.pem Poté importuji do autorit Chromium, což funguje bez problémů.

Poté vytvořím žádost o certifikát:

openssl req -extensions v3_req -new -nodes -out local.req.pem -keyout private/local.key.pem -config conf/caconfig.cnf

Obecný název jsem zde uvedl jako *.local

Common Name (hostname, IP, or your name) []:*.local

Poté žádost podepíšu:

openssl ca -out certs/local.cert.pem  -config conf/caconfig.cnf -infiles local.req.pem

Přidávám soubory do své konfigurace http:

<VirtualHost *:80>
    ServerName test.local
    ServerAlias *.local
    VirtualDocumentRoot /home/jonathan/Sites/%-2/public_html
    CustomLog /home/jonathan/Sites/access.log vhost_combined
    ErrorLog /home/jonathan/Sites/error.log
</VirtualHost>

<VirtualHost *:443>
    ServerName test.local
    ServerAlias *.local
    VirtualDocumentRoot /home/jonathan/Sites/%-2/public_html
    CustomLog /home/jonathan/Sites/access.log vhost_combined
    ErrorLog /home/jonathan/Sites/error.log
    SSLEngine On
    SSLCertificateFile /home/jonathan/Sites/root-ca/certs/local.cert.pem
    SSLCertificateKeyFile /home/jonathan/Sites/root-ca/private/local.key.pem
</VirtualHost>

Restartoval jsem apache, ale stále se mi zobrazuje NET::ERR_CERT_COMMON_NAME_INVALID

Měl jsem dojem, že to bylo proto, že jsem potřeboval přidat subjectAltName do konfiguračního souboru, což jsem udělal.

Dejte mi prosím vědět, co bych měl udělat jinak.

Předem děkuji za jakoukoli pomoc

Upravit

Myslím, že problém souvisí se zástupným znakem. Pokud nastavím alternativní_názvy na example.local a běžný název požadavku na example.local, example.local se v Chrome i Firefoxu zobrazí jako zabezpečené.

Zkusil jsem nastavit DNS.1 na local a DNS.2 na *.local , pak jsem právě dostal ERR_SSL_SERVER_CERT_BAD_FORMAT v prohlížeči Chrome a SEC_ERROR_REUSED_ISSUER_AND_SERIAL ve firefoxu. Před generováním certifikátů jsem rozhodně resetoval svůj sériový soubor a indexový soubor.

Přijatá odpověď:

Přidali jste SAN do CSR ale neřekli jste ca zahrnout rozšíření z CSR v certifikátu. Viz https://security.stackexchange.com/questions/150078/missing-x509-extensions-with-an-openssl-generated-certificate nebo manuálovou stránku pro ca také na webu na copy_extensions

EDIT:Vy také je třeba zadat x509_extensions v ca config nebo ekvivalentní, ale méně pohodlná volba příkazového řádku -extensions , v obou případech ukazuje na sekci, která existuje, ale může být prázdná, pokud nechcete žádná rozšíření vyžadovaná CA. Nejprve jsem si toho nevšiml, protože jsem nikdy nezkoušel případ rozšíření z CSR pouze a ne config, což je pro většinu CA nereálné. Pokud zadáte copy_extensions jiné než none (a CSR nějaké má), ale neuvádějte x509_extensions pak ca dělá vložit rozšíření do certifikátu, ale nedělá pokud jsou přítomna rozšíření, nastavte verzi certifikátu na v3, jak to vyžadují standardy (jako rfc5280).

Související:Obrazovka GNU:vytisknout oddělenou relaci na stdout?

Je sporné, zda se jedná o chybu; manuálová stránka říká x509_extensions/extensions ovládá nastavení v3 a tím, že ne říkat něco podobného o copy_extensions znamená, že ne, ale IMHO je to určitě velmi suboptimální funkce. EDIT:je to chyba a bude opravena, ale do té doby použijte náhradní řešení, viz https://unix.stackexchange.com/a/394465/59699

OVŠEM:v mém testu to váš problém ve skutečnosti nevyřešilo. I když má certifikát *.local v SAN a CN a je (nyní) jinak platný, můj Firefox (53.0.2) a Chrome (59.0.3071.109) jej stále odmítají s SSL_ERROR_CERT_DOMAIN_ERROR a ERR_CERT_COMMON_NAME_INVALID. Hádal jsem, že možná nevylučují local z normální logiky 2+ a vyzkoušeli *.example.local :Chrome to akceptuje, ale Firefox ne. Zkoušel jsem také *.example.org a Chrome i IE11 se to líbí ale stále ne Firefox (a samozřejmě si přiřazovat jména ve skutečných TLD jako .org není způsob, jakým má DNS fungovat).

Tohle mě zaseklo. S trochou práce lze OpenSSL vytvořit tak, aby generoval certifikát obsahující téměř vše, co chcete, ale co Firefox a Chrome akceptují Nevím. Pokusím se to prozkoumat a aktualizovat, pokud něco najdu.

Doufám, že to myslíte dali jste *.local jako CommonName pouze pro server CSR a NE pro certifikát CA (self-signed). Pokud jsou názvy předmětů pro CA a listové certifikáty stejné, nic nebude fungovat spolehlivě. EDIT:vaše upravené Q potvrzuje, že byly správně odlišné. Ačkoli nezmiňuje také uvedení země, státu a organizace, jak to vyžaduje ca zásadu, kterou jste použili.

Poznámka 'self-signed' je umělecký termín a znamená podepsaný stejným klíčem . Váš certifikát CA je podepsán sám sebou. Certifikát serveru podepisujete vy sami pomocí svého vlastního klíče, ale není vlastnoručně podepsaný. Součástí vašeho problému byl pokus použít pokyny pro certifikát s vlastním podpisem na certifikát bez vlastního podpisu.

A Gillesův bod o md5 pro podpisový algoritmus je také správný.

EDIT:„resetování“ seriálu (a indexu) pro openssl ca nastavení je špatný nápad, pokud trvale nezrušíte certifikát a jméno CA byly použity pro. Standardy říkají, že daná CA nesmí vydat více než jeden certifikát se stejnou sériovou hodnotou v certifikátu a sériový soubor je způsob openssl ca (a také x509 -req ) to implementuje. „Skutečné“ (veřejné) CA v dnešní době již nepoužívají jednoduché počítadlo, ale zahrnují entropii k blokování kolizních útoků na PKI – google hashclash – ale to není problém pro osobní CA, jako je ta vaše. Snadno uvěřím, že prohlížeč (nebo jiná spolehlivá zařízení) je nešťastný, když vidí více certifikátů se stejným sériovým názvem a názvem CA, ačkoli bych NEOčekával, že prohlížeč bude trvale ukládat listový certifikát – a tak uvidí staré i nové v jeden proces, pokud není dlouho spuštěný – pokud jej neimportujete do příslušného obchodu, včetně Firefoxu, pokud z něj uděláte trvalou „výjimku“.

Související:Velká písmena S v oprávněních složky?
Linux
  1. Vytvoření souboru CSR webového certifikátu.

  2. Nainstalujte certifikát SSL

  3. Kupte si nebo obnovte SSL certifikát

  1. Curl:(60) Problém s certifikátem Ssl:Nelze získat certifikát místního vydavatele?

  2. Jak vygenerovat žádost o podpis certifikátu (CSR) pro SSL

  3. "Typy SSL certifikátů"

  1. Co je certifikát SSL?

  2. Vytváření přesměrování Apache

  3. Plesk:Instalace SSL