Bir şey mi kaçırıyorum? Bu kendinden imzalı bir sertifika oluşturmanın doğru yolu mu?
Kendinden imzalı bir sertifika oluşturmak kolaydır. Sadece openssl req
komutu kullanın. Tarayıcılar ve komut satırı araçları gibi en geniş istemciler tarafından tüketilebilecek bir tane oluşturmak zor olabilir.
Bu zor çünkü tarayıcıların kendi gereksinimleri var ve IETF'den daha kısıtlayıcılar . Tarayıcılar tarafından kullanılan gereksinimler CA / Tarayıcı Forumlarında belgelenmiştir (aşağıdaki referanslara bakın). Kısıtlamalar iki kilit alanda ortaya çıkar: (1) güven bağlantıları ve (2) DNS adları.
Modern tarayıcılar (2014/2015'te kullandığımız warez gibi) güven bağlantısına zincirlenen bir sertifika ister ve DNS adlarının sertifikada belirli şekillerde sunulmasını ister. Ve tarayıcılar aktif olarak kendinden imzalı sunucu sertifikalarına karşı hareket ediyor.
Bazı tarayıcılar, kendinden imzalı bir sunucu sertifikası almayı tam olarak kolaylaştırmaz. Aslında, Android'in tarayıcısı gibi bazı tarayıcılarla yapamazsınız. Yani tam çözüm kendi otoriteniz olmaktır.
Kendi otoriteniz olmadığında, sertifikaya en büyük başarı şansını vermek için DNS adlarını doğru almanız gerekir. Ama sizi kendi otoriteniz olmaya teşvik ediyorum. Kendi otoriteniz olmak kolaydır ve tüm güven sorunlarını ortadan kaldıracaktır (kendinizden daha iyi kim güvenebilir?).
Bu muhtemelen aradığınız site değil!
Bu sitenin güvenlik sertifikası güvenilir değil!
Bunun nedeni, tarayıcıların sunucu sertifikalarını doğrulamak için önceden tanımlanmış bir güven bağlantısı listesi kullanmasıdır. Kendinden imzalı bir sertifika güvenilir bir bağlantıya geri zincirlenmez.
Bundan kaçınmanın en iyi yolu:
- Kendi otoritenizi oluşturun (yani bir CA olun )
- Sunucu için sertifika imzalama isteği (CSR) oluşturma
- Sunucunuzun CSR'sini CA anahtarınızla imzalayın
- Sunucu sertifikasını sunucuya yükleyin
- CA sertifikasını istemciye yükleyin
Adım 1 - Kendi otoritenizi oluşturmak, yalnızca kendinden imzalı bir sertifika CA: true
ve uygun anahtar kullanımı oluşturmak anlamına gelir . Bu, Konu ve Sertifikayı veren kuruluşun aynı varlık olduğu, Temel Kısıtlamalarda CA'nın true olarak ayarlandığı (ayrıca kritik olarak işaretlenmesi gerekir), anahtar kullanımının keyCertSign
ve crlSign
(CRL kullanıyorsanız) ve Konu Anahtarı Tanımlayıcısının (SKI) Yetkili Anahtar Tanımlayıcısı (AKI) ile aynıdır .
Kendi sertifika yetkiliniz olmak için bkz. * Sertifika yetkilinizle nasıl bir sertifika imzalama isteği imzalarsınız? Overflow üzerinde. Ardından, CA'nızı tarayıcı tarafından kullanılan Güven Deposuna alın.
Adım 2 - 4, Startcom veya CAcert gibi bir CA'nın hizmetlerine kaydolduğunuzda , genel olarak karşı karşıya olan bir sunucu için kabaca yaptığınız adımlardır . Adım 1 ve 5, üçüncü taraf otoriteden kaçınmanıza ve kendi otoriteniz gibi davranmanıza izin verir (kendinizden daha iyi kim güvenebilir?).
Tarayıcı uyarısından kaçınmanın bir sonraki en iyi yolu sunucunun sertifikasına güvenmektir. Ancak, Android'in varsayılan tarayıcısı gibi bazı tarayıcılar bunu yapmanıza izin vermez. Yani platformda asla çalışmayacak.
Tarayıcılar (ve diğer benzer kullanıcı aracılarına) sorunu değil kendinden imzalı sertifikaları güvenen Things (IOT) İnternetinde büyük bir sorun olacak. Örneğin, programlamak için termostatınıza veya buzdolabınıza bağladığınızda ne olacak? Cevap, kullanıcı deneyimi açısından iyi bir şey değildir.
W3C'nin WebAppSec Çalışma Grubu bu konuya bakmaya başlıyor. Örneğin, Teklif: HTTP'yi Güvenli Olmayan Olarak İşaretleme konusuna bakın .
OpenSSL ile kendinden imzalı bir sertifika nasıl oluşturulur
Aşağıdaki komutlar ve yapılandırma dosyası kendinden imzalı bir sertifika oluşturur (ayrıca imzalama isteğinin nasıl oluşturulacağını gösterir). Bir açıdan diğer cevaplardan farklıdırlar: Kendinden imzalı sertifika için kullanılan DNS adları Ortak Adı (CN) değil, Konu Alternatif Adı'nda (SAN ) bulunmaktadır .
DNS adları SAN'a satırlı yapılandırma dosyası aracılığıyla yerleştirilir subjectAltName = @alternate_names
(komut satırından bunu yapmanın bir yolu yoktur). Sonra alternate_names
yapılandırma dosyasında bir bölüm var (bunu zevkinize göre ayarlamanız gerekir):
[ 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
# IP.1 = 127.0.0.1
# IP.2 = ::1
DNS adını SAN'a değil CN'ye koymak önemlidir, çünkü hem IETF hem de CA / Tarayıcı Forumları uygulamayı belirtir. Ayrıca CN'deki DNS adlarının onaylanmadığını (ancak yasaklanmadığını) belirtirler. Eğer sen CN bir DNS adı koymak, o zaman gerekir CA / B politikaları altında SAN dahil edilmesi. Böylece Konu Alternatif Adını kullanmaktan kaçınamazsınız.
SAN'a DNS adları koymazsanız, sertifika bir tarayıcı ve CA / Tarayıcı Forumu yönergelerini izleyen diğer kullanıcı aracıları altında doğrulanamaz.
İlgili: tarayıcılar CA / Tarayıcı Forumu ilkelerini izler; ve IETF politikalarını değil. Bu, OpenSSL ile oluşturulan bir sertifikanın (genellikle IETF'yi izleyen) bazen bir tarayıcı altında doğrulanmamasının nedenlerinden biridir (tarayıcılar CA / B'yi takip eder). Farklı standartlardır, farklı ihraç politikaları ve farklı onaylama gereksinimleri vardır.
Kendinden imzalı bir sertifika oluşturun ( -x509
seçeneğin eklenmesine dikkat edin ):
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
İmzalama isteği oluşturun ( -x509
seçeneğin eksikliğine dikkat edin ):
openssl req -config example-com.conf -new -sha256 -newkey rsa:2048 -nodes \
-keyout example-com.key.pem -days 365 -out example-com.req.pem
Kendinden imzalı bir sertifika yazdırın :
openssl x509 -in example-com.cert.pem -text -noout
İmzalama isteği yazdırın :
openssl req -in example-com.req.pem -text -noout
Yapılandırma dosyası ( -config
seçenek üzerinden geçirilir )
[ 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).
# Its 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
# You only need digitalSignature below. *If* you don't allow
# RSA Key transport (i.e., you use ephemeral cipher suites), then
# omit keyEncipherment because that's key transport.
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
# In either case, you probably only need serverAuth.
# 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
# In either case, you probably only need serverAuth.
# 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
Chrome için aşağıdakileri yapmanız gerekebilir. Aksi takdirde Chrome, Ortak Adın geçersiz olduğundan şikayet edebilir ( ERR_CERT_COMMON_NAME_INVALID
) . Bu örnekte SAN'daki bir IP adresi ile bir CN arasındaki ilişkinin ne olduğundan emin değilim.
# IPv4 localhost
# IP.1 = 127.0.0.1
# IPv6 localhost
# IP.2 = ::1
X.509 / PKIX sertifikalarında DNS adlarının işlenmesine ilişkin başka kurallar da vardır. Kurallar için bu belgelere bakın:
RFC 6797 ve RFC 7469 listelenmiştir, çünkü bunlar diğer RFC ve CA / B belgelerinden daha kısıtlayıcıdır. RFC 6797 ve 7469 da bir IP adresine izin vermez.