“openssl s_client”를 사용하여 서버의 SSL / TLS 인증서 받기


17

다음을 사용하여로드 밸런서 (Netscaler) 중 하나에 대한 SSL / TLS 인증서를 얻으려고합니다.

openssl s_client -showcerts -connect lb.example.com:443

그러나 인증서가 표시되지 않습니다.

CONNECTED(00000003)
write:errno=54

사용 -servername lb.example.com은 도움이되지 않으며 sysadmin은로드 밸런서가 SNI를 사용하지 않는다고 말했습니다.

편집 : 서버가 인트라넷에 있으며 공용 인터넷 연결을 허용하지 않습니다. 이것은 openssl의 출력입니다 -debug.

CONNECTED(00000003)
write to 0x7fec7af0abf0 [0x7fec7b803a00] (130 bytes => 130 (0x82))
0000 - 80 80 01 03 01 00 57 00-00 00 20 00 00 39 00 00   ......W... ..9..
0010 - 38 00 00 35 00 00 16 00-00 13 00 00 0a 07 00 c0   8..5............
0020 - 00 00 33 00 00 32 00 00-2f 00 00 9a 00 00 99 00   ..3..2../.......
0030 - 00 96 03 00 80 00 00 05-00 00 04 01 00 80 00 00   ................
0040 - 15 00 00 12 00 00 09 06-00 40 00 00 14 00 00 11   .........@......
0050 - 00 00 08 00 00 06 04 00-80 00 00 03 02 00 80 00   ................
0060 - 00 ff a6 f7 27 1a a7 18-85 cf b2 03 22 fc 48 3d   ....'.......".H=
0070 - dd a9 2c b7 76 67 62 80-df 85 ed 48 35 c7 d4 87   ..,.vgb....H5...
0080 - 8d d3                                             ..
read from 0x7fec7af0abf0 [0x7fec7b809000] (7 bytes => -1 (0xFFFFFFFFFFFFFFFF))
write:errno=54

그리고 이것은 다음의 관련 결과입니다 curl -v https://lb.example.com/.

$ curl -vI https://lb.exmple.com/
*   Trying 1.2.3.4...
* Connected to lb.exmple.com (10.1.2.3) port 443 (#0)
* TLS 1.2 connection using TLS_RSA_WITH_AES_256_CBC_SHA
* Server certificate: lb.example.com
* Server certificate: RapidSSL SHA256 CA - G2
* Server certificate: GeoTrust Primary Certification Authority - G3
> HEAD / HTTP/1.1
> Host: lb.exmple.com
> User-Agent: curl/7.43.0
> Accept: */*
>

를 사용하여 인증서를 얻는 방법에 대한 제안 사항은 openssl s_client무엇입니까?


2
올바른 방법으로하고 있습니다. 그러나 현재 정보를 바탕으로 무엇이 잘못되었는지 말하기는 불가능합니다. TLS 핸드 셰이크를 차단하는 방화벽, TLS 프로토콜 문제 일 수 있습니다. 대상으로 사용하려는 (공용) URL을 제공하거나 전체 디버그 출력 (옵션 -debug)을 질문에 추가하면 도움이 될 수 있습니다 .
Steffen Ullrich

@SteffenUllrich는 TLS 일 수 있다고 말했습니다. 참조 여기에 가능한 솔루션 - 같은 오류를하려면 openssl .
Zina

답변:


21

잠시 후에 나는 그것을 알아 냈습니다 :이 특정로드 밸런서는 OS X (0.9.8)에 포함 된 openssl의 버전이 이해하지 못하는 TLSv1.2 만 사용하도록 구성되었습니다. homebrew를 사용하여 최신 버전의 openssl (> = 1.0.1)을 설치 했으므로 다음과 같이 작동합니다.

/usr/local/opt/openssl/bin/openssl s_client -showcerts -connect lb.example.com:443

3

다음을 사용하여로드 밸런서 (Netscaler) 중 하나에 대한 SSL / TLS 인증서를 얻으려고합니다.

 openssl s_client -showcerts -connect lb.example.com:443

현대적인 구성 (일부 손의 의미를 포기하는 경우)을 사용하는 경우 :

openssl s_client -connect lb.example.com:443 -tls1 -servername lb.example.com | \
openssl x509 -text -noout

CONNECTED(00000003)
write to 0x7fec7af0abf0 [0x7fec7b803a00] (130 bytes => 130 (0x82))
0000 - 80 80 01 03 01 00 57 00-00 00 20 00 00 39 00 00
...

바이트 0과 1에는 여분의 프리앰블이있는 것 같습니다. 바이트 2에는 레코드 유형이 있어야합니다. 바이트 3과 4에는 버전 번호가 있어야합니다. 바이트 5와 6은 페이로드의 16 비트 길이 여야합니다.

다음은 실제 예입니다.

$ openssl s_client -connect www.googl.com:443 -tls1 -servername www.googl.com -debug
CONNECTED(00000005)
write to 0x7f7fe1c1fa30 [0x7f7fe2022000] (132 bytes => 132 (0x84))
0000 - 16 03 01 00 7f 01 00 00-7b 03 01 71 c0 12 35 98
...

위에서 레코드 유형은 위치 0에 있으며 값은 0x16입니다. 0x16은 핸드 셰이크 유형입니다. 레코드 계층 버전은 위치 2와 3에서 다음 두 바이트 0x03 0x01입니다. 값은 입니다. 페이로드의 길이는 0x007f입니다.

또한 참조 RFC 5246, 전송 계층 보안 (TLS) 프로토콜 버전 1.2 , 18 페이지 :

6.2.1.  Fragmentation

   The record layer fragments information blocks into TLSPlaintext
   records carrying data in chunks of 2^14 bytes or less.  Client
   message boundaries are not preserved in the record layer (i.e.,
   multiple client messages of the same ContentType MAY be coalesced
   into a single TLSPlaintext record, or a single message MAY be
   fragmented across several records).

      struct {
          uint8 major;
          uint8 minor;
      } ProtocolVersion;

      enum {
          change_cipher_spec(20), alert(21), handshake(22),
          application_data(23), (255)
      } ContentType;

      struct {
          ContentType type;
          ProtocolVersion version;
          uint16 length;
          opaque fragment[TLSPlaintext.length];
      } TLSPlaintext;

문제는 이전 SSLv2 호환 레코드 유형일 수 있습니다. 또는 0.9.5 또는 0.9.8과 같은 OpenSSL의 하위 버전 일 수 있습니다. 말하기가 어렵고 더 많은 정보가 필요할 것입니다.

자세한 정보는 OS를 포함합니다. OpenSSL 버전; 플랫폼의 OpenSSL 버전을 자신의 OpenSSL 버전으로 교체하려고 시도한 경우 방화벽 또는 "웹 검사"상자 또는 기타 미들웨어 상태가 실행중인 경우; 그리고 서버가받는 것.


사용 -servername lb.example.com은 도움이되지 않으며 sysadmin은로드 밸런서가 SNI를 사용하지 않는다고 말했습니다.

이례적인 소리. 그러나 TLS 로의 확장이므로 사용하지 않으면 무시됩니다 (치명적인 경고를 생성하지 않음).

2016 년의 경험 법칙 : 항상 TLS 1.0 이상을 사용하고 항상 SNI를 사용하십시오.

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