Unikaj monitów o podanie hasła i monitów o podanie nazwy wyróżniającej

90

Używam następującego kodu do generowania kluczy:

apt-get -qq -y install openssl;
mkdir -p /etc/apache2/ssl;
openssl genrsa -des3 -out server.key 1024;
openssl req -new -key server.key -out server.csr;
cp server.key server.key.org;
openssl rsa -in server.key.org -out server.key;
openssl x509 -req -days 12000 -in server.csr -signkey server.key -out server.crt;
mv server.crt  /etc/apache2/ssl/cert.pem;
mv server.key  /etc/apache2/ssl/cert.key;
rm -f server.key.orig;
rm -f server.csr

Mam dwa pytania:

  1. Jak mogę pominąć monitowanie o hasło? Czy byłoby to dla mnie wystarczająco bezpieczne? (ponieważ nie powinno to być głupie, jak ktoś powinien być w stanie zhakować certyfikat)

  2. Jak uniknąć monitowania o nazwę kraju, organizację itp. Mam nadzieję, że mogę je podać w wierszu polecenia (strona podręcznika pokazuje tylko opcje najwyższego poziomu dla OpenSSL)

jww
źródło

Odpowiedzi:

150

Edycja: To zdecydowanie moja najpopularniejsza odpowiedź. Minęło już kilka lat, więc dodałem wariant ECDSA. Jeśli możesz skorzystać z ECDSA, powinieneś.


Możesz podać wszystkie te informacje w wierszu poleceń.

Generowanie certyfikatu bez hasła jednym krokiem:

Wersja RSA

openssl req \
    -new \
    -newkey rsa:4096 \
    -days 365 \
    -nodes \
    -x509 \
    -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com" \
    -keyout www.example.com.key \
    -out www.example.com.cert

Wersja ECDSA

openssl req \
    -new \
    -newkey ec \
    -pkeyopt ec_paramgen_curve:prime256v1 \
    -days 365 \
    -nodes \
    -x509 \
    -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com" \
    -keyout www.example.com.key \
    -out www.example.com.cert

Wszystkie podkomendy openssl mają własną stronę podręcznika man. Zobaczyć man req.


W szczególności odpowiadaj na pytania i dokładniej określaj, które opcje obowiązują:

  1. Te -nodessygnały flag nie szyfrowania klucza, dzięki czemu nie trzeba hasło. Możesz także użyć -passout argflagi. Zobacz PASS PHRASE ARGUMENTSna openssl(1)stronie podręcznika, jak sformatować arg.

  2. Za pomocą -subjflagi możesz określić temat (przykład powyżej).

bahamat
źródło
3
Czytanie rzeczy przez „-subj” działa świetnie, jednak - dla mnie - tylko wtedy, gdy NIE ustawiono OPENSSL_CONF. IOW: jeśli ustawiono OPENSSL_CONF, OpenSSL spróbuje odczytać stamtąd i zignoruje argument wiersza poleceń „-subj”. Zajęło mi to trochę czasu, żeby to rozgryźć.
oberstet
oberstet: Tak, to prawda.
bahamat
Czy możliwe jest przekazanie samego klucza tematu ze standardowego wejścia? Próbowałem „-key stdin”, „-key fd: 1” i „-key -” .. bez powodzenia.
oberstet,
1
@JeremyBaker: Nie, potrzebujesz do tego dwuetapowego procesu. Pomiń -x509i, -daysaby wygenerować CSR zamiast certyfikatu, a następnie użyj zwykłej metody podpisywania urzędu certyfikacji.
bahamat
1
@jww - i ten czas nadszedł. Począwszy od Chrome v58, gdy próbuje się załadować bezpieczną stronę, ale certyfikat nie zawiera pasującego podmiotuAltName, wyświetla stronę błędu prywatności z komunikatem o błędzie „NET :: ERR_CERT_COMMON_NAME_INVALID”. Kliknięcie przycisku zaawansowanego powoduje wyświetlenie komunikatu „... jego certyfikat bezpieczeństwa pochodzi z [brakuje_subjectAltName]”
Insomniac Software
11

Czy -passinopcja nie rozwiązuje problemu?

Dzięki file:pathnameformularzowi możesz być całkiem bezpieczny z uprawnieniami 600 dla tego pliku.

9000
źródło
Widziałem opcję na stronie podręcznika. Wygląda na to, że mogę mieć hasło w ten sposób bez monitowania. Dzięki!
I z -passin 'pass:YOUR_PASSWORD'? - doc: openssl.org/docs/man1.0.2/apps/…
andras.tim
5

Przyjęta odpowiedź wymaga kilku drobnych poprawek. Linie EC:

-newkey ec
-pkeyopt ec_paramgen_curve:prime256v1

Powinien być:

 -newkey ec \
 -pkeyopt ec_paramgen_curve:prime256v1 \

W systemie MacOS - OpenSSL 1.0.2f zainstalowanym przez brew, zweryfikowałem zaakceptowaną odpowiedź, jak opisano poniżej

  • Aby wyświetlić listę dostępnych krzywych eliptycznych:

    $ openssl ecparam -list_curves
    
  • Aby wygenerować plik klucza:

    $ openssl ecparam -name secp256k1 -out secp256k1.pem
    
  • Aby wygenerować certyfikat bez hasła:

    openssl req \
        -new \
        -newkey ec:secp256k1.pem \
        -days 365 \
        -nodes \
        -x509 \
        -subj "/C=US/ST=FL/L=Ocala/O=Home/CN=example.com" \
        -keyout server.key \
        -out server.crt
    
  • Aby wyświetlić certyfikat:

    $ openssl x509 -noout -text -in server.crt
    
Andrei Sura
źródło
Czym różni się to od przyjętej odpowiedzi?
Ramhound,
1
Jedyną ważną różnicą jest to, że wyraźnie wymieniam etap generowania pliku pem. W zaakceptowanej odpowiedzi brakuje dwóch znaków \ ​​i sprawiło, że pomyślałem, że polecenie jest niepoprawne.
Andrei Sura,
1
Możesz wspomnieć o tym fakcie. Jeśli zaakceptowana odpowiedź jest rzeczywiście niekompletna i brakuje znaków, ważne jest, aby podkreślić różnice i sposób, w jaki odpowiedź zawiera ważne istotne informacje.
Ramhound,
3

Spróbuj wykonać następujące polecenie:

openssl genrsa -des3 -out user.key -passout pass:foo 1024

Pominięcia część jest: -passout pass:foo.

kenorb
źródło
2

@bahamat ma świetną odpowiedź. Niestety niektóre wersje openssl zgłaszają błąd podczas próby utworzenia certyfikatu ECDSA za pomocą jednego polecenia. Błąd idzie mniej więcej tak:

routines:EVP_PKEY_CTX_ctrl:invalid operation:pmeth_lib.c:404

Korzystałem openssl 1.0.1e-fipsz CentOS 7.

Wydaje się, że tworzenie certyfikatu za pomocą następujących 3 poleceń:

openssl ecparam -genkey -name prime256v1 -out key.pem
openssl req -new -key key.pem -out csr.pem -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com"
openssl req -x509 -days 365 -key key.pem -in csr.pem -out certificate.pem
jxmallett
źródło
Czy ostatnia linia nie powinna się kończyć server.crt?
ᴠɪɴᴄᴇɴᴛ