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 wget
dan 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 localhost
adalah: (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 curl
dan wget
tidak 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.pm
hanyalah 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 = test@example.com
# 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
Centos 7 / Vagrant / Chrome Browser
.