TLSハンドシェイクに失敗しました。IP SANは含まれていません


28

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サーバーでの私の入力conf:

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サーバーを実行した状態で、フォワーダーマシンで「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の問題ではないと思いますが、証明書/マシン構成の問題です。問題は、私はそれを解決できないようです。うまくいけば、ここの賢い人が私を助けてくれますか?

ありがとう

回答:


40

... 192.168.2.107 x509とのハンドシェイクに失敗しました。IPSANが含まれていないため、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 -days 365デフォルトの証明書の有効期間はわずか30日間であり、おそらく毎月再作成する必要はないため、証明書作成コマンドラインに1つ以上を追加することを検討してください。


早速のお返事ありがとうございます。サーバーで新しい証明書を生成しました。簡単な検査で次のことがわかります。発行者:C = AU、ST = Some-State、O = Internet Widgits Pty Ltd、CN = 192.168.2.107ここで、2.107はlogstashサーバーのIPです。次に、crtとキーを他のマシン(フォワーダー)にコピーして、構成に適用します。この音はあなたに合っていますか?P:それはまだ同じことを...泣き言だ原因
コネリー

上記の私のコメントを無視してください。/etc/ssl/openssl.cnfを編集し、subjectAltName = IP:192.168.2.107を追加しました。「sudo openssl req -x509 -nodes -newkey rsa:2048 -keyout private / logstash-forwarder.key-」で新しい証明書を作成しました- out certs / logstash-forwarder.crt 'それらをコピーし、設定と再起動を適用しました(両方のボックスで)。残念ながらまだ同じ問題。これについて同様のケースを探し回るのに苦労しているので、うまくいけば正しい道に私を導くことができますか?:)
コネリー14

1
本当に同じ問題または別のエラーメッセージ(不明なCAなど)openssl x509 -textサーバーにインストールされている証明書など、証明書の重要な部分を投稿してください 。チェックしてくださいopenssl s_clientサーバが期待証明書と使用を返すことを-CApath信頼チェーンが設定されたCAに対して検証することができることを確認するためにs_clientとを
ステフェンUllrich 14

私はそれを機能させることができました。subjectAltNameを間違ったセクションに配置しました。作業方法:基本的にopenssl.cnfを編集し、[v3_ca]セクションで「subjectAltName = IP:192.168.2.107」を追加しました。新しい証明書を作成し、サーバー+クライアントに追加しました。ご協力いただきありがとうございます!:)
コネリー14

9

logstash githubチケットで言及されたlumberjackの適切な証明書を作成するためのスクリプトがあります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",

1
これにより、今日の時間を大幅に節約できました。ありがとうございました!
マットメッサースミス

6

これには本当の問題がありました。私はlogstashを使用していません。単にIP SANをdocker tlsで動作させようとしていました。https上のdocker記事(https://docs.docker.com/articles/https/)で説明されているように証明書を作成し、次に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アドレスを指定できます(localhost以外)。


あはは!ありがとう、私はあなたと同じことをドッカーでやっていて、この問題にぶつかりました。私は今あなたの提案を試します。
マークジョーンズ

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