Najlepsza lokalizacja dla certyfikatu SSL i kluczy prywatnych na Ubuntu

62

W Ubuntu wygląda na to, że najlepszym miejscem na klucz prywatny używany do podpisywania certyfikatu (do użytku przez nginx) jest /etc/ssl/private/

Ta odpowiedź dodaje, że certyfikat powinien wejść, /etc/ssl/certs/ale wydaje się, że jest to niebezpieczne miejsce. Czy .crtpliki muszą być bezpieczne, czy są uważane za publiczne?

Adam Nelson
źródło
19
Jeśli chcesz, możesz postawić .crtna tablicy reklamowej Times Square.
ceejayoz,

Odpowiedzi:

48

Plik .crt jest wysyłany do wszystkiego, co się łączy; to jest publiczne. ( chown root:rooti chmod 644)

Aby dodać do lokalizacji klucza prywatnego; upewnij się, że odpowiednio go zabezpieczysz i masz go tam. ( chown root:ssl-certi chmod 640)

Shane Madden
źródło
Zastanawiam się, dlaczego ten katalog nie jest domyślnie g + s.
Collin Anderson
2
Nie musi tak być; katalog ma numer 0750, więc żaden użytkownik spoza grupy nie może przejść do katalogu w celu odczytania plików.
womble
2
Wygląda na to, że ssl-cert jest nieprawidłową nazwą grupy na Ubuntu. Może powinien to być chown root: root zamiast
Atifm
1
@Atifm Grupa certyfikatów ssl-cert została wprowadzona 16.04 lub 18.04. Nie pamiętam który.
DylanYoung
1
@DylanYoung: na pewno jest obecny na Ubuntu 12.04 i wierzę, że jest tworzony przez pakiet ssl-cert, używany, być może, między innymi, do tworzenia samopodpisanych certyfikatów
snakeoil
35

Naprawdę nie ma znaczenia, gdzie je umieścisz, pod warunkiem, że odpowiednio zabezpieczysz swoje pliki kluczy prywatnych . Certyfikat publiczny publiczny; ochrona nie jest wymagana - uprawnienia serwera lub w inny sposób.

Aby rozwinąć odpowiedź, nie używam domyślnej lokalizacji /etc/ssl.
Łatwiej jest mi przechowywać wszystkie moje w osobnym obszarze z powodu kopii zapasowych i innych powodów.

W przypadku Apache SSL trzymam mój w /etc/apache2/ssl/privatepodobnym „obszarze głównym” /etc/.

Przykładowa konfiguracja

Ten post jest skierowany do Ubuntu (Debian) + Apache, ale powinien działać na większości systemów - po
prostu zastosuj uprawnienia i zaktualizuj lokalizację / ścieżkę w danej konfiguracji (apache / nginx / etc).
Jeśli pliki kluczy SSL są odpowiednio chronione (katalog i pliki), wszystko będzie dobrze. Uwaga notatki!

Utwórz katalogi:

sudo mkdir /etc/apache2/ssl
sudo mkdir /etc/apache2/ssl/private
sudo chmod 755 /etc/apache2/ssl
sudo chmod 710 /etc/apache2/ssl/private

Uwaga:
chmod 710obsługuje ssl-certgrupę w systemie Ubuntu.
(Patrz komentarze)
Ustawienie uprawnienia na 700on /etc/apache2/ssl/privaterównież będzie działać dobrze.

Umieść pliki SSL:

Umieść publiczne certyfikaty www ssl wraz z certyfikatami pośrednimi w /etc/apache2/ssl
Włóż prywatne klucze ssl/etc/apache2/ssl/private

Ustaw właściciela:

sudo chown -R root:root /etc/apache2/ssl/
sudo chown -R root:ssl-cert /etc/apache2/ssl/private/

Uwaga:
Jeśli nie masz grupy ssl-cert , po prostu użyj „root: root” w linii powyżej lub pomiń drugą linię.

Ustaw uprawnienia:

Certyfikaty publiczne

sudo chmod 644 /etc/apache2/ssl/*.crt

Klucz prywatny

sudo chmod 640 /etc/apache2/ssl/private/*.key

Uwaga:
Uprawnienie grupy jest ustawione na CZYTAJ (640) z powodu grupy Ubuntu ssl-cert. „600” też jest w porządku.

Włącz moduł Apache SSL

sudo a2enmod ssl

Edytuj dowolne pliki strony Apache i włącz

(patrz ostatni akapit) *

sudo nano /etc/apache/sites-available/mysiteexample-ssl.conf
sudo a2ensite mysiteexample-ssl
#             ^^^^^^^^^^^^^^^^^ <-Substitute your ".conf" filename(s)

Uruchom ponownie usługę Apache2

sudo service apache2 restart

lub

sudo systemctl restart apache2.service

Gotowy. Przetestuj swoją nową witrynę SSL.

* Znów wykracza to poza pytanie, ale możesz skopiować domyślny plik konfiguracyjny strony Apache SSL ( sudo cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/mysiteexample-ssl.conf) jako dobry punkt wyjścia / przykład domyślnych dyrektyw / katalogów zwykle używanych w prostym („Ubuntu / Debian) pliku Apache / SSL” conf ” . Zwykle wskazuje na samopodpisany certyfikat SSL + klucz (snakeoil), pakiety CA, a także wspólne dyrektywy używane dla danej witryny SSL.

Po skopiowaniu, po prostu edytuj nowy plik .conf i dodaj / usuń / zaktualizuj go w razie potrzeby z nowymi informacjami / ścieżkami powyżej, a następnie uruchom, sudo a2ensite mysiteexample-sslaby go włączyć.

bshea
źródło
nie jestem pewien, dlaczego sugerujesz ustawienie 710 dla uprawnień dla / etc / apache2 / ssl / private. Ustawienie bitu wykonania dla katalogu (dla grupy) bez ustawienia bitu odczytu dla katalogu (dla grupy) nie ma dla mnie większego sensu. Czy chciałeś ustawić go na 750?
chriv
@chriv Właśnie ustawiłem uprawnienia na podstawie tego, jak widzę konfigurację w domyślnym obszarze SSL Ubuntu. Zobacz / etc / ssl / certs & / etc / ssl / private & ssl-certs group use. Zobacz stackoverflow.com/a/23408897/503621
bshea
1
Bardzo ładne i szczegółowe wyjaśnienie ogólnego pytania z wieloma możliwymi odpowiedziami. Dziękuję Ci. Aby dodać kilka rzeczy, twoja <VirtualHost *:443>sekcja sites-available/mysite.confpowinna zawierać takie certyfikaty:SSLEngine on SSLCertificateFile /etc/apache2/ssl/mysite.crt SSLCertificateKeyFile /etc/apache2/ssl/private/mysite.key
George Dimitriadis
BTW - Możliwe jest również połączenie konfiguracji: 80 i: 443 w jednym pliku „.conf” Apache. I tak przekierowuję wszystko, co uderza w port: 80 na: 443 / SSL. Możliwe jest również umieszczenie podstawowych ustawień SSL w pliku .conf i utworzenie dodatkowego „szczegółowego” pliku ustawień SSL (na przykład w celu ustawienia używanych szyfrów / etc) i po prostu dołączenie go do wszystkich plików .conf poza obszarami wirtualnymi. Używam tych ustawień, by trochę „zahartować” SSL i umieszczam go w każdej wirtualnej witrynie .conf. W ten sposób mogę uzyskać certyfikat A + w SSL Labs .
bshea
10

Wszystkie odpowiedzi tutaj wydają się OK, ale chcę wspomnieć o jednej rzeczy, którą znalazłem, jest problemem ... Jeśli musisz połączyć swój certyfikat z półproduktami lub rootami, aby wymyślić plik łańcucha, nie wkładaj tego /etc/ssl/certs, ponieważ kiedy c_rehashjest uruchamiany, może tworzyć skróty symboliczne do twoich certyfikatów ze względu na ich korzenie lub półprodukty.

Później, jeśli twoje certyfikaty wygasły i je usunąłeś, i nie wiesz, aby je ponownie uruchomić c_rehash, być może zepsułeś dowiązania symboliczne skrótu w twoim /etc/ssl/certskatalogu, a dziwne rzeczy zaczynają się dziać, gdy twoja lokalna maszyna próbuje się połączyć ze sobą przez SSL i nie może znaleźć korzeni do sprawdzenia. Na przykład z curl nagle zacząłem dostawać:

curl: (60) SSL certificate problem: unable to get issuer certificate

Krótko po oczyszczeniu niektórych starych plików .crt i połączonych plików .pem, w których miałem /etc/ssl/certs.

Przechowywanie przynajmniej łańcuchów w innym miejscu pozwala uniknąć tego problemu. Skończyło się /etc/ssl/local_certsna tym, że trzymałem moje certyfikaty i łańcuchy, aby nie zgubić się w bałaganie certyfikatów CA, które znajdziesz w/etc/ssl/certs

barryp
źródło
2

Nie ma tak naprawdę niebezpiecznego miejsca, jeśli uprawnienia dla poszczególnych plików / katalogów są ustawione na coś podobnego, chown root :0 private.keya chmod 600 private.keywięc tylko root może je odczytać. CSR i pliki certyfikatów są mniej wrażliwe, jak mówisz.

Przy tych uprawnieniach wymienione ścieżki i / usr / local / ssl powinny być w porządku.

Jonathan Ross
źródło
1
Często aplikacje uzyskujące dostęp do kluczy prywatnych działają jako użytkownicy inni niż root. Sugeruję utrzymanie dostępu dla grupy ssl-cert.
Shane Madden
1
Zrozumiano, ale serwery internetowe, takie jak Apache, spawnują główny proces „nadrzędny” i przy założeniu, że jest to również nginx.
Jonathan Ross
1

Lokalizacje są poprawne:

  • /etc/ssl/certs/do .crtpliku
  • /etc/ssl/privatedo .keypliku

Właściciel musi być root:rootdla obu (użyj, sudo chmod root:root <file>aby zmienić w razie potrzeby).

Uprawnienia :

  • 644do .crtpliku
  • 600do .keypliku

To zadziała dla nginx.

Rael Gugelmin Cunha
źródło