「openssl s_client」を使用してサーバーのSSL / TLS証明書を取得します


17

ロードバランサーの1つ(Netscaler)のSSL / TLS証明書を取得しようとしています。

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

ただし、証明書は表示されません。

CONNECTED(00000003)
write:errno=54

使用-servername lb.example.comしても役に立たず、システム管理者は、ロードバランサーは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、質問に完全なデバッグ出力(オプション)を追加すると役立ちます。
ステフェンUllrich

@SteffenUllrichが言ったように、それはTLSかもしれない。参照してくださいここに可能な解決策-同じエラーをopensslの
ジーナ

回答:


21

しばらくすると、この特定のロードバランサーはTLSv1.2のみを使用するように構成されました。TLSv1.2は、OS X(0.9.8)に含まれるバージョンのopensslが理解していません。homebrewを使用して新しいバージョンのopenssl(> = 1.0.1)をインストールしたため、これは機能します。

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

3

ロードバランサーの1つ(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の次の2バイト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で置き換えようとした場合。ファイアウォールまたは「Web検査」ボックスまたはその他のミドルウェアの正常性が実行されている場合。サーバーが受け取るもの。


使用-servername lb.example.comしても役に立たず、システム管理者は、ロードバランサーはSNIを使用しないと言った。

これはちょっと変わったように聞こえます。ただし、TLSの拡張機能であるため、使用しない場合は無視されます(致命的なアラートは生成されません)。

2016年の経験則:常にTLS 1.0以上を使用し、常にSNIを使用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.