Certyfikat z podpisem własnym

18

Mam konfigurację pihole w domu, więc chcę móc obsługiwać żądania dotyczące dowolnej witryny z własnym serwerem, aby wyświetlić stronę „ta strona została zablokowana”.

Próbuję to zrobić, tworząc samopodpisany certyfikat dla dowolnego adresu URL i instalując go na moim urządzeniu. Polecenia, których użyłem do wygenerowania certyfikatu:

openssl genrsa 2048 > pihole.key
openssl req -new -x509 -nodes -days 36500\
    -key pihole.key \
    -subj "/C=NL/ST=Utrecht, Inc./CN=*" \
    -reqexts SAN \
    -config <(cat /etc/ssl/openssl.cnf \
        <(printf "\n[SAN]\nsubjectAltName=DNS:*,DNS:*")) \
    -out pihole.cert
openssl x509 -noout -fingerprint -text < pihole.cert > pihole.info
cat pihole.cert pihole.info > pihole.pem
service apache2 reload

Zainstalowałem ten certyfikat na moim urządzeniu z systemem Windows, a system Windows pokazuje, że jest to ważny certyfikat.

Jednak chrome daje mi NET::ERR_CERT_COMMON_NAME_INVALID, a edge daje podobny błąd ( DLG_FLAGS_SEC_CERT_CN_INVALID)

Dlaczego to? Jest CN = *po prostu niedozwolone? Jak mogę osiągnąć to, czego chcę?

Daniël van den Berg
źródło
Na marginesie: W przypadku głównych witryn Twoja przeglądarka prawdopodobnie nie zaakceptuje żadnego certyfikatu, który zdołasz wygenerować. Strony te używają przypinania certyfikatów i przesyłają odciski palców swoich certyfikatów TLS w celu włączenia ich do tych przeglądarek. Twój certyfikat nie będzie pasował do zapisanego odcisku palca i zostanie zablokowany. Oto więcej informacji: noncombatant.org/2015/05/01/about-http-public-key-pinning
Martijn Heemels
Certyfikaty z podpisem własnym mogą być problematyczne, jak odkryłeś. Zamiast tego możesz spojrzeć na uzyskanie „właściwej” certyfikacji z letsencrypt.org - są one bezpłatne i obsługują symbole wieloznaczne. W zależności od tego, ilu hostów próbujesz pokryć tym *, czego naprawdę potrzebujesz, jeden (lub więcej) certyfikatów z letsencrypt może cię pokryć
Dave Smylie
2
@DaveSmylie to dla adblockera, nie mam domen.
Daniël van den Berg
1
@Stewart przeczytaj mój poprzedni komentarz.
Daniël van den Berg
1
Uwaga: jeśli używasz tego do adblockera, lepiej po prostu po cichu porzucić połączenia z odpowiednimi serwerami zamiast wyświetlać alternatywną stronę. 90% nowoczesnych reklam jest początkowo ładowanych przez JavaScript, więc jest mało prawdopodobne, że Twoja strona alternatywna będzie widoczna na stronie. Prawdopodobnie zepsuje to, próbując załadować zasoby inne niż JavaScript jako JavaScript.
Nzall

Odpowiedzi:

42

To jest niedozwolone. Jako dodatek do standardowego sprawdzania poprawności nazwy hosta TLS, wszystkie główne przeglądarki internetowe (klienci HTTPS) zasadniczo zgodziły się na ograniczenie certyfikatów wieloznacznych do „eTLD + 1” - to znaczy, że musi istnieć „skuteczna TLD” plus jeszcze jedna nie -wildcard komponent.

Ogólnie przekłada się to na wymaganie co najmniej dwóch składników ( *.example.netjest w porządku, ale *.netnie jest, ani nie jest nagi *). Reguła „skutecznej TLD” rozszerza ją na sufiksy wielopoziomowe, ponieważ co.ukludzie używają w praktyce niepodzielnych „TLD”. (Więc *.example.ac.ukjest dozwolone, ale *.ac.uknie jest.)

Możesz sprawdzić, w jaki sposób publiczna lista sufiksów jest implementowana w Chromium i Mozilli .

Zobacz pokrewną dyskusję w Security.SE, która zawiera cytat z wymagań podstawowych forum CA-Browser Forum (które dotyczą tylko publicznych urzędów certyfikacji WebPKI, ale mimo to odzwierciedlają ogólną implementację):

Urzędy certyfikacji MUSZĄ odwołać każdy certyfikat, w którym znak wieloznaczny występuje na pierwszej pozycji etykiety bezpośrednio po lewej stronie etykiety „kontrolowanej przez rejestr” lub „sufiksu publicznego”.


Aby uniknąć tego ograniczenia, zbuduj urząd certyfikacji, który wydaje certyfikaty „na żądanie” dla dowolnej witryny, którą próbujesz odwiedzić. Nie wiem, jak można by to wdrożyć na jakimkolwiek zwykłym serwerze WWW, ale jest to powszechna metoda stosowana w komercyjnych systemach przechwytywania TLS; programy antywirusowe i inne złośliwe oprogramowanie; oraz narzędzia programistyczne, takie jak pakiet Burp Proxy.

Na przykład serwer WWW OpenResty (w zasadzie Nginx-with-Lua) ma ssl_certificate_by_luaopcję implementacji dynamicznego generowania certyfikatów. Serwer proxy Squid obsługuje naśladowanie certyfikatów w funkcji ssl-bump.

Należy również zauważyć, że sieci SAN całkowicie zastępują podmiot CN, jeśli oba są obecne. Powoduje to, że dołączanie CN jest w większości zbędne (chyba że oprogramowanie klienckie jest tak stare, że nie obsługuje SAN), a przeglądarki publicznych urzędów certyfikacji nawet go nie akceptują.

użytkownik1686
źródło
O tym limicie TLD + 1 dowiedziałem się już wcześniej tutaj w projekcie. Dzięki za rozłożenie tego. +1
Rui F Ribeiro
Dziękuję za twoją szczegółową odpowiedź, tak sądzę, że to wyjaśnia. Czy znasz inne podejście, które mógłbym zastosować?
Daniël van den Berg
26
Uznany za strategiczne umieszczanie „i innych złośliwych programów”.
Džuris,
@ DaniëlvandenBerg: Zdarzyło mi się zasugerować jedno w samym poście. Właśnie dodałem linki do przykładów Nginx i Squid.
user1686
5

W certyfikacie może znajdować się tylko jeden symbol wieloznaczny (tj. Nie *.*.example.com), może pasować tylko do jednej etykiety (tj. Tylko www, nie www.example.com), może znajdować się tylko na lewej pozycji (tj. *.www.example.comAle nie www.*.example.com) i nie może znajdować się w publicznym sufiksie (tj. nie *.com).

Steffen Ullrich
źródło