SSL 연결하기
Apache Nifi로 작업을 하다보면 웹 사이트에서 컨텐츠를 가져 오거나 다양한 REST API를 통해서 JSON, XML, TXT 형태로 데이터를 가져와야 하는 일이 있다. 이러한 방법에 대해서 알아 보며 특히 HTTP 인 경우에는 간단하게 연동이 되지만 HTTPS 인 경우에는 몇가지 추가적인 작업을 필요하다.
본 글에서는 NiFi의 HTTP 컴포넌트에 대해서 알아 보고 나아가 HTTPS를 연결하는데에 필요한 작업을 소개한다. 다만 본 글에서 사용되는 방법이외에 더 간단한 방법이 있을수 있다.
HTTP상에서 데이터를 가져오는데에 가장 간단하게 사용되는 방법으로 들수 있다. Get 메서드만을 허용하며 HTTPS를 지원하며 일부 헤더를 설정하여 요청을 보낼수 있는 기능을 제공한다.
위의 설정창에 간단하게 가져오고자 하는 HTTP 방식의 URL을 입력한 이후 실행하면 해당 목적지의 데이터를 가져온다. 가져온 데이터를
기본적으로 다양한 HTTP 메서드 사용가능하며 요청하고자 하는 대상 URL 혹은 API 따라 다양한 조정을 하여 통신을 구축할 수 있는 장점이 있다.
HTTP인 경우에는 Remote URL 항목만 입력하면 되지만 HTTPS인 경우에는 SSL Context Service를 추가해 주어야만 정상적인 통신이 가능하다. (하단 참조)
POST 메소드를 사용하여 HTTP 컨텐츠를 연동할수 있다. 기본적으로 GetHTTP에서 메소드가 POST인점이 다른점이며 유사한 기능이다.
PostHTTP의 설정창
4. ListenHTTP
위에서 설명한 3가지 방법이 Client로서 데이터를 수집하는 역할을 한다면 ListenHTTP는 자체적으로 별도의 웹서버를 띄운다음 데이터를 수집하는 서버로서 역할을 수행한다. Nifi UI가 실행된 포트와는 무관하게 별도의 Listening Port를 설정하여 포트를 오픈하여 데이터를 수집할 수 있다.
외부에서 데이터를 수집할 필요가 있다면 해당 기능을 사용하면 된다.
ListenHTTP의 설정창
간단하게 HTTP를 통해서 Client와 Server 모드로 데이터를 수집 하는 방법에 대해서 알아 보았고 이제부터는 Client 모드인 InvokeHTTP 기능을 사용하여 HTTPS 사이트를 연동하는 방법에 대해서 알아 본다.
간단한 HTTP API를 연동하는 경우 위에서 설명한 Client 기능을 넣고 URI를 입력해 주기만 하면 간단하게 해당 페이지에서 데이터를 수집하여 사용할 수 있다. 하지만 HTTPS인 경우에는 서버와 통신하기 위한 keystore 파일과 Truststore 파일을 등록해 주어야 통신이 가능하다.
InvokeHTTP의 설정창에 있는 "SSL Context Service"를 선택한 다음 새로운 SSL 을 하나 만들어 주면 아래와 같은 설정창을 볼수 있다.
HTTPS 통신을 위해서 위의 두가지 파일을 일단 만들어 보자.
[sokoban]$ keytool -genkey -v -keystore keystore-file -alias nifi-key -keyalg RSA -keysize 2048 -validity 10000
키 저장소 비밀번호 입력:
새 비밀번호 다시 입력:
이름과 성을 입력하십시오.
......
다음에 대해 유효 기간이 10,000일인 2,048비트 RSA 키 쌍 및 자체 서명된 인증서(SHA256withRSA)를 생성하는 중
: CN=kimhyunggi, OU=ka, O=ka, L=seoul, ST=ks, C=kr
<nifi-key>에 대한 키 비밀번호를 입력하십시오.
(키 저장소 비밀번호와 동일한 경우 Enter 키를 누름):
[keystore-file을(를) 저장하는 중]
자바에서 기본적으로 제공하는 keytool을 이용하여 위와 같이 키 알고리즘이 RSA인 keystore 파일을 생성할수 있다. 그런 다음 keystore를 통해서 Truststore 파일을 생성한다.
keytool -export -alias nifi-key -keystore keystore-file -rfc -file trustnifi.cer
keytool -import -alias nifi-key -file trustnifi.cer -keystore cacerts -storepass <password>
이제 최종적으로 도출한 keystore 와 cacerts 두개의 파일을 위에 등록해 준다.
그런 다음 특정 HTTPS 사이트에 접속하고자 한다면 아래와 같은 PKIX path building Failed가 발생하면서 통신이 되지 않는것을 볼수 있다.
이는 해당 사이트의 인증서가 자바에 신뢰된 기관으로 등록되어 있지 않으므로 해당 사이트의 인증서 지문을 cacerts에 등록해 주어야 한다.
keytool -list -keystore cacerts
키 저장소 유형: JKS
...
키 저장소에 5개의 항목이 포함되어 있습니다.
reputation.alienvault.com-1, 2020. 8. 9, trustedCertEntry,
인증서 지문(SHA1): 0E:86:EF:0F:FF:7A:0C:D3:D1:3B:57:93:~
www.badips.com-1, 2020. 8. 10, trustedCertEntry,
인증서 지문(SHA1): 34:ED:A4:16:37:7A:5F:E4:30:1E:53:A5:~
nifi-key, 2020. 8. 9, trustedCertEntry,
인증서 지문(SHA1): 89:74:E4:0F:EE:5D:15:5E:CE:07:FA:~
www.binarydefense.com-1, 2020. 8. 10, trustedCertEntry,
인증서 지문(SHA1): 39:F7:E1:3E:43:4B:FE:EA:CC:29:51:~
gist.githubusercontent.com-1, 2020. 8. 10, trustedCertEntry,
인증서 지문(SHA1): 70:94:DE:DD:E6:C4:69:48:3A:92:~
인증서 지문을 추가하는 방법은 아래의 글을 참고하기 바란다.
https://zero-gravity.tistory.com/199http://blog.naver.com/kgj1/220584997842
이 과정이 완료 되면 원하는 사이트와 HTTPS 통신을 할수가 있을 것이다.
아래는 다수의 사이트에서 데이터를 주기적으로 가져와서 로컬에 텍스트 파일로 남기는 것을 간단하게 구현한 nifi 화면이다.
InvokeHTTP의 설정창
위의 Flow를 실행하면 배치 주기때 아래와 같이 가져온 파일이 텍스트로 저장되는것을 볼수 있다. 별도로 남겨지는 파일의 지정을 하지 않고 단지 위치만 정해 두었기 때문에 아래와 같이 저장 된다.
% 간단하게 NiFi에서 HTTPS를 Client로 연동하는 방법을 알아 보았다. 기본적인 HTTPS에 대한 설명은 모두 제외 하였음을 밝힌다.
참고 사이트
HTTP communication with Apache NiFi
https://ddewaele.github.io/http-communication-with-apache-nifi/
http://blog.naver.com/PostView.nhn?blogId=cbjazz77&logNo=221132742514
% 본 글은 특정 기업이나 기관의 의견과는 무관한 글입니다.