반응형

사설SSL 인증서(certificate)을 이용하여 서비스 중인 사이트에 요청을 하게되면.. 인증서를 확인할 수 없다고 에러가 많이 뜨죠


그래서

1. python 으로 request할때 ssl cert verification 안하도록 검증 안하도록 하는 방법  (요기 링크)

을 썼었고

2. curl을 쓸때도 마찬가지로 ssl cert를 검증 안하도록 -k 옵션을 넣는 방법 (요기 링크)

도 있었죠


근데.. 이러지 않아도 될 것 같아요

혹시 모르니 코딩상에는 저렇게 해놓고

서비스 시작할때 환경변수를 아래와 같이 설정하면 될 것 같습니다.


2번째 방법도 아래 환경변수를 추가하면 먹히는지 모르겠네요

pythonhttpsverify라는 환경변수값을 0으로 설정하면 python 에서는 검증을 안하도록 기본 설정이 되더라고요! 굿굿


저는 .service 파일에 배치파일을 실행하게하고 그 전에 환경변수를 추가하도록 했습니다.

끄읏. finish


export PYTHONHTTPSVERIFY=0


반응형
반응형

python을 이용한 xml 사이트 파싱 


인터넷 검색하면 죄다 xml  파일을 파싱하는 것만 나옵니다...

순간 저도 혹해서 xml 파일을 다운로드 받아서 저장하고 저장된 파일을 파싱하려고 했는데

너무 불필요한 IO가 일어나는게 싫었습니다..


근데 이게 참 안되네요..


처음엔

import requests

import xml.etree.ElementTree as elementTree


url = 'https://blabla..'

이렇게 받은 이후

elementTree.parse(url)

이렇게 하니 안됩니다.....

elementTree.parse에 들어가는 변수는 url이 아니라 filename 이랍니다.. 저장된 파일이름...


이제 다른 방버을 찾아봅니다..

docs를 찾아보니까 data일때는 elementTree.fromstring() 으로 변환을 시켜줘야 한다고 합니다.

root = elementTree.formstring(requests.get(url, verify=False).text)

이런 방식으로 requests.get 을 통해 웹페이지를 string 형태로 받아서 string 을 elementTree 형태로 변경해 줍니다.


여기서 또 2시간 정도 삽질을 했는데.. docs를 잘 안본 제 탓이죠.. ㅠㅠ

보면 2가지 방법으로 값을 가져올 수 있는데 하나는 [] 로, 하나는 find 같은 함수를 이용하는 방법이 나옵니다.


당연히 편한 find()나 findtext() 함수를 사용하였으나 안됩니다.. none을 반환하네요...

찾아보니 none 은 값을 못찾을때 return 한다고 합니다..


그래서 이번엔 배열 방식인 []로 찾아봅니다..


print(root[0][0].text) 이런식!!

잘찾아오네요..? -_-;;


도대체 왜 find 함수를 쓰면 안되는거냐!! 고 엄청나게 헤매던 그때..

docs 페이지를 더 아래로 내리니...

xpathpython xpath xml parse

이렇게 나오네요....

와.. 순간 화가 확.. ㅠㅠ

이걸 왜 못봤을까요...


string 형식을 elementTree 형태로 변환을 했기 때문에 당연히 find로 할 수 있는 줄 알았는데.. ㅠㅠ

XPATH 방식으로 처리가 가능합니다..


저렇게 find를 쓰되, parse()로 분석했을때는 해당 element 이름만 적으면 되는 반면

string을 변환하여 사용할때는 xpath 방식으로 find(.//element name) 형식으로 찾을 수 있습니다


결론. XPATH 형태로 호출하면 된다


반응형
반응형

python 으로 https 사이트 응답값을 받아올때 못받아 오는 경우들이 있습니다.

보면 대부분 ssl 인증서 문제죠


OpenSSL.SSL.Error: [('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')]


During handling of the above exception, another exception occurred:


Traceback (most recent call last):

  File "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py", line 672, in urlopen

    chunked=chunked,

  File "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py", line 376, in _make_request

    self._validate_conn(conn)

  File "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py", line 994, in _validate_conn

    conn.connect()

  File "/usr/local/lib/python3.6/site-packages/urllib3/connection.py", line 360, in connect

    ssl_context=context,

  File "/usr/local/lib/python3.6/site-packages/urllib3/util/ssl_.py", line 383, in ssl_wrap_socket

    return context.wrap_socket(sock)

  File "/usr/local/lib/python3.6/site-packages/urllib3/contrib/pyopenssl.py", line 491, in wrap_socket

    raise ssl.SSLError("bad handshake: %r" % e)

ssl.SSLError: ("bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')],)",)


내부 시스템 REST API를 호출하기 위해서 호출을 하면.. 100%죠.. 

보통 내부 시스템들은 local 인증서를 쓰기 때문입니다.


앞에서 curl 로 -k 옵션으로 인증서를 무시하는 게 있었던거.. 기억나시나요?


python 에서 requests 모듈에도 그런 옵션이 있습니다.

reqeust ssl cert verificationpython 에서 requests 모듈을 사용 시 ssl 인증을 무시하는 방법

requests 모듈 사이트에서 가져온 화면 입니다.


보면 reqeusts.get(url, verify=False) 로 해결할 수 있는 것을 확인할 수 있습니다.


끝.

반응형
반응형

$ curl -v "https://1.1.1.1/api/?type=op&cmd=%3Cshow%3E%3Chigh-availability%3E%3Cstate%3E%3C/state%3E%3C/high-availability%3E%3C/show%3E&key=LUFRPT01SkQrZmNMVjVURllIRjh2YVZGRFB6Uy9wek09SVNhclpPVDNIcWF5azhHZTFwdTdBbVBhQXEyWFpFVjlsaWxiOUFLRkpLMD0="

* About to connect() to 1.1.1.1 port 443 (#0)

*   Trying 1.1.1.1...

* Connected to 1.1.1.1 (1.1.1.1) port 443 (#0)

* Initializing NSS with certpath: sql:/etc/pki/nssdb

*   CAfile: /etc/pki/tls/certs/ca-bundle.crt

  CApath: none

* NSS error -12188 (SSL_ERROR_INTERNAL_ERROR_ALERT)

* Peer reports it experienced an internal error.

* Closing connection 0

curl: (35) Peer reports it experienced an internal error.


curl 명령어로 팔로알토 방화벽의 state 값을 가져와서 active 상태인지 passive 상태인지 확인하고 active가 passive로 변경되면 mattermost 로 알림을 주는것과 평소 방화벽 state를 확인하는 명령을 넣어보려고 하는데..


에러가 납니다.


처음에 -v 옵션을 안줬더니 그냥 에러가 발생했고

-v 옵션을 통해 로그를 찍어보니 ssl_error_internal_error_alert 이라고 나옵니다. 


아무래도 팔로알토 방화벽이 local 인증서를 사용하기 때문에 그런 것 같습니다.


이때!

-k 옵션을 쓰시면 됩니다.


-k--insecurehttps 사이트를 SSL 인증서 검증없이 연결합니다.wget 의 --no-check-certificate 과 동일한 역할 수행


그러면 성공~

근데 그 뒤로 연결이 안된다...

아차....

permit ip 등록을 안했네요.. -_-;;

이렇게 30분간의 삽질 종료



반응형
반응형

json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)


느닷없는 에러.

뭔지 한참 찾았는데.. 결론은 너무 쉬웠어요..


url로 들어가는 파라메터 변수명이 틀렸었습니다......


ㅠㅠ

반응형
반응형

requests.exceptions.SSLError: HTTPSConnectionPool(host='localhost', port=443): Max retries exceeded with url: /api/v4/users/login (Caused by SSLError(SSLError("bad handshake: Error([('SSL routines', 'ssl3_read_bytes', 'tlsv1 alert internal error')],)",),))


이런 에러가 떠서.. SSL 인증서에 문제가 있는 줄 알고 엄청 뒤졌네요


검색해보니 대부분 pyOpenSSL 을 업데이트 하라는데 centos 기본은 0.13.1 까지 밖에 릴리즈가 안되어 있어요..

사이트 들어가서 설치 했습니다.


wget 으로 다운로드 받고 

tar zxvf 파일명으로 압축 해제 후

cd 경로로 이동 후

./setup install


이랬는데도 계속 안됨..

미치는 줄.............................................


근데 어느순간 갑자기 된다...?????

싶어서 이상해서 보니.. 아직도 잘 모르겠음. ㅠㅠㅠ


근데 결국 한건 pyOpenSSL upgrade 밖에 없어요..

그냥 계속 다운로드 받아서 설치만 반복..


낮은 버전을 설치하면 python2에서 적용받고

높은 최신 버전을 설치하면 python3에서 적용 받던데..

잘 몰라서 그냥 되는대로 계속 설치했습니다.......


그러다 문득 해봤는데 갑자기 되는 이런 아이러니한 상황.. ㅠㅠ

결론.. pyOpenSSL upgrade를 통해 해결은 했는데 언제 됐는지 모르겠어요..    



추가. 저거 말고 한게 있다면

위에 에러를 보면 알겠지만 localhost 로 conf 파잃에 설정해놨었는데

그 부분을 수정했더니 된거 같아요

복합적인 내용으로 앞서 설명한 pyopenssl upgrade랑 같이 conf 파일에 설정이 잘 되어 있는지 확인해보셔야 될 것 같습니다.


ssl 인증서를 도메인으로 발급 받았는데 conf 파일에서는 localhost 로 처리했더니 이런 문제가 발생한 것 같아요!!

반응형
반응형

connect refused 가 납니다.

뭔가 이상해서 netstat -atunp 해서 보니


127.0.0.1 : 8000 LISTEN

이렇게 되어 있네요


외부에서 붙으려면 0.0.0.0 으로 되어 있어야되는데.. 이거 뭐 어떻게 해야되냐.. 싶은 이때..

healthchecks github 사이트


나같은 사람이 누가 물어봤었네요.. 된장..

빨리 검색해볼껄.. 괜히 파일들만 뒤지고 있었네요.. 


./manage.py runserver 0.0.0.0:80000

으로 해결!!

반응형
반응형

django can't find new sqlite version? (SQLite 3.8.3 or later is required (found 3.7.17))


centos에서 yum 으로 설치하고 업그레이드 명령을 해봐도 안됩니다.


알고보니 centos yum repo 에 3.7.17 버전까지 밖에 업로드 안되어 있다네요..

다른 repo를 추가하면 되나? -_-?;;


결국은 그냥 sqlite 사이트가서 직접 설치하면 됩니다.


cd /opt

wget https://www.sqlite.org/2019/sqlite-autoconf-3280000.tar.gz tar -xzf sqlite-autoconf-3280000.tar.gz
cd sqlite-autoconf-3280000 ./configure make sudo make install


그랬는데도 자꾸 yum에서 3.7.17이 설치되어 있어서 그런지 자꾸 3.7.17이 설치되어 있다고 떠서 아래 방법으로 다시 함


반응형
반응형

Install: rjsmin.c fatal error: Python.h: No such file or directory


결과적으로보면 Python.h 를 찾을 수 없다는 건데

검색해보면 죄다 python-dev 나 python3-dev를 설치하라고만 나옵니다.


계속 했는데 안되네...?


계속 검색...


그리고 찾은 해답은

yum install python3-devel 

입니다.


왜 centos만 dev가 아니고 devel 이라 이 난리인지 ㅠ

반응형
반응형

npm이 뭔지도 모르는 보안쟁이가 요즘 개발한다고 이것저것 해보고 있습니다

사실 개발이라기보단 오픈소스 설치하고 그 위에 플러그인 덕지덕지 붙여서 api 연동하고 alert 주는 거지만..

(slack 설치형 버전 mattermost)


그래서 설치는 다 끝냈고

이제 유용하게 쓰기위해 plugin 이라 불리는 것들을 하나하나 덕지덕지 붙여가며 테스트해보고 있는 도중..

todo 를 설치해서 일정관리까지 되도록 해보려고 하는데

설치하는데 난관에 부딛혔습니다


분명히 github에서 설치할때 

npm install --save mattermoster-todo-plugin

하면 된다고 되어 있엇는데 안됩니다... 된장

npm errnpm install err

그래서 잠시 멀어졌던 구글링과 친해지는 과정을 거치던 도중..

npm에도 지역패키지(local package)와 전역패키지(global package)가 있는것을 알게 되었습니다.


결론은.. 그냥 설치하려고 했더니 발생했던 아래 에러..

255 error Linux 3.10.0-1062.12.1.el7.x86_64

256 error argv "/usr/bin/node" "/bin/npm" "install"

257 error node v6.17.1

258 error npm  v3.10.10

259 error code ETARGET

260 error notarget No compatible version found: mattermoster@^1.1.0

260 error notarget Valid install targets:

260 error notarget 1.0.0

261 error notarget This is most likely not a problem with npm itself.

261 error notarget In most cases you or one of your dependencies are requesting

261 error notarget a package version that doesn't exist.

261 error notarget

261 error notarget It was specified as a dependency of 'mattermoster-todo-plugin'

262 verbose exit [ 1, true ]

이게 지역패키지 설치여서 그랬던 겁니다..


사실 npm에서 지역으로 설치하나 전역으로 설치하나.. 그 차이를 모르겠습니다.

어짜피 얘가 그냥 모듈형(패키지)로 쓰이는 거고 데이터는 각각의 내부 동작에 의해 발생하는거 아닌가...? 싶은데..


아무튼 결론은 전역설치를 통해 해결했습니다.

전역으로 설치하니 그냥 되네요.


설치 방법은 기존 설치명령어에 -g 옵션을 붙이는 겁니다.

npm install --save mattermoster-todo-plugin -g


반응형

+ Recent posts