2008-09-16 7 views
2

나는 최근에 SSL/TLS 서버가 클라이언트 인증서 인증을 요청하고 16KB 이상의 신뢰할 수있는 인증서 DN, Internet Explorer (또는 schannel.dll을 사용하는 다른 앱)은 SSL 핸드 셰이크를 완료 할 수 없습니다. (요컨대, 서버는 RFC 2246 초 6.2.1에 따라 2^14 바이트의 청크로 메시지를 나눕니다. 그러나 Schannel은이를 지원하기 위해 작성되지 않았습니다. Schannel의 결함으로, 향후 릴리스에서 수정을 고려 중입니다.)ASN.1 PEM 파일의 발급자 문자열 가져 오기?

따라서 신뢰할 수있는 인증서를 쉽게 파싱 할 수있는 방법을 찾으려고합니다. (Apache를 서버로 사용하므로 모두 PEM 형식)을 사용하여 DN의 전체 ASN.1 형식 길이 (핸드 셰이크 중에 유선을 통해 전송되는 방식)를 가져 와서 한계에 너무 근접하는지 확인합니다. OpenSSL asnparse 함수는 거의 비슷하지만 발행자 이름에 대해 ASN.1 시퀀스를 얻는 방법을 제공하지 않는 것처럼 보입니다. 나는 필요하다.

제안 사항?

+0

이것은 프로그래밍 관련 질문이 아니므로 아마도 투표를 통해 답변을 얻지 못할 수도 있습니다. – JasonMichael

+0

물론 프로그래밍 질문입니다! –

답변

3

ASN.1은 자체적으로 설명하기 때문에 ASN.1 파서를 작성하는 것이 매우 쉽습니다. 아시다시피 ASN.1 데이터에는 값의 트리가 있으며 각 값 유형은 전역 적으로 할당 된 OID (Object ID)로 식별됩니다. 소스 코드가있는 무료 ASN.1 디코더는 http://www.geocities.co.jp/SiliconValley-SanJose/3377/asn1JS.html에 있습니다. 그것은 자바 스크립트로 작성되었으므로 브라우저에서 직접 재생할 수 있습니다. 정확한 질문으로

- 나는 것 :

  1. 내 자신의
  2. 이 (신뢰할 수있는 DN의 OID를 찾기 사양을 확인하거나 사용하여 인증서를 디코딩 또 다른 하나를 찾을 제공된 파서를 사용하거나 쓰기
  3. 위의 두 가지를 결합하여 인증서 내의 신뢰할 수있는 DN의 크기를 추출합니다.
0

openssl asn1parse가 수행하지만 발급자 시퀀스가 ​​시작되는 위치를 파악하려면 수동 구문 분석을해야합니다. RFC 5280에 따르면 서명 알고리즘을 따르는 TBSCertificate 시퀀스의 네 번째 항목 (잠재적으로 3 번째가 v1 인증서 인 경우)입니다. 다음 예 :

0:d=0 hl=4 l= 621 cons: SEQUENCE 
    4:d=1 hl=4 l= 470 cons: SEQUENCE 
    8:d=2 hl=2 l= 3 cons: cont [ 0 ] 
    10:d=3 hl=2 l= 1 prim: INTEGER   :02 
    13:d=2 hl=2 l= 1 prim: INTEGER   :02 
    16:d=2 hl=2 l= 13 cons: SEQUENCE 
    18:d=3 hl=2 l= 9 prim: OBJECT   :sha1WithRSAEncryption 
    29:d=3 hl=2 l= 0 prim: NULL 
    31:d=2 hl=2 l= 64 cons: SEQUENCE 
    33:d=3 hl=2 l= 11 cons: SET 
    35:d=4 hl=2 l= 9 cons:  SEQUENCE 
    37:d=5 hl=2 l= 3 prim:  OBJECT   :countryName 
    42:d=5 hl=2 l= 2 prim:  PRINTABLESTRING :US 
    46:d=3 hl=2 l= 26 cons: SET 
    48:d=4 hl=2 l= 24 cons:  SEQUENCE 
    50:d=5 hl=2 l= 3 prim:  OBJECT   :organizationName 
    55:d=5 hl=2 l= 17 prim:  PRINTABLESTRING :Test Certificates 
    74:d=3 hl=2 l= 21 cons: SET 
    76:d=4 hl=2 l= 19 cons:  SEQUENCE 
    78:d=5 hl=2 l= 3 prim:  OBJECT   :commonName 
    83:d=5 hl=2 l= 12 prim:  PRINTABLESTRING :Trust Anchor 
    97:d=2 hl=2 l= 30 cons: SEQUENCE 
    99:d=3 hl=2 l= 13 prim: UTCTIME   :010419145720Z 
    114:d=3 hl=2 l= 13 prim: UTCTIME   :110419145720Z 
    129:d=2 hl=2 l= 59 cons: SEQUENCE 

발급자 DN 31 오프셋에서 시작하여, 66 바이트의 총 길이 두 헤더의 길이와 64의 길이 값을 갖는다. 물론 스크립트를 작성하는 것은 쉽지 않습니다 ...