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?
źródło
openssl asn1parse
mogę 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 :-)Odpowiedzi:
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ł.
Użyj,
openssl asn1parse -in iis7rcsr -i
aby 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.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:
Następnie możemy odczytać ten plik wyjściowy „thecsr”
openssl req
, pamiętając o określeniu formatu wejściowego DER.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
Ta długa linia poleceń jest bezpośrednio równoważna prostej
openssl req -in non-iis7rcsr -noout -text
, której zwykle używam :-)źródło
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 nazwieblob0_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.
źródło