Bagaimana cara membuat sertifikat yang ditandatangani sendiri untuk localhost?

23

Saya lakukan dengan kata sandi dan dengan bidang-bidang berikut sebagai root

openssl req -x509 -days 365 -newkey rsa:2048 -keyout /etc/ssl/apache.key \
    -out /etc/ssl/apache.crt

Bidang

Country: FI
State: Pirkanmaa
Locality: Tampere
Organization: masi
Organizational Unit Name: SSL Certificate Test
CommonName: 192.168.1.107/owncloud
EmailAddress: [email protected]

Keluaran: Kesalahan jabat tangan SSL dalam HTTPS. Output yang diharapkan: koneksi HTTPS. HTTP berfungsi.

CommonName harus menyertakan URL tempat Anda ingin pergi, utas milik sendiri di sini . Saya telah mencoba gagal di commonname

  • 192.168.1.107/owncloud
  • 192.168.1.107/

Tes OS untuk server: Debian 8.5.
Server: Raspberry Pi 3b. Owncloud-server: 8.2.5. Owncloud-client: 2.1.1. Sistem-klien: Debian 8.5.

Léo Léopold Hertz 준영
sumber
Jika Anda mencari untuk menghasilkan sertifikat SSL baru menggunakan SAN untuk localhost, langkah-langkah pada posting ini berfungsi untuk saya Centos 7 / Vagrant / Chrome Browser.
Damodar Bashyal
@DamodarBashyal Tolong, jangan berikan tautan hanya jawaban tetapi deskripsi juga sebagai jawaban.
Léo Léopold Hertz 준영

Jawaban:

11

openssl req -x509 -days 365 -newkey rsa: 2048 -keyout /etc/ssl/apache.key -out /etc/ssl/apache.crt

Anda tidak dapat menggunakan perintah ini untuk menghasilkan sertifikat X.509 yang terbentuk dengan baik. Itu akan salah karena nama host ditempatkan di Nama Umum (CN) . Menempatkan nama host atau Alamat IP di CN tidak lagi digunakan oleh IETF (sebagian besar alat, seperti wgetdan curl) dan Forum CA / B (CA dan Peramban).

Menurut Forum IETF dan CA / B, nama Server dan Alamat IP selalu masuk dalam Subject Alternate Name (SAN) . Untuk aturannya, lihat RFC 5280, Internet X.509 Public Infrastructure Key, Sertifikat dan Daftar Pencabutan Sertifikat (CRL) Profile dan Persyaratan Dasar Forum CA / Browser .

Anda sebagian besar perlu menggunakan file konfigurasi OpenSSL dan menyesuaikannya sesuai dengan kebutuhan Anda. Di bawah ini adalah contoh yang saya gunakan. Ini disebut example-com.conf, dan diteruskan ke perintah OpenSSL via -config example-com.conf.


Juga perhatikan baik : semua mesin mengklaim localhost, localhost.localdomain, dll Hati-hati tentang mengeluarkan sertifikat untuk localhost. Saya tidak mengatakan jangan lakukan itu; hanya mengerti ada beberapa risiko yang terlibat.

Alternatif lain localhostadalah: (1) menjalankan DNS dan mengeluarkan sertifikat ke nama DNS mesin. Atau, (2) gunakan IP statis dan sertakan alamat IP statis.


Peramban masih akan memberi Anda peringatan tentang sertifikat yang ditandatangani sendiri yang tidak berantai kembali ke akar tepercaya. Alat suka curldan wgettidak akan mengeluh, tetapi Anda masih perlu mempercayai diri Anda masuk dengan opsi seperti cURL --cafile. Untuk mengatasi masalah kepercayaan Peramban, Anda harus menjadi CA Anda sendiri.

"Menjadi CA Anda sendiri" dikenal sebagai menjalankan PKI Pribadi. Tidak banyak untuk itu. Anda dapat melakukan semua yang CA Umum bisa lakukan. Satu-satunya hal yang berbeda adalah Anda harus menginstal Sertifikat CA Root Anda di berbagai toko. Ini tidak berbeda dengan, katakanlah, menggunakan CURL cacerts.pm. cacerts.pmhanyalah kumpulan Root CA's, dan sekarang Anda telah bergabung dengan klub.

Jika Anda menjadi CA Anda sendiri, maka pastikan untuk membakar kunci pribadi Root CA Anda ke disk dan tetap offline. Kemudian masukkan ke drive CD / DVD saat Anda harus menandatangani permintaan penandatanganan. Sekarang Anda menerbitkan sertifikat seperti CA Publik.

Tidak satu pun dari ini yang sangat sulit setelah Anda menandatangani satu atau dua permintaan penandatanganan. Saya telah menjalankan PKI Swasta selama bertahun-tahun di rumah. Semua perangkat dan gadget saya mempercayai CA saya.

Untuk informasi lebih lanjut tentang menjadi CA Anda sendiri, lihat Bagaimana Anda menandatangani Permintaan Penandatanganan Sertifikat dengan Otoritas Sertifikasi Anda dan Cara membuat sertifikat yang ditandatangani sendiri dengan openssl? .


Dari komentar di file konfigurasi di bawah ...

Ditandatangani Sendiri (perhatikan penambahan -x509)

openssl req -config example-com.conf -new -x509 -sha256 -newkey rsa:2048 -nodes -keyout example-com.key.pem -days 365 -out example-com.cert.pem

Menandatangani Permintaan (perhatikan kekurangan -x509)

openssl req -config example-com.conf -new -newkey rsa:2048 -nodes -keyout example-com.key.pem -days 365 -out example-com.req.pem

Cetak Tanda Tangan

openssl x509 -in example-com.cert.pem -text -noout

Cetak Permintaan Penandatanganan

openssl req -in example-com.req.pem -text -noout

File Konfigurasi

# Self Signed (note the addition of -x509):
#     openssl req -config example-com.conf -new -x509 -sha256 -newkey rsa:2048 -nodes -keyout example-com.key.pem -days 365 -out example-com.cert.pem
# Signing Request (note the lack of -x509):
#     openssl req -config example-com.conf -new -newkey rsa:2048 -nodes -keyout example-com.key.pem -days 365 -out example-com.req.pem
# Print it:
#     openssl x509 -in example-com.cert.pem -text -noout
#     openssl req -in example-com.req.pem -text -noout

[ req ]
default_bits        = 2048
default_keyfile     = server-key.pem
distinguished_name  = subject
req_extensions      = req_ext
x509_extensions     = x509_ext
string_mask         = utf8only

# The Subject DN can be formed using X501 or RFC 4514 (see RFC 4519 for a description).
#   It's sort of a mashup. For example, RFC 4514 does not provide emailAddress.
[ subject ]
countryName         = Country Name (2 letter code)
countryName_default     = US

stateOrProvinceName     = State or Province Name (full name)
stateOrProvinceName_default = NY

localityName            = Locality Name (eg, city)
localityName_default        = New York

organizationName         = Organization Name (eg, company)
organizationName_default    = Example, LLC

# Use a friendly name here because it's presented to the user. The server's DNS
#   names are placed in Subject Alternate Names. Plus, DNS names here is deprecated
#   by both IETF and CA/Browser Forums. If you place a DNS name here, then you 
#   must include the DNS name in the SAN too (otherwise, Chrome and others that
#   strictly follow the CA/Browser Baseline Requirements will fail).
commonName          = Common Name (e.g. server FQDN or YOUR name)
commonName_default      = Example Company

emailAddress            = Email Address
emailAddress_default        = [email protected]

# Section x509_ext is used when generating a self-signed certificate. I.e., openssl req -x509 ...
[ x509_ext ]

subjectKeyIdentifier        = hash
authorityKeyIdentifier  = keyid,issuer

#  If RSA Key Transport bothers you, then remove keyEncipherment. TLS 1.3 is removing RSA
#  Key Transport in favor of exchanges with Forward Secrecy, like DHE and ECDHE.
basicConstraints        = CA:FALSE
keyUsage            = digitalSignature, keyEncipherment
subjectAltName          = @alternate_names
nsComment           = "OpenSSL Generated Certificate"

# RFC 5280, Section 4.2.1.12 makes EKU optional
# CA/Browser Baseline Requirements, Appendix (B)(3)(G) makes me confused
# extendedKeyUsage  = serverAuth, clientAuth

# Section req_ext is used when generating a certificate signing request. I.e., openssl req ...
[ req_ext ]

subjectKeyIdentifier        = hash

basicConstraints        = CA:FALSE
keyUsage            = digitalSignature, keyEncipherment
subjectAltName          = @alternate_names
nsComment           = "OpenSSL Generated Certificate"

# RFC 5280, Section 4.2.1.12 makes EKU optional
# CA/Browser Baseline Requirements, Appendix (B)(3)(G) makes me confused
# extendedKeyUsage  = serverAuth, clientAuth

[ alternate_names ]

DNS.1       = example.com
DNS.2       = www.example.com
DNS.3       = mail.example.com
DNS.4       = ftp.example.com

# Add these if you need them. But usually you don't want them or
#   need them in production. You may need them for development.
# DNS.5       = localhost
# DNS.6       = localhost.localdomain
# DNS.7       = 127.0.0.1

# IPv6 localhost
# DNS.8     = ::1
# DNS.9     = fe80::1

Anda mungkin perlu melakukan yang berikut untuk Chrome. Kalau tidak, Chrome dapat mengadu Nama Umum tidak valid ( ERR_CERT_COMMON_NAME_INVALID) . Saya tidak yakin apa hubungan antara alamat IP di SAN dan CN dalam hal ini.

# IPv4 localhost
# IP.1       = 127.0.0.1

# IPv6 localhost
# IP.2     = ::1
Komunitas
sumber
Bisakah Anda menambahkan path default ke file konfigurasi? - - Bisakah Anda menunjukkan alur kerja yang lengkap? Tentang meneruskan file ke perintah openssl dll - - Saya tidak berhasil dengan jawaban sebelumnya sehingga semua informasi yang dibutuhkan dihargai.
Léo Léopold Hertz 준영
@Masi - "Bisakah Anda menambahkan path default ke file konfigurasi?" - Tidak yakin apa yang kamu maksud. Anda dapat menyimpannya di mana pun Anda suka. Saya menjalankannya dari desktop pada banyak mesin, dan direktori home saya pada yang lain. Saya perhatikan Anda dulu sudo. Mungkin .rndfile Anda dimiliki oleh root. Jika demikian, coba a sudo chown -R masi:masi /home/masi. Maka Anda akan dapat membaca dan menulis untuk itu.
Saya sekarang hanya menggunakan Debian, bukan Ubuntu, jadi hanya root. Harap tambahkan alur kerja Anda sebagai contoh tentang file keepinv di Desktop dan meneruskannya. Saya tidak memiliki gambaran yang jelas tentang sistem.
Léo Léopold Hertz 준영
1
Jalankan salah satu perintah yang tercantum di bagian atas file. Komentar ada untuk copy / paste. Pilih satu yang sesuai dengan selera Anda. Jika Anda masih mencoba untuk menghasilkan diri yang ditandatangani, maka Anda menjalankan perintah dengan x509di dalamnya (seperti komentar mengatakan).
Penulis meminta penghapusan posting ini "karena perubahan CA / B", tetapi karena jumlah suara dan potensi bantuan yang diberikan selama bertahun-tahun, saya telah memulihkannya. Ikuti saran di pos yang diberikan saat diberikan.
Jeff Schaller
1

The CommonNameharus bersesuaian dengan apa pun yang dikirim sebagai Host: header permintaan HTTP. Dalam kasus Anda, itu akan menjadi 192.168.1.107 (tanpa garis miring tambahan).

Konfigurasikan nama host untuk server web

Secara pribadi, saya akan mengkonfigurasi nama host yang ramah untuk server web. Dalam konfigurasi Apache mail atau konfigurasi host virtual Anda (kemungkinan berada pada /etc/apache2/sites-enabled/000-default.confdistribusi berbasis Debian), gunakan ServerNameatau ServerAliasdirektifkan, misalnya,

ServerName owncloud.masi

Mulai ulang Apache lalu konfigurasikan DNS atau (lebih sederhana) tambahkan entri di setiap klien /etc/hostsuntuk mengarahkannya ke alamat IP yang benar, misalnya,

192.168.1.107   owncloud.masi
Anthony G - keadilan untuk Monica
sumber
Akses owncloud saya ada di 192.168.1.107. Utas lainnya mengatakan bahwa Anda harus menyertakan subdomain. Saya pikir itu menyiratkan 192.168.1.107/owncloud. Namun, saya bisa saja salah.
Léo Léopold Hertz 준영
Asumsikan Anda gunakan ServerName owncloud.masidi .../sites-enabled/000-default.conf. Apakah commonname dari kunci SSL kemudian owncloud.masi ?
Léo Léopold Hertz 준영
Apakah alamat IP akan berhenti berfungsi? Sama halnya jika Anda menggunakan ServerAlias?
Léo Léopold Hertz 준영
1
Akses melalui alamat IP harus tetap berfungsi untuk HTTP. BTW, kami telah mencapai batas komentar (jadi saya telah menghapus jawaban saya sebelumnya untuk pertanyaan Anda) dan saya harus segera offline.
Anthony G - keadilan untuk Monica
1
"CommonName harus sesuai dengan apa pun yang dikirim sebagai header Host: dalam permintaan HTTP" - Salah. Menempatkan nama host adalah Nama Umum tidak digunakan lagi oleh Forum IETF dan CA / B. Nama server dan Alamat IP selalu masuk dalam Nama Alternatif Subjek per Forum IETF dan CA / B. Juga lihat Bagaimana Anda menandatangani Permintaan Penandatanganan Sertifikat dengan Otoritas Sertifikasi Anda dan Cara membuat sertifikat yang ditandatangani sendiri dengan openssl?