기본 콘텐츠로 건너뛰기

라벨이 tls인 게시물 표시

SecureCRT에서 호스트 키를 자동으로 수락하기

SecureCRT 호스트키를 자동으로 수락할 수 있다. 중간자공격(MITM attack, Man-in-the-middle...)에 취약하므로, 추천하는 방법은 아니지만 귀찮을 경우 사용할 수 있다. 참조: https://forums.vandyke.com/showthread.php?t=12109 설정 파일 위치를 확인한다. SecureCRT > Global Options > General > Configuration Paths SecureCRT를 모두 종료한다. 1에서 알아낸 위치에 SSH2.ini 파일을 수정한다. 수정 전: D:"Automatically Accept Host Keys"=00000000 수정 후: D:"Automatically Accept Host Keys"=00000001 여담으로 openssh의 클라이언트도 비슷한 기능이 있다. 참조:  https://askubuntu.com/questions/123072/ssh-automatically-accept-keys ssh -oStrictHostKeyChecking=no myuser@myhost

Self-signed Certificate Makefile(CMake)

매번 self-signed 인증서 만들기 귀찮고 해서 Makefile로 만들어 보았다. Makefile: TARGETS=certificate.pem privatekey.pem intermediate.pem privatekey.key all: $(TARGETS) clean: $(RM) $(TARGETS) privatekey.key: openssl genrsa -passout pass:1111 -des3 -out $@ 1024 privatekey.pem:privatekey.key openssl rsa -passin pass:1111 -in $< -out $@ certificate.pem:privatekey.pem openssl req -batch -utf8 -new -x509 -nodes -sha1 -days 365 -key privatekey.pem -out $@ intermediate.pem:certificate.pem cp $< $@ 약간 응용해서 CMake 버전도 만들어 보았다. CMakeLists.txt: cmake_minimum_required(VERSION 2.8) project(certs) add_custom_command(OUTPUT privatekey.key COMMAND openssl genrsa -passout pass:1111 -des3 -out privatekey.key 1024 COMMENT "Generating privatekey" ) add_custom_command(OUTPUT privatekey.pem COMMAND openssl rsa -passin pass:1111 -in privatekey.key -out privatekey.pem COMMENT "Convert privatekey to PEM style" DEPENDS privatekey.key ) add_custom_co...

Java에서 클라이언트 인증받는 TLS/SSL 연결 만들기

열심히 OpenSSL 소스 까보면서 공부해서 Java로(??!) 소켓 연결 맺기 해보는 중이다... 물론 Java에서 SSLSocketFactory에서 SSLSocket을 만들어 Buffer 연결하고 깔작거리면 얼마나 좋으련만, 세상이 녹록치 않더라. TLS/SSL은 클라이언트가 서버를 인증하는 것도 있지만, 서버가 클라이언트 인증을 필요로 할 때도 있다. 그래서 이땐 클라이언트가 사전에 서버쪽이랑 깔짝거려서 발급받은 인증서를 미리 쥐고 있다가, 서버에 접속(정확히는 접속해서 Handshake과정에서)할 때 넘겨줘야한다. SSLSocketFactory에서 그냥 깔짝깔짝 하는 걸로는 어림 반푼어치가 없더라고... SSLSocket부터 올라가보니, SSLContext라는 익숙한 놈이 있고, 이놈을 만들려면 KeyManagerFactory가 있어야 하고 TrustManagerFactory도 있어야 하는데, 각각은 KeyStore를 필요로 하고, KeyStore는 PKCS12 인증서를 필요로 하더라... 학학학 일단 잡다한 소리 집어치우고, 암호 설정한 PKCS12 인증서를 준비하자. 참고로 암호 안 걸리면 인증서 읽다가 널뽀인따 맞고 죽더라. 인증서 내보내기(export)할 때 꼭 6자 이상 암호 걸어서 내보내자. 순서는 아래와 같다. KeyStore 객체를 PKCS12 알고리즘으로 생성하고, 준비한 인증서 파일을 읽는다. KeyManagerFactory 객체를 SunX509 알고리즘으로 생성하고, 1에서 만들어진 KeyStore로 초기화한다. TrustManagerFactory 객체를 SunX509 알고리즘으로 생성하고, 1에서 만들어진 KeyStore로 초기화한다. SSLContext를 TLS 알고리즘(또는 필요에 따라 다른 것도 가능)으로 생성하고, 2, 3에서 만들어진 KeyManagerFactory와 TrustManagerFactory를 통해 만든 KeyManager[]와 TrustManager[]로 초기화한다. S...

Wireshark에서 TLS/SSL 까보기

TLS/SSL 작업을 할 때 갑갑한 것 중에 하나가 - 당연하겠지만 - 트래픽 내용을 볼 수 없다는 것이다. 기껏 볼 수 있는 정보는 인증서를 포함한 몇몇 보여도 상관 없는 인증 과정 중에 일부분이다. 물론  NULL cipher 를 서버와 클라이언트 모두 우선순위로 지원하도록 설정한다면, 인증이 끝난 뒤에도 트래픽을 볼 수 있지만, 그것도 최초 개발시기 이야기 . 배포 바로 전에 QA하기 위한 클라이언트를 수정할 수는 없지 않은가. 클라이언트 수정 없이 패킷만 덤프해서 볼 수 있으면 얼마나 좋을까... 만약 서버측 PrivateKey를 알고 있다면, 트래픽을 까서 볼 수 있다. ( 이래서 PrivateKey 관리가 중요하다. ) ssldump 라는 유틸리티도 있지만, GUI를 깔꼼하게 사용할 수 있는 Wireshark 에도 TLS/SSL을 까서 볼 수 있는 기능을 제공한다. 일단 Wireshark는 암호가 걸리지 않은 PEM규격 PrivateKey 만 읽을 수 있으니, 암호가 걸린 PrivateKey를 변환해서 보도록 하자. 변환 방법은 공식위키 사이트 를 애용해보자. (추측컨데 TLS/SSL 네고과정을 PrivateKey를 이용해서 SessionKey를 비롯한 패킷을 깔 때 필요한 정보를 얻어내어 덤프한 것을 바로 까서 보여주는 듯 하다. Proxy/MITM attack을 예상했는데, 그건 아닌 듯.) 키를 준비했다면, Edit-Preference를 들어가자. 왼쪽에 Protocol 트리가 보일 것이고, 거기에서 SSL을 선택하자. 여기서부터 중요한데, 이 부분이 Wireshark에서 불편한 부분이다. Wireshark에서 이 부분을 살짝 수정해준다면 좋으련만... 오른쪽 속성창에 RSA key list 항목이 보일 것이고, 그곳에 아래와 같은 형식으로 내용을 채워넣으면 패킷을 까볼 수 있다. <IP>,<PORT>,<PROTOCOL>,<KEY_FILE_PATH>;<반복> IP, ...

TLS - Thread Local Storage

쓰레드를 돌리다보면 해당 쓰레드에서만 유효한 변수를 만들고 싶을 때가 있다. 그럴 때 어떻게 해야할까? 쓰레드 개수만큼 벡터를 잡고, 해당 쓰레드마다 벡터 인덱스를 넘겨주는 것도 나름 방법이지만, 이러한 경우를 위해 TLS라는 것이 존재한다. 축약처럼 쓰레드 안에서만 따로 스토리지를 할당한 것인데, 일반 프로세스의 스텍과 비슷하나 그 크기는 프로세스 것보다 당연히 작고 제약이 심한 편이다. 뭐 암튼 그런게 있다고 치자. * GCC 메뉴얼 보면 TLS가 아니라 TSD(Thread Storage Duration)이라고 표현하였는데 대충 같은 말이다. 이것을 위해 POSIX는 pthread_key_create, pthread_get/setspecific 등 함수를 마련해놨지만 눈만 팽글팽글 돌고, 소스만 지저분해져 보일 것 같다. 귀찮으면 C99, C++98 표준 __thread 키워드를 사용하자. MSDN에 보니 __thread가 없어 보인다. 이가 없으면 잇몸으로라도... #define __thread __declspec( thread ) 대충 이 정도면 될 듯하다. 자자 각설하고, __thread란 키워드는 TLS에 변수를 선언해주는 일을 한다. 위에 나열한 pthread_* 함수를 호출하는 것으로 컴파일러가 대신 해석해주는 것일 수도 있으나 이건 가정이므로 넘어가고. 사용에 주의해야할 점은 아래와 같다. (대충대충 표준하고 MSDN 보면서 정리한 것임) 글로벌 변수나 static 변수에만 사용 가능하다. - function 안에 local 변수가 static이 아니라면 뭐더게 TLS에 저장할까? 당연히 그럴 필요가 없기 때문에 저런 제약이 있는 것이다. 이는 class에서 멤버 변수에도 적용한 법칙이다. static으로 선언한 멤버 변수에만 저 키워드를 사용할 수 있다. SO(DLL)과 로컬 영역을 넘나들면 뻑난다. - ... 그러니까 쓰지마라. 왜? 타입에 대한 한정자로 사용이 불가능하다. - const처럼 쓰지 말라는 것이고, 무...