Jak mogę zweryfikować / odczytać CSR odnowienia SSL IIS7 za pomocą OpenSSL

10

Mam zaszczyt obsługiwać ~ 5 raportów CSR SSL tygodniowo, sprawdzając ich ważność przed przekazaniem ich do naszego CA w celu podjęcia działań. Używam OpenSSL na maszynie Ubuntu, aby sprawdzić, czy są one poprawne, testując takie rzeczy, jak poprawna nazwa jednostki organizacyjnej, rozsądna CN, rozmiar klucza> = 2048 bitów i tak dalej, ponieważ nasze żądania są czasami nieprawidłowe.

Innego dnia otrzymałem prośbę o odnowienie z maszyny IIS7. Nie mogę w ogóle wymyślić, jak to przeczytać, używając OpenSSL. Jest ważny, ponieważ mój CA go zaakceptował ...

„plik (1)” mówi, że jest to „tekst żądania podpisania certyfikatu bezpieczeństwa RFC1421”, co oznacza około 50% CSR, które tu mam (pozostałe to „żądanie certyfikatu PEM”).

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

openssl req, który czyta CSR (PKCS # 10) nie rozumie go ...

$ 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:

Ten artykuł Andreasa Kleina na blogach MSDN sugeruje, że CSR odnawiania IIS7 to kontener PKCS # 7 z CSR i podpisem opartym na bieżącym certyfikacie ... ale nadal nie mogę go przeczytać.

$ 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

Mogę użyć „openssl base64” do zdekodowania pliku, aw wynikowym pliku binarnym widzę ciągi, które wyglądają jak CSR, oraz niektóre odwołania do urzędu certyfikacji, które musiały pochodzić z podpisu opartego na starym certyfikacie. Idea kontenera (CSR, podpis) brzmi więc realistycznie.

Ale nadal nie mogę znaleźć sposobu na odczytanie CSR, który tam jest! Próbowałem już wielu rzeczy, nie wymienię tutaj szczegółów, ale oto najważniejsze różnice, które wypróbowałem: pkcs12 pkcs7 PEM DER rex x509 sprawdź ...

Niestety nie mogę tutaj opublikować samego CSR. Czy ktoś może mi pomóc wymyślić sposób odczytu / weryfikacji tego pliku?

Jim Cheetham
źródło
Czy przypadkiem żądanie zawiera atrybuty szukające alternatywnej nazwy podmiotu?
Shane Madden,
Wątpię - dotyczy wewnętrznego serwera o jednej nazwie. Oczywiście certyfikaty, które otrzymujemy, zwykle mają pole SAN z „www”. przymusowo wstawiony, ale żyjemy z tym!
Jim Cheetham
certutil z komputera z systemem Windows przeczyta ten certyfikat i opisuje go jako komunikat PKCS7 z żądaniem certyfikatu PKCS10 (zawierającym certyfikat x509 ze starego urzędu certyfikacji) i łańcuchem certyfikatu zawierającym kolejny certyfikat x509). „certutil -split” rozbija te części, a Blob0_1.p10 to CSR, który mam nadzieję znaleźć w formacie DER. Zbliżam się ... i tak, w żądaniu znajduje się pole SAN, które prawdopodobnie wynika z wymuszonego wstawienia „www”. kiedy w zeszłym roku otrzymaliśmy oryginalny certyfikat ...
Jim Cheetham
1
openssl asn1parsemogę odczytać żądanie, a stamtąd mogę wyodrębnić normalny CSR. Nie potrafię jeszcze odpowiedzieć samemu (rozwiązałem to zbyt szybko), więc zaktualizuję pytanie o rozwiązanie, a następnie naprawię je jutro :-)
Jim Cheetham
Fajne, dobre znalezisko!
Shane Madden,

Odpowiedzi:

8

Struktura tego żądania odnowienia IIS7 jest w rzeczywistości dość elegancka. Wydaje się, że zaczyna się od założenia, że ​​ponieważ jest to żądanie odnowienia bieżącego certyfikatu, musi udowodnić, że żądanie pochodzi od właściwego hosta - tj. Hosta, który faktycznie używa bieżącego certyfikatu i & jest właścicielem powiązanego prywatnego klucz. W świecie internetowym udowadniasz, że możesz zażądać odnowienia certyfikatu, uwierzytelniając się w urzędzie certyfikacji jako oryginalny użytkownik, zamiast tworzyć podpisany raport CSR.

Aby udowodnić prawo do wydania wniosku o odnowienie, IIS7 tworzy normalny CSR (obiekt PKCS # 10), a następnie podpisuje go i podaje certyfikat klucza, który go podpisał.

  • CSS odnowienia IIS7
    • Dane PKCS # 7
      • Dane PKCS # 10 (zwykły CSR)
    • Normalny certyfikat serwera
    • Wydawanie danych urzędu certyfikacji
    • Podpis RSA (zakładam)

Użyj, openssl asn1parse -in iis7rcsr -iaby zobaczyć strukturę pliku i porównać z normalnymi raportami CSR. Powinieneś zobaczyć OCTET STRING na początku w obiekcie oznaczonym „: pkcs7-data”, który musisz wyodrębnić, aby uzyskać CSR.

$ 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...

Aby wyciągnąć stąd rzeczywisty CSR PKCS # 10, potrzebujemy numeru przesunięcia „58” w tym przykładzie. Następnie możemy użyć tego przesunięcia do wyodrębnienia wersji binarnej tego obiektu:

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

Następnie możemy odczytać ten plik wyjściowy „thecsr” openssl req, pamiętając o określeniu formatu wejściowego DER.

$ 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
...

Mogę to wszystko zawrzeć w jednym wierszu polecenia bez plików tymczasowych (ale niestety 2 odczyty oryginalnego certyfikatu), o ile mogę używać Linuksa /proc/self/fd/do oszukiwania openssl (zrobi natywne sztuczki z deskryptorami plików do obsługi hasła, ale nietypowa moc wyjściowa).

$ 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):
...

Ta długa linia poleceń jest bezpośrednio równoważna prostej openssl req -in non-iis7rcsr -noout -text, której zwykle używam :-)

Jim Cheetham
źródło
To CMC tools.ietf.org/html/rfc5272#section-3.2
Daniel Fisher lennybacon
2

Dzięki Jim za te doskonałe informacje, które były bardzo pomocne, miałem dokładnie ten sam problem, próbując odnowić certyfikat serwera w2008 / IIS7.

Dodałbym tylko jedną rzecz. Możesz wyodrębnić CSR w formacie P10 bezpośrednio za pomocą następującej komendy: certutil -split iis7rcsr (iis7rcsr to .csr, który otrzymujesz za pośrednictwem menedżera IIS). Plik csr zostanie następnie wyodrębniony do pliku o nazwie blob0_1.p10 Jest w formacie binarnym (DER), może być konieczne zakodowanie go w standardzie base64 za pomocą następującego polecenia: certutil -encode blob0_1.p10 finalcsr.csr

Jest jednak ostatni problem. Następnie odkryłem, zrzucając zawartość .csr z openssl, że proces odnawiania automatycznie wymusił użycie klucza 1024-bitowego (mimo że oryginalny klucz prywatny utworzony na serwerze dla certyfikatu serwera miał długość 2048 bitów). Wygląda na to, że nie można wymusić użycia kluczy 2048 bitów przy użyciu procesu odnawiania IIS7.

Jedyną dobrą opcją wydaje się być utworzenie nowego klucza / certyfikatu i niestosowanie procesu odnawiania.

Florent Vélu
źródło