카테고리 보관물: Server

Server

tls 핸드 셰이크에 실패했습니다. IP SAN을 포함하지 않습니다 “192.168.2.107:5000” ],

logstash 전달자를 설정하려고하는데 올바른 보안 채널을 만드는 데 문제가 있습니다. virtualbox에서 실행되는 두 개의 우분투 (서버 14.04) 시스템으로 이것을 구성하려고합니다. 100 % 깨끗합니다 (만지지 않은 호스트 파일 또는 logstash에 필요한 java, ngix, elastisearch 등 이외의 다른 패키지를 설치하지 않았습니다)

이것이 logstash 문제라고 생각하지 않지만 logstash 우분투 또는 전달자 시스템에서 인증서의 부적절한 처리 또는 올바른 설정이 잘못되었습니다.

키를 생성했습니다.

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"
  }
}

키는 다음 구성을 가진 전달자 호스트 로 복사되었습니다 .

{
  "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

앞에서 언급했듯이 이것이 로그 로그 문제가 아니라 인증서 / 시스템 구성 문제라고 생각합니다. 문제는, 나는 그것을 해결할 수없는 것입니다. 여기에 영리한 마음이 나를 도울 수 있기를 바랍니다.

감사



답변

… 192.168.2.107 x509로 핸드 셰이크를 인증하지 못했습니다. x509 : 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 -days 365기본 인증서 유효 기간이 30 일에 불과하고 매월 다시 작성하지 않으려는 경우 인증서 작성 명령 행에 하나 이상을 추가하십시오 .


답변

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",

답변

나는 이것에 진짜 문제가 있었다. 나는 logstash를 사용하지 않고 단순히 IP SAN이 docker tls와 작동하도록하려고했습니다. https ( https://docs.docker.com/articles/https/ ) 의 도커 기사에 설명 된대로 인증서를 만든 다음 도커 클라이언트에서 연결할 때 :

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

해당 인증서를 만드는 데 사용되는 명령은 다음과 같습니다 (도커 기사).

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 파일을 현재 디렉토리에 복사하고 수정 한 후 그 방식으로 작동하도록 할 수도 없습니다. 몇 줄 후에 ‘client’인증서가 -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 주소를 원하는대로 지정할 수 있습니다.


답변

빠른 수정에 대해서는 위의 @Steffen Ullrich의 솔루션을 참조하십시오.

logstash-forwarder 프로젝트의 github에 문제 / 토론 이 있습니다 . 더 쉬운 해결책은 (현재 작업 중이므로 곧) 참조하십시오.


답변