OpenSSL을 사용하여 IIS7 SSL 갱신 CSR을 확인 / 읽는 방법


10

주당 ~ 5 개의 SSL CSR을 처리 할 수있는 권한이 있으며, 유효성을 검사하여 CA로 전달하여 조치를 취합니다. 우분투 컴퓨터에서 OpenSSL을 사용하여 올바른 OU 이름, 감지 가능한 CN, 키 크기> = 2048 비트 등과 같은 것들을 테스트하고 요청이 올바르지 않기 때문에 유효한지 확인합니다.

다른 날 에는 IIS7 컴퓨터에서 갱신 요청을 받았습니다 . OpenSSL을 사용하여 이것을 읽는 방법을 전혀 알 수 없습니다. 내 CA가 수락 했으므로 유효합니다 ...

'file (1)'은 "RFC1421 보안 인증서 서명 요청 텍스트"라고하는데, 여기 내가 가지고있는 CSR의 ~ 50 % (나머지는 "PEM 인증서 요청")입니다.

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

openssl reqCSR (PKCS # 10)을 읽는 CSR을 이해하지 못합니다 ...

$ 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 블로그에있는 Andreas Klein의이 기사는 IIS7 갱신 CSR이 현재 인증서를 기반으로하는 CSR 및 서명이있는 PKCS # 7 컨테이너라고 제안하지만 여전히 읽을 수는 없습니다.

$ 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

'openssl base64'를 사용하여 파일을 디코딩 할 수 있으며 결과 이진 파일에서 CSR처럼 보이는 문자열과 이전 인증서를 기반으로 서명에서 가져온 일부 CA 참조를 볼 수 있습니다. 컨테이너 (CSR, 서명)의 개념은 그럴듯하게 들립니다.

그러나 나는 여전히 거기에있는 CSR을 읽는 방법을 찾을 수 없습니다! 나는 많은 것들을 시도했지만 여기에 세부 사항을 나열하지는 않지만 시도한 변형의 높은 점은 다음과 같습니다. pkcs12 pkcs7 PEM DER req x509 verify ...

불행히도 CSR 자체를 게시 할 수 없습니다. 누구 든지이 파일을 읽거나 확인하는 방법을 알아낼 수 있습니까?


우연히 요청에 주제 대체 이름을 찾는 속성이 포함되어 있습니까?
Shane Madden

의심합니다. 단일 이름의 내부 서버를위한 것입니다. 물론 우리가 얻는 인증서에는 대개 'www'가있는 SAN 필드가 있습니다. 강제로 삽입되었지만 우리는 그와 함께 산다!
Jim Cheetham

Windows 시스템의 certutil은이 인증서를 읽고 PKCS10 인증서 요청 (이전 CA의 x509 인증서 포함) 및 다른 x509 인증서가 포함 된 인증서 체인이 포함 된 PKCS7 메시지라고 설명합니다. 'certutil -split'은 이러한 부분을 구분하며 Blob0_1.p10은 DER 형식으로 찾고자하는 CSR입니다. 그래서 점점 가까워지고 있습니다. 그렇습니다. 요청에 SAN 필드가 있는데, 아마도 'www'를 강제로 삽입 한 결과 일 것입니다. 우리는 작년에 원래의 인증서를 받았을 때 ...
짐 Cheetham

1
openssl asn1parse요청을 읽을 수 있으며 거기에서 정상적인 CSR을 추출 할 수 있습니다. 내가 할 수없는자가 대답 아직 내가 :-) 솔루션과 질문을 업데이트 한 다음 내일 고칠거야 그래서 (너무 빨리 그것을 해결)
짐 Cheetham

좋은, 잘 찾아라!
Shane Madden

답변:


8

이 IIS7 갱신 요청의 구조는 실제로 매우 우아합니다. 현재 인증서 를 갱신하기 위한 요청이므로 요청이 올바른 호스트에서 온 것임을 증명해야합니다. 즉, 현재 인증서를 실제로 사용하는 호스트 & ∴가 연결된 개인을 소유하고 있음을 전제로 시작하는 것 같습니다. 키. 인터넷 세계에서는 서명 된 CSR을 만들지 않고 CA에 원래 사용자로 인증하여 인증서 갱신을 요청할 수 있음을 증명합니다.

갱신 요청을 발행 할 권리를 증명하기 위해 IIS7은 일반 CSR (PKCS # 10 오브젝트)을 작성한 후 서명 한 후 서명 한 키의 인증서를 제공합니다.

  • IIS7 갱신 CSR
    • PKCS # 7 데이터
      • PKCS # 10 데이터 (일반 CSR)
    • 일반 서버 인증서
    • CA 데이터 발행
    • RSA 서명 (가정)

사용은 openssl asn1parse -in iis7rcsr -i파일의 구조를보고, 정상 CSR을이 비교합니다. CSR을 얻기 위해 추출해야하는 ": pkcs7-data"라는 레이블이 붙은 객체에서 OCTET STRING이 시작 부분 근처에 표시되어야합니다.

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

여기서 실제 PKCS # 10 CSR을 가져 오려면이 예에서 해당 오프셋 번호 "58"이 필요합니다. 그런 다음 해당 오프셋을 사용하여 해당 객체의 이진 버전을 추출 할 수 있습니다.

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

다음으로 openssl req입력 형식 DER을 지정하는 것을 기억 하면서 출력 파일 'thecsr'을 읽을 수 있습니다 .

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

나는 리눅스를 사용 /proc/self/fd/하여 openssl을 속일 수있는 한이 파일을 임시 파일없이 하나의 명령 줄로 묶을 수 있습니다 (그러나 슬프게도 원래 인증서를 2 번 읽음). 정상 출력이 아님).

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

이 긴 명령 줄은 openssl req -in non-iis7rcsr -noout -text내가 일반적으로 사용 하는 간단한 것과 직접 같습니다.



2

매우 도움이 된이 우수한 정보에 대해 Jim에게 감사드립니다. w2008 / IIS7 서버 인증서를 갱신하려고 할 때와 똑같은 문제가있었습니다.

한 가지만 추가하겠습니다. 다음 명령을 사용하여 certutil -split iis7rcsr C10 을 P10 형식으로 직접 추출 할 수 있습니다. (iis7rcsr은 IIS 관리자를 통해 얻는 .csr입니다). csr은 blob0_1.p10 DER (Binary Format) 형식의 파일로 추출되며 다음 명령을 사용하여 base64로 인코딩해야 할 수 있습니다. certutil -encode blob0_1.p10 finalcsr.csr

그러나 마지막 문제가 있습니다. 그런 다음 openssl로 .csr 내용을 덤프하여 갱신 프로세스가 자동으로 1024 비트 키를 강제로 사용한다는 것을 발견했습니다 (서버 인증서를 위해 서버에서 작성된 원래 개인 키의 길이는 2048 비트 임). 그러면 IIS7의 갱신 프로세스를 사용하여 2048 비트 키를 강제로 사용할 수없는 것 같습니다.

유일한 좋은 옵션은 갱신 프로세스를 사용하지 않고 새 키 / 인증서를 작성하는 것 같습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.