Hindari kata sandi yang meminta kunci dan meminta informasi DN

90

Saya menggunakan kode berikut untuk menghasilkan kunci:

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

Saya punya dua pertanyaan:

  1. Bagaimana saya bisa melewatkan bisikan frasa sandi? Apakah cukup aman bagi saya untuk melakukannya? (seperti di dalamnya tidak boleh benar-benar bodoh seperti orang harus bisa meretas sertifikat)

  2. Bagaimana saya menghindari prompt untuk nama negara, organisasi, dll. Saya harap saya bisa memberikannya pada command prompt (halaman manual hanya menunjukkan opsi tingkat atas untuk OpenSSL)

jww
sumber

Jawaban:

150

Sunting: Sejauh ini jawaban saya yang paling populer, dan sudah beberapa tahun sekarang, jadi saya telah menambahkan varian ECDSA. Jika Anda dapat menggunakan ECDSA, Anda harus melakukannya.


Anda dapat menyediakan semua informasi itu di baris perintah.

Satu langkah pembuatan sertifikat tanpa kata sandi yang ditandatangani sendiri:

Versi 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

Versi 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

Semua sub-perintah openssl memiliki halaman manual mereka sendiri. Lihat man req.


Khusus menjawab pertanyaan Anda dan lebih eksplisit tentang opsi mana yang berlaku:

  1. The -nodessinyal bendera untuk tidak mengenkripsi kunci, sehingga Anda tidak perlu password. Anda juga bisa menggunakan -passout argbendera. Lihat PASS PHRASE ARGUMENTSdi openssl(1)halaman manual untuk cara memformat arg.

  2. Menggunakan -subjbendera, Anda dapat menentukan subjek (contoh di atas).

bahamat
sumber
3
Namun, membaca hal-hal melalui "-subj" sangat bagus - hanya untuk saya - saat OPENSSL_CONF TIDAK diatur. TKI: jika OPENSSL_CONF disetel, OpenSSL akan mencoba membaca dari sana, dan mengabaikan argumen baris perintah "-subj". Butuh waktu beberapa saat untuk mencari tahu.
oberstet
oberstet: Ya, itu benar.
bahamat
Apakah mungkin untuk meneruskan kunci subjek sendiri dari stdin? Saya sudah mencoba "-key stdin", "-key fd: 1" dan "-key -" .. tanpa hasil.
oberstet
1
@ JeremyBaker: Tidak, Anda perlu proses dua langkah untuk itu. Hapus -x509dan -daysuntuk menghasilkan CSR, bukan sertifikat, lalu gunakan metode penandatanganan CA biasa.
bahamat
1
@jww - dan saat itu telah tiba. Dimulai dengan Chrome v58, ketika mencoba memuat halaman aman tetapi sertifikat tidak mengandung subjekAltName yang cocok, itu menunjukkan halaman kesalahan privasi dengan pesan kesalahan "NET :: ERR_CERT_COMMON_NAME_INVALID". Mengklik pada tombol lanjutan menunjukkan pesan "... sertifikat keamanannya dari [missing_subjectAltName]"
Insomniac Software
11

Apakah -passinopsi tidak melakukan trik untuk Anda?

Dengan file:pathnameformulir Anda bisa cukup aman dengan izin 600 untuk file itu.

9000
sumber
Lihat opsi di halaman manual. Sepertinya saya dapat memiliki frasa sandi seperti itu tanpa disuruh. Terima kasih!
Dan dengan -passin 'pass:YOUR_PASSWORD'? - doc: openssl.org/docs/man1.0.2/apps/…
andras.tim
5

Jawaban yang diterima membutuhkan beberapa koreksi kecil. EC Lines:

-newkey ec
-pkeyopt ec_paramgen_curve:prime256v1

seharusnya:

 -newkey ec \
 -pkeyopt ec_paramgen_curve:prime256v1 \

Pada MacOS - OpenSSL 1.0.2f diinstal melalui minuman saya memverifikasi jawaban yang diterima seperti yang dijelaskan di bawah ini

  • Untuk daftar kurva Elliptic yang tersedia:

    $ openssl ecparam -list_curves
    
  • Untuk menghasilkan file kunci:

    $ openssl ecparam -name secp256k1 -out secp256k1.pem
    
  • Untuk menghasilkan sertifikat tanpa konfirmasi kata sandi:

    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
    
  • Untuk melihat sertifikat:

    $ openssl x509 -noout -text -in server.crt
    
Andrei Sura
sumber
Bagaimana ini berbeda dari jawaban yang diterima?
Ramhound
1
Satu-satunya perbedaan penting adalah bahwa saya secara eksplisit mendaftar langkah menghasilkan file pem. Jawaban yang diterima tidak memiliki \ karakter dan itu membuat saya berpikir bahwa perintahnya salah.
Andrei Sura
1
Anda mungkin ingin menyebutkan fakta itu. Jika jawaban yang diterima memang tidak lengkap, dan tidak memiliki karakter, penting untuk menyoroti perbedaan dan bagaimana jawaban Anda mengandung informasi penting yang penting.
Ramhound
3

Coba perintah berikut:

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

Bagian skipping adalah: -passout pass:foo.

kenorb
sumber
2

@ Bahaham memiliki jawaban yang bagus. Sayangnya beberapa versi openssl melempar kesalahan ketika mencoba membuat sertifikat ECDSA dengan satu perintah. Kesalahan terjadi seperti:

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

Saya menggunakan openssl 1.0.1e-fipspada CentOS 7.

Membuat sertifikat Anda dengan 3 perintah berikut tampaknya berhasil:

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
sumber
Bukankah seharusnya baris terakhir diakhiri dengan server.crt?
ᴠɪɴᴄᴇɴᴛ