web-dev-qa-db-ja.com

tlsハンドシェイクに失敗しました。 IP SANを含まない

Logstashフォワーダーをセットアップしようとしていますが、適切な安全なチャネルを作成するのに問題があります。 virtualboxで実行されている2台のubuntu(サーバー14.04)マシンでこれを構成しようとしています。それらは100%クリーンです(hostsファイルに触れたり、logstashに必要なJava、ngix、elastisearchなど以外のパッケージをインストールしたりしていません)

これはlogstashの問題であるとは思われませんが、証明書の不適切な処理、またはlogstash ubuntuまたはフォワーダーマシンのいずれかで正しく設定されていないもの

私はキーを生成しました:

Sudo openssl req -x509 -batch -nodes -newkey rsa:2048 -keyout private/logstash-forwarder.key -out certs/logstash-forwarder.crt

Logstashサーバー上の私の入力設定:

input {
  lumberjack {
    port => 5000
    type => "logs"
    ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt"
    ssl_key => "/etc/pki/tls/private/logstash-forwarder.key"
  }
}

キーはforwarder Hostにコピーされました。

{
  "network": {
    "servers": [ "192.168.2.107:5000" ],
    "timeout": 15,
    "ssl ca": "/etc/pki/tls/certs/logstash-forwarder.crt"
    "ssl key": "/etc/pki/tls/certs/logstash-forwarder.key"
  },
  "files": [
    {
      "paths": [
        "/var/log/syslog",
        "/var/log/auth.log"
       ],
      "fields": { "type": "syslog" }
    }
   ]
}

Logstashサーバーが実行されている状態で、フォワーダーマシンでI 'Sudo service logstash-forwarder start'を実行すると、次のエラーが繰り返し発生します。

Jul  9 05:06:21 ubuntu logstash-forwarder[1374]: 2014/07/09 05:06:21.589762 Connecting to [192.168.2.107]:5000 (192.168.2.107)
Jul  9 05:06:21 ubuntu logstash-forwarder[1374]: 2014/07/09 05:06:21.595105 Failed to tls handshake with 192.168.2.107 x509: cannot validate certificate for 192.168.2.107 because it doesn't contain any IP SANs
Jul  9 05:06:22 ubuntu logstash-forwarder[1374]: 2014/07/09 05:06:22.595971 Connecting to [192.168.2.107]:5000 (192.168.2.107)
Jul  9 05:06:22 ubuntu logstash-forwarder[1374]: 2014/07/09 05:06:22.602024 Failed to tls handshake with 192.168.2.107 x509: cannot validate certificate for 192.168.2.107 because it doesn't contain any IP SANs

前に述べたように、これはlogstashの問題ではなく、証明書/マシン構成の問題であると思います。問題は、解決できないようです。うまくいけば、ここの賢い心が私を助けてくれるでしょうか?

ありがとう

31
connery

... 192.168.2.107 x509でのtlsハンドシェイクに失敗しました:IP SANが含まれていないため、192.168.2.107の証明書を検証できません

SSLはピアの識別が必要です。そうでない場合、接続は、データを復号化+スニッフィング/変更してから、暗号化して実際のターゲットに転送する中間者に反する可能性があります。識別は、信頼できるCAに対して検証する必要があり、接続するターゲットを識別する必要があるx509証明書で行われます。

通常、ターゲットはホスト名として指定され、これは証明書のサブジェクトおよびサブジェクトの別名に対してチェックされます。この場合、ターゲットはIPです。証明書の妥当性を検証して、サブジェクトの別名セクション内の証明書にIPを付与する必要がありますが、DNSエントリ(ホスト名など)としてではなく、IPとして付与する必要があります。

だからあなたがする必要があるのは:

  1. /etc/ssl/openssl.cnfを編集しますlogstashホスト上-subjectAltName = IP:192.168.2.107セクションに[v3_ca]を追加します。

  2. 証明書を再作成します

  3. 証明書とキーを両方のホストにコピーします

PSデフォルトの証明書の有効期間は30日であり、毎月再作成したくないので、-days 365以上を証明書作成コマンドラインに追加することを検討してください。

41
Steffen Ullrich

Logstash githubチケットに記載されている、ランバージャックの適切な証明書を作成するためのスクリプトがあります。 IP SANがないため、SSLハンドシェイクは失敗します

ファイルをダウンロードします。

curl -O https://raw.githubusercontent.com/driskell/log-courier/1.x/src/lc-tlscert/lc-tlscert.go

...それを構築する:

go build lc-tlscert.go

..そして実行:

./lc-tlscert 
Specify the Common Name for the certificate. The common name
can be anything, but is usually set to the server's primary
DNS name. Even if you plan to connect via IP address you
should specify the DNS name here.

Common name: you_domain_or_whatever

The next step is to add any additional DNS names and IP
addresses that clients may use to connect to the server. If
you plan to connect to the server via IP address and not DNS
then you must specify those IP addresses here.
When you are finished, just press enter.

DNS or IP address 1: 172.17.42.1 (th ip address to trust)
DNS or IP address 2: 

How long should the certificate be valid for? A year (365
days) is usual but requires the certificate to be regenerated
within a year or the certificate will cease working.

Number of days: 3650
Common name: what_ever
DNS SANs:
    None
IP SANs:
    172.17.42.1

The certificate can now be generated
Press any key to begin generating the self-signed certificate.

Successfully generated certificate
    Certificate: selfsigned.crt
    Private Key: selfsigned.key

Copy and paste the following into your Log Courier
configuration, adjusting paths as necessary:
    "transport": "tls",
    "ssl ca":    "path/to/selfsigned.crt",

Copy and paste the following into your LogStash configuration, 
adjusting paths as necessary:
    ssl_certificate => "path/to/selfsigned.crt",
    ssl_key         => "path/to/selfsigned.key",
11
michaelbn

私はこれに関して本当の問題を抱えていました。私はlogstashを使用していません。単にIP SANをdocker tlsで動作させようとしていました。 https( https://docs.docker.com/articles/https/ )のdockerの記事に記載されているように証明書を作成し、Dockerクライアントから接続する場合:

docker --tlsverify  -H tcp://127.0.0.1:2376 version

私はこのエラーを受け取ります:

...
FATA[0000] An error occurred trying to connect: Get https://127.0.0.1:2376/v1.16/version: \
x509: cannot validate certificate for 127.0.0.1 because it doesn't contain any IP SANs 

それは私を夢中にさせていました。私は認めます、私はopensslのすべてのものに出くわしたので、誰もがすでに私が発見したものを知っているかもしれません。ここ(およびその他すべての場所)のsubjectAltNameの例は、openssl.cnfファイルの更新を示しています。うまくいきませんでした。 openssl.cnfで検索を行い、ローカルディレクトリにコピーしてから、変更を加えました。証明書を調べたところ、拡張子が含まれていませんでした。

openssl x509 -noout -text -in server-cert.pem

その証明書を作成するために使用されているコマンドはここにあります(Docker記事から):

openssl x509 -req -days 365 -in server.csr -CA ca.pem -CAkey ca-key.pem \
    -CAcreateserial -out server-cert.pem

このコマンドに-config openssl.cnf行を追加することはできません。これは無効です。また、openssl.cnfファイルを現在のディレクトリにコピーして変更し、そのように機能させることもできません。数行後、「クライアント」証明書が-extfile extfile.cnfを使用していることに気付きました。だから、私はこれを試しました:

echo subjectAltName = IP:127.0.0.1 > extfile.cnf
openssl x509 -req -days 365 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial \
   -out server-cert.pem -extfile extfile.cnf

そしてそれはそれを修正しました。そのため、何らかの理由で、opensslの私のバージョンではopenssl.cnfファイルを変更できませんでしたが、subjectAltNameを次のように指定できました。よく働く!

IP:127.0.0.1、IP:127.0.1.1(非ローカルホストも同様)など、任意の数のIPアドレスを指定できます。

7
Greg

迅速な修正については、上記の@Steffen Ullrichのソリューションを参照してください。

logstash-forwarderプロジェクトのgithubで問題/それについて議論している もあります。より簡単な解決策については、それを参照してください(すぐに、現在取り組んでいるため)。

0
Greg Dubicki