İmzalı sertifikaları geçersiz kılmadan kendinden imzalı kök CA'yı yeniden verme


12

Şirketimde kendim yapılandırdığım (çoğunlukla HTTPS üzerinden sunulan) birkaç dahili hizmet için kendinden imzalı bir kök Sertifika Yetkilisi oluşturdum. Daha sonra bu CA ile imzalanan hizmetler için sertifikalar oluşturdum.

Şimdi bu CA'dan verilen mevcut sunucu sertifikalarını geçersiz kılmadan kök CA'ya bir x509 uzantısı (CRL dağıtım noktası) eklemek istiyorum. Mümkün mü?

Bağırsak hissim "evet" çünkü anladığım gibi, ilgili özel anahtara erişim, sertifika kimliği üzerinde "tam yetki" için gerekli ve yeterlidir. Diğer bir deyişle, oluşturulduğunda (büyük olasılıkla) ortak anahtarla birlikte sertifikaya dahil edilmiş bir tür nonce olmadığı sürece.

SSL sertifika yönetiminde hala oldukça yeniyim, ancak standart güven zincirinin temellerini anlıyorum (sanırım). Diğer PKI kriptolarının temel kullanımı konusunda da rahatım: SSH anahtarlarını yönetiyorum ve imzalama ve şifreleme için GPG kullanıyorum. Bilgisayar Bilimi okudum, ancak kriptografide sadece kendi kendini yetiştirmiş bir dabblerım.

Asla orijinal IIRC için bir CSR yapmadım (doğrudan çıktı olduğunu düşünüyorum openssl req -new -x509). Elbette orijinal CA'nın özel anahtarına sahibim ve bunu kullanarak orijinal sertifikayı bir Sertifika İmzalama İsteği'ne "tersine çevirebildim": openssl x509 -x509toreq -in MyCA.pem -out MyCA.csr -signkey private/MyCA.key

Bunun yukarıda belirtilen nonce'yi etkili bir şekilde "çıkarmasını" ve sertifikayı yeniden oluşturmama izin vermesini umuyordum, ancak bu sefer bir crlDistributionPointsalanla ve sonuç olarak orijinal CA ile imzalanan tüm sertifikalar, istisna dışında bu yeni CA'ya karşı hala geçerli olacağını umuyordu. istemcilerin (şu anda boş olan) CRL dosyamı, alanda belirtilen HTTP URL'sinden alacağını.

Bu yüzden bir uzantı yapılandırma dosyası yaptım ext.conf:

[ cert_ext ] 
subjectKeyIdentifier=hash
crlDistributionPoints=URI:http://security.mycompany.co.za/root.crl

Ve CSR'den kök CA'nın yeni sürümünü oluşturdum:

openssl x509 -extfile ./ext.conf -extensions cert_ext -req -signkey private/MyCA.key -in MyCA.csr -out MyNewCA.pem

Şimdi sertifikayı ile görüntülediğimde openssl x509 -text -in MyNewCA.pem | less

CRL uzantısı bölümünü görebilirsiniz:

X509v3 extensions:
    X509v3 Subject Key Identifier: 
        82:D0:01:03:49:FF:30:16:FA:DC:0A:1E:C1:8C:3D:66:A1:78:FF:F8
    X509v3 CRL Distribution Points: 

        Full Name:
          URI:http://security.mycompany.co.za/root.crl`

Ama ne yazık ki! Önceden imzalanmış sertifikalarım artık bu sertifikayı doğrulamıyor:

openssl verify -verbose -CAfile MyCA.pem git.pem 
git.pem: OK

openssl verify -verbose -CAfile MyNewCA.pem git.pem 
git.pem: <redacted DN>
error 20 at 0 depth lookup:unable to get local issuer certificate

Çoğunlukla sertifikaların nasıl çalıştığına ve nedenine dair daha fazla bilgi ediniyorum. Ama buna yol açan soruna bir çözüm de memnuniyetle karşılarım, bu yüzden bazı arka plan bilgileri de burada.

Bu işe nasıl bulaştığını: my CA Windows üzerinde Belgesi GUI yükleyin → Explorer RMB üzerinden yüklenen ya bir kez HTTPS iç hizmetlerine büyük iş /usr/local/share/ca-certificatestakip update-ca-certificatesDebian ve Ubuntu üzerinde. Ancak son zamanlarda bir istisna ile karşılaştım: Windows'ta Git, özellikle Windows Güvenli Kanal'ı SSL arka ucu olarak kullanmak için yüklendiyse. Görünüşe göre varsayılan olarak SSL sertifikalarında bir CRL alanı olması gerektiği konusunda ısrar ediyor.

Bu yüzden gerçekten bir Windows Güvenli Kanal sorunu çünkü çalıştırmaya devam ediyorum hata mesajı tamamen Microsoft'a özgü görünüyor sanırım: fatal: unable to access 'https://angery@git.mycompany.co.za/gitblit/r/secret_project.git/': schannel: next InitializeSecurityContext failed: Unknown error (0x80092012) - The revocation function was unable to check revocation for the certificate.

Git'i OpenSSL ile kurarsam ve CA'mı git.http.sslcainfo tarafından işaret edilen dosyaya manuel olarak birleştirirsem işe yarar, ancak kullanıcılarımın bu işlemin "kolay" Windows sertifika yükleyici GUI'sini tıklayarak.


1
Yalnızca ortak anahtar ve Konu bir sertifikayı benzersiz kılar. Bu nedenle, ikisini de değiştirmezseniz, kalbinizin içeriğiyle ilgili diğer tüm alanları ve uzantıları değiştirirken sertifikanızı yeniden imzalayabilmeniz gerekir.
garethTheRed

@garethTheRed ah, bu mantıklı. Bunu nasıl yapacağımdan emin değilim; daha fazla ayrıntıyla cevap verebilir misiniz? Bunun -x509toreqmevcut kök CA'dan tüm benzersiz bilgileri kurtaracağını umuyordum , ancak ya o ya da işlemimde bir sorun var.
AngerySysadmin

1
req -new -x509ve x509 -req -signkeyher ikisi de kendinden imzalı sertifikanın serisini rasgele bir sayıya varsayılan olarak (bu geçersiz kılsa da) etkili bir şekilde bir nonce. Alt sertifikanız (veya bunlardan herhangi biri) 'yayıncı + seri' seçeneğini ('anahtar kimliği' seçeneği yerine veya buna ek olarak) kullanarak AuthorityKeyIdentifier içeriyorsa ca, yukarı akış varsayılan yapılandırma dosyasıyla kullanmanız durumunda eskisiyle aynı seriye sahip yeni bir kök oluşturmanız gerekir; kullanın -set_serial. ...
dave_thompson_085

... Ancak mevcut olanla aynı ada ve seriye sahip yeni bir sertifikayı almaya çalışırsanız bazı sw'ler mutsuz olabilir; önce eskisini temizlemeniz gerekebilir.
dave_thompson_085

1
Cross-cross-dupe security.stackexchange.com/questions/17331/… PS: Windows'un bir CA için CRL'yi manuel olarak önbelleğe almasının mümkün olduğunu düşünüyorum , bu durumda CRLDP eksikliği önemli olmayabilir, ancak bu ne kadar rahatsız edici olabilir Bilmiyorum.
dave_thompson_085

Yanıtlar:


6

İki sertifika, Sertifikaların Konu Adı ve Ortak Anahtarı eşleştiği sürece aynı kabul edilir .

Bu nedenle, tek yapmanız gereken anahtarları yeniden kullanmak ve yeni sertifikadaki Konu Adının eskisiyle aynı olduğundan emin olmaktır. Bundan sonra, diğer alanlardan ve / veya uzantılardan herhangi birini değiştirebilirsiniz; sonuçta elde edilen sertifika aynı kabul edilir.

Örneğin, OpenSSL yapılandırma dosyanızı oluşturun:

[ req ]

prompt             = no
string_mask        = default
distinguished_name = x509_distinguished_name
x509_extensions     = x509_ext

[ x509_distinguished_name ]

# Note that the following are in 'reverse order' to what you'd expect to see.
# Adjust for your setup:

countryName = za
organizationName = My Company
organizationalUnitName = Security
commonName = My Root CA

[ x509_ext ]

basicConstraints = critical,CA:true
keyUsage = critical, keyCertSign, cRLSign
subjectKeyIdentifier = hash
crlDistributionPoints = URI:http://security.mycompany.co.za/root.crl

ve örneğin kaydedin rootca.cnf. Öğelerinin öğelerinin, [req_distinguished_name]orijinal Kök CA sertifikanızdakilerle aynı olduğundan emin olun (bu, aynı Konu Adı bölümüdür).

Sonra, çalıştırın:

openssl req -new -x509 -key rootca.key -out MyNewCA.pem -config rootca.cnf

rootca.keyorijinal sertifikada kullanılan özel anahtar nerede (bu, aynı Genel / Özel Anahtar kısmıdır).

Bu MyNewCA.pem, aşağıdakileri kontrol edebileceğiniz oluşturur :

$ openssl x509 -noout -text -in MyNewCA.pem

Certificate:
Data:
    Version: 3 (0x2)
    Serial Number: 17564687072266118846 (0xf3c24dd49d5166be)
Signature Algorithm: sha256WithRSAEncryption
    Issuer: C=za, O=My Company, OU=Security, CN=My Root CA
    Validity
        Not Before: Jul 15 05:05:54 2017 GMT
        Not After : Aug 14 05:05:54 2017 GMT
    Subject: C=za, O=My Company, OU=Security, CN=My Root CA
    Subject Public Key Info:
        Public Key Algorithm: rsaEncryption
            Public-Key: (2048 bit)
            Modulus:
                00:c8:3d:32:8a:56:31:f6:27:1a:ce:9e:b2:1d:fb:
                ce:9f:ce:5b:42:25:aa:fe:8b:f4:34:32:ac:b3:02:
                50:71:f8:c3:43:0c:c7:2c:9f:fe:48:1b:c6:c0:e7:
                d6:44:a9:e7:d7:a0:7e:58:f4:b6:38:61:7e:d0:af:
                0f:56:21:e7:49:7a:66:13:f5:7a:fe:3d:ab:65:f8:
                01:eb:52:a7:3b:ae:a0:cf:50:57:b9:e0:09:0b:1f:
                90:14:fb:18:56:1d:57:99:a9:76:a2:63:d1:c2:d3:
                a3:f4:3a:ff:91:0d:ee:8d:44:13:58:00:09:93:da:
                e8:6a:fd:64:5f:c3:42:8e:2a:49:6e:0d:73:b7:b9:
                d4:6c:c6:ce:30:c5:82:24:a5:00:37:17:a0:1d:f1:
                c9:e9:e3:18:48:22:4f:33:96:a7:3c:a9:31:f1:3f:
                14:40:6a:74:e8:78:82:45:04:d4:4b:56:0b:cd:be:
                48:8d:03:fb:39:70:0b:91:99:70:06:bd:5e:8b:f2:
                d1:f4:6f:fc:ce:e7:f8:3c:0a:20:ea:35:b8:5f:2f:
                ee:8d:ff:d3:93:85:6b:fb:71:db:1b:e6:e9:1d:a7:
                f8:e4:ae:f4:71:fe:35:a7:89:24:af:69:a4:34:3b:
                14:66:05:02:5e:2a:1d:ac:e0:d2:48:6c:13:4e:75:
                58:93
            Exponent: 65537 (0x10001)
    X509v3 extensions:
        X509v3 Basic Constraints: critical
            CA:TRUE
        X509v3 Key Usage: critical
            Certificate Sign, CRL Sign
        X509v3 Subject Key Identifier: 
            3B:45:93:3A:2A:BC:39:29:36:13:6C:BD:B6:B4:31:C7:E7:BB:32:73
        X509v3 CRL Distribution Points: 

            Full Name:
              URI:http://security.mycompany.co.za/root.crl

Signature Algorithm: sha256WithRSAEncryption
     4d:96:d4:03:4f:e3:7c:26:be:59:f8:23:87:60:f7:4c:d3:a1:
     1c:77:a1:14:e3:e7:da:c8:2a:a3:1b:06:2a:4d:55:1c:83:26:
     73:46:0d:8a:e4:b7:d1:1e:38:cc:78:90:00:01:b3:8e:f9:3c:
     62:be:04:09:90:4e:22:87:b1:aa:bd:f9:73:bd:a7:76:ad:d5:
     ae:2d:7a:1c:1e:1a:67:c8:57:4c:f9:6d:8b:62:d6:e5:ea:e0:
     40:5c:12:28:7e:ea:f0:0c:d6:cd:f4:1d:d5:56:09:ad:43:b4:
     eb:8c:68:ce:56:a2:a8:ae:a4:d5:35:bb:58:b8:ed:82:82:b5:
     ef:cb:e2:6d:76:61:ed:ee:a5:1f:68:95:07:ed:5b:f0:65:92:
     d2:dc:1d:c6:fa:7f:e0:c9:38:c2:c6:6f:03:38:e7:3a:b0:24:
     06:e0:bc:07:dd:e7:a0:dc:74:09:e5:37:7b:66:e1:6f:47:4c:
     71:ff:02:48:7f:d4:4f:ce:cb:91:e9:ee:cd:b6:f1:0a:03:19:
     3e:19:05:7d:8f:48:e7:f1:cc:07:37:3d:91:3c:6f:54:71:3c:
     a2:6c:55:c3:03:c1:7f:eb:9e:70:f1:8f:a1:fb:62:33:8b:86:
     2c:79:bc:76:e2:01:9a:68:df:af:40:a1:b2:9c:f6:a1:e1:6e:
     2a:dd:1a:d6

Bu yeni sertifikayı orijinal yerine kullanın.

Sertifikanın geçerlilik süresi gibi diğer alanları ve uzantıları değiştirebilirsiniz, ancak basicConstraints = critical,CA:trueKök CA sertifikasında gerçekten de (dışında ) herhangi bir kısıtlamanızın olmaması gerektiğini unutmayın .


Daha ayrıntılı bir incelemeden sonra, sorununuz yeni kök CA sertifikanızın basicConstraintve muhtemelen keyUsageuzantılara sahip olmamasından kaynaklanıyor olabilir . Bu iki uzantıyı ilkinize eklemeye ext.confve ortaya çıkan yeni Root CA sertifikasını -x509toreqyayınladığınız yöntemi kullanarak test etmeye değer olabilir .


Kapsamlı cevap için teşekkürler, gerçekten şeyleri daha iyi anlamama yardımcı oldu. Bu ve @ dave_thompson_085'in yorumlarıyla CA'mı çocuk sertifikalarını geçersiz kılmayacak şekilde yeniden oluşturmayı başardım. Orijinal girişimimde birkaç yanlışlık vardı (muhtemelen daha ayrıntılı bir cevap göndermeliyim?) Geriye dönük bariz fakat önemli nokta için "Konu Adı" nın bu belirli alanlardan oluşan bir alan olduğu için teşekkürler. Bir şekilde başka birinin cevap göndereceğinden şüpheliyim, bu yüzden bunu kabul ediyorum.
AngerySysadmin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.