OpenSSL ile IIS7 SSL yenileme CSR'sini nasıl doğrulayabilir / okuyabilirim


10

Haftada ~ 5 SSL CSR'yi işleme koyma, bunları işlem için CA'mıza iletmeden önce geçerliliklerini kontrol etme ayrıcalığım var. Geçerli olduklarını kontrol etmek için bir Ubuntu makinesinde OpenSSL kullanıyorum, doğru OU adı, makul bir CN, anahtar boyutu> = 2048 bit ve benzeri gibi şeyleri test ediyoruz, çünkü taleplerimiz bazen yanlış olabilir.

Geçen gün bir IIS7 makinesinden bir yenileme isteği aldım. OpenSSL kullanarak bunu nasıl okuyacağımı anlayamıyorum. CA'm kabul ettiği için geçerlidir ...

'file (1)', bu belgenin burada bulunan CSR'lerin ~% 50'si için söylediği "RFC1421 Güvenlik Sertifikası İmzalama İsteği metni" olduğunu söylüyor (geri kalanı "PEM sertifika isteği" dir).

$ head iis7rcsr
-----BEGIN NEW CERTIFICATE REQUEST-----
MIIQsQYJKoZIhvcNAQcCoIIQojCCEJ4CAQExCzAJBgUrDgMCGgUAMIIJegYJKoZI
hvcNAQcBoIIJawSCCWcwggljMIIIzAIBADCB2zELMAkGA1UEBhMCTloxDTALBgNV
BBEMBDkwNTQxDjAMBgNVBAgMBU90YWdvMRAwDgYDVQQHDAdEdW5lZGluMRwwGgYD
...
...

openssl req, CSR'leri (PKCS # 10) okuyan bunu anlayamıyor ...

$ openssl req -in iis7rcsr -text
unable to load X509 request
5156:error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag:tasn_dec.c:1316:
5156:error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error:tasn_dec.c:380:Type=X509_REQ_INFO
5156:error:0D08303A:asn1 encoding routines:ASN1_TEMPLATE_NOEXP_D2I:nested asn1 error:tasn_dec.c:748:Field=req_info, Type=X509_REQ
5156:error:0906700D:PEM routines:PEM_ASN1_read_bio:ASN1 lib:pem_oth.c:83:

MSDN bloglarındaki Andreas Klein'ın bu makalesi, IIS7 yenileme CSR'lerinin geçerli sertifikaya dayalı bir CSR ve imza içeren bir PKCS # 7 kapsayıcısı olduğunu gösteriyor ... ancak yine de okuyamıyorum.

$ openssl pkcs7 -in iis7rcsr -text
unable to load PKCS7 object
6581:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:650:Expecting: PKCS7

Dosyayı çözmek için 'openssl base64' kullanabilirim ve ortaya çıkan ikili dosyada CSR'ye benzeyen dizeleri ve eski sertifikaya dayalı bir imzadan gelmiş olması gereken bazı CA referanslarını görebilirim. Konteyner (KSS, imza) fikri akla yatkın geliyor.

Ama yine de içerideki KSS'yi okumak için bir yol bulamıyorum! Bir çok şey denedim, burada ayrıntıları listelemeyeceğim, ancak burada denediğim varyasyonların yüksek noktaları: pkcs12 pkcs7 PEM DER req x509 doğrula ...

KSS'yi burada maalesef gönderemiyorum. Herkes bu dosyayı okumak / doğrulamak için bir yol bulmama yardımcı olabilir mi?


Şans eseri, istek Alternatif Konu Adı arayan özellikler içeriyor mu?
Shane Madden

Ben şüphe - tek bir isim ile bir iç sunucu içindir. Tabii ki geri aldığımız sertifikalar genellikle 'www' ile SAN alanına sahiptir. zorla yerleştirildi, ama bununla yaşıyoruz!
Jim Cheetham

Windows makinesinden certutil bu sertifikayı okuyacak ve bir PKCS10 Sertifika İsteği (eski CA'dan x509 sertifikası içeren) ve başka bir x509 sertifikası içeren bir sertifika zinciri içeren bir PKCS7 mesajı olarak açıklanmaktadır. 'certutil -split' bu parçaları dağıtır ve Blob0_1.p10, DER biçiminde bulmayı umduğum CSR'dir. Bu yüzden yaklaşıyorum ... ve evet, istekte muhtemelen 'www'nin zorla yerleştirilmesinin bir sonucu olan bir SAN alanı var. Geçen sene orijinal sertifikayı aldığımızda ...
Jim Cheetham

1
openssl asn1parseisteği okuyabilir ve oradan normal CSR'yi çıkarabilirim. Henüz kendi kendine cevap veremiyorum (çok hızlı bir şekilde çözdüm) bu yüzden soruyu çözümle güncelleyeceğim ve yarın düzeltecağım :-)
Jim Cheetham

Güzel, iyi bulmak!
Shane Madden

Yanıtlar:


8

Bu IIS7 yenileme isteğinin yapısı aslında oldukça zariftir. Bu , mevcut bir sertifikanın yenilenmesi için bir talep olduğu için, talebin doğru ana bilgisayardan geldiğini kanıtlaması gerektiği anlaşılıyor - yani mevcut sertifikayı kullanan ana bilgisayar, ilişkili özel tuşuna basın. İnternet dünyasında, imzalı bir CSR oluşturmak yerine CA'nızın orijinal kullanıcısı olarak kimlik doğrulaması yaparak sertifika için yenileme talebinde bulunmanıza izin verildiğini kanıtlamış olursunuz.

Yenileme isteği verme hakkını kanıtlamak için, IIS7 normal bir CSR (PKCS # 10 nesnesi) oluşturur ve bunu imzalar ve imzalayan anahtarın sertifikasını sağlar.

  • IIS7 yenileme CSR
    • PKCS # 7 Verileri
      • PKCS # 10 Verileri (normal CSR)
    • Normal sunucu sertifikası
    • CA verisi düzenleme
    • RSA imzası (sanırım)

openssl asn1parse -in iis7rcsr -iDosyanın yapısını görmek için kullanın ve bunu normal CSR'lerle karşılaştırın. CSR'yi elde etmek için çıkarmanız gereken şey olan ": pkcs7-data" etiketli bir nesnede başlangıca yakın bir OCTET STRING görmelisiniz.

$ openssl asn1parse -in iis7rcsr -i
0:d=0  hl=4 l=4273 cons: SEQUENCE          
4:d=1  hl=2 l=   9 prim:  OBJECT            :pkcs7-signedData
15:d=1  hl=4 l=4258 cons:  cont [ 0 ]        
19:d=2  hl=4 l=4254 cons:   SEQUENCE          
23:d=3  hl=2 l=   1 prim:    INTEGER           :01
26:d=3  hl=2 l=  11 cons:    SET               
28:d=4  hl=2 l=   9 cons:     SEQUENCE          
30:d=5  hl=2 l=   5 prim:      OBJECT            :sha1
37:d=5  hl=2 l=   0 prim:      NULL              
39:d=3  hl=4 l=2426 cons:    SEQUENCE          
43:d=4  hl=2 l=   9 prim:     OBJECT            :pkcs7-data
54:d=4  hl=4 l=2411 cons:     cont [ 0 ]        
58:d=5  hl=4 l=2407 prim:      OCTET STRING      [HEX DUMP]:3082096330820...

Asıl PKCS # 10 CSR'sini buradan çıkarmak için, bu örnekte "58" ofset numarasına ihtiyacımız var. Daha sonra bu ofseti, nesnenin ikili sürümünü ayıklamak için kullanabiliriz:

$ openssl asn1parse -in iis7rcsr -strparse 58 -out thecsr -noout

Daha sonra openssl reqDER girdi biçimini belirtmeyi hatırlayarak bu çıktı dosyasını 'thecsr' ile okuyabiliriz .

$ openssl req -in thecsr -inform DER -text -noout
Certificate Request:
Data:
    Version: 0 (0x0)
    Subject: (normal CSR Subject: line, censored)
    Subject Public Key Info:
        Public Key Algorithm: rsaEncryption
...

Tüm bunları geçici dosyalar olmadan tek bir komut satırına (ancak ne yazık ki orijinal sertifikadan 2 okuma) sarabilirim, Linux'un /proc/self/fd/openssl'i kandırmak için kullanabileceğim sürece (şifre işleme için dosya tanımlayıcılarıyla yerel numaralar yapacak, ancak normal çıktı değil).

$ openssl asn1parse -in iis7rcsr -strparse $(openssl asn1parse -in iis7rcsr | grep -A2 ':pkcs7-data'|tail -1|cut -d: -f1) -out /dev/stdout -noout | openssl req -inform DER -noout -text

Certificate Request:
Data:
    Version: 0 (0x0)
    Subject: (Subject: line censored again)
    Subject Public Key Info:
        Public Key Algorithm: rsaEncryption
        RSA Public Key: (1024 bit)
            Modulus (1024 bit):
...

Bu uzun komut satırı doğrudan openssl req -in non-iis7rcsr -noout -textnormalde kullandığım basit eşdeğer :-)



2

Büyük ölçüde yardımcı olan bu mükemmel bilgi için teşekkürler Jim, bir w2008 / IIS7 sunucu sertifikasını yenilemeye çalışırken aynı sorunu vardı.

Sadece bir şey eklerdim. CSR'yi doğrudan aşağıdaki komutla P10 biçiminde ayıklayabilirsiniz: certutil -split iis7rcsr (iis7rcsr, IIS yöneticisi aracılığıyla aldığınız .csr'dir). Daha sonra csr, blob0_1.p10 İkili biçimdedir (DER) adlı bir dosyada ayıklanır , base64 içinde aşağıdaki komutla kodlamanız gerekebilir: certutil -encode blob0_1.p10 finalcsr.csr

Yine de son bir sorun var. Daha sonra, .csr içeriğini, yenileme işleminin otomatik olarak 1024 bit anahtarının kullanımını zorladığını keşfetti. Öyleyse, IIS7'nin yenileme işlemini kullanarak 2048 bit anahtarlarının kullanımını zorlayamazsınız.

Tek iyi seçenek, yenileme işlemini kullanmamak için yeni bir anahtar / sertifika oluşturmak gibi görünüyor.

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.