tls 핸드 셰이크에 실패했습니다. IP SAN을 포함하지 않습니다


28

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

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

감사

답변:


39

... 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 일에 불과하고 매월 다시 작성하지 않으려는 경우 인증서 작성 명령 행에 하나 이상을 추가하십시오 .


빠른 답변 감사합니다. 서버에서 새 인증서를 생성했습니다. 빠른 검사는 다음을 제공합니다. 발급자 : C = AU, ST = 일부 상태, O = 인터넷 Widgits Pty Ltd, CN = 192.168.2.107 여기서 2.107은 logstash 서버 ip입니다. 그런 다음 crt와 키를 다른 컴퓨터 (전달자)에 복사하여 구성에 적용합니다. 이 소리가 당신에게 맞습니까? 그것은 여전히 ​​똑같은 일에 대해 징징 거리고 있습니다 ... : P
connery

위의 내 의견을 무시하십시오. 이제 /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 '복사하여 구성을 적용하고 다시 시작했습니다 (두 상자 모두). 불행히도 여전히 같은 문제입니다. 이와 비슷한 사례를 다루는 데 어려움을 겪고 있기 때문에 올바른 길로 안내 할 수 있기를 바랍니다. :)
connery

1
실제로 같은 문제 또는 다른 오류 메시지 (알 수없는 CA 또는 이와 유사한)? 인증서의 필수 부분 (예 : openssl x509 -text서버에 설치된 인증서 등)을 게시하십시오 . 으로도 확인하시기 바랍니다 openssl s_client서버가 예상 증명서 및 사용을 반환 -CApath신뢰 체인이 구성된 CA에 대해 검증 할 수 있는지 확인하기 위해 s_client가와를
Steffen Ullrich

나는 그것을 작동시킬 수있었습니다. subjectAltName을 잘못된 섹션에 넣었습니다. 작업 방법 : 기본적으로 [v3_ca] 섹션에서 openssl.cnf를 편집했습니다. 'subjectAltName = IP : 192.168.2.107'을 추가했습니다. 새 인증서를 생성하여 서버 + 클라이언트에 추가했습니다. 당신의 도움을 주셔서 감사합니다! :)
connery

9

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

1
이것은 gitlab-runner에게도 불구하고 오늘 많은 시간을 절약했습니다. 고맙습니다!
Matt Messersmith

6

나는 이것에 진짜 문제가 있었다. 나는 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 주소를 원하는대로 지정할 수 있습니다.


아하! 고마워, 나는 docker와 같은 일을 하고이 문제를 쳤다. 나는 당신의 제안을 지금 시도 할 것입니다.
Mark Jones

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