Microsoft MVP성태의 닷넷 이야기
사물인터넷: 15. 라즈베리 파이용 C++ 프로젝트에 SSL Socket 적용 [링크 복사], [링크+제목 복사],
조회: 16204
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 10개 있습니다.)

라즈베리 파이용 C++ 프로젝트에 SSL Socket 적용

라즈베리 파이 등의 경우 C++에서 openssl을 사용하려면 다음과 같이 설치하면 됩니다.

sudo apt-get install libssl-dev

그런 다음 Visual Studio의 C++ 프로젝트 속성 창에서 -pthread를 사용했을 때와 유사하게,

Raspberry Pi/Windows 다중 플랫폼 지원 컴파일 관련 오류 기록
; https://www.sysnet.pe.kr/2/0/11373

컴파일 옵션에 직접 다음의 값을 추가합니다.

-lcrypto -lssl

만약 "-lcrypto -lssl" 컴파일 옵션을 주지 않으면 링크 시에 다음과 같이 openssl 관련 함수들을 찾을 수 없다는 오류가 발생합니다.

collect2 : error : ld returned 1 exit status

Error undefined reference to `SSL_read'




웬일인지 NR_OPEN 상수가 정의되지 않았다는 오류가 발생할 수 있습니다.

Error 'NR_OPEN' was not declared in this scope

분명히 limits.h 헤더 파일을 포함시켰고, 헤더 파일 안에는 NR_OPEN 상수가 조건 없이 정의되어 있습니다.

#include <linux/limits.h>

#define NR_OPEN 1024

정확한 원인을 알 수는 없지만 다음과 같이 우회를 했습니다.


#if !defined(_NR_OPEN)
#define NR_OPEN 1024
#endif




참고로, 라즈베리 파이에서 특정 파일을 찾고 싶을 때 다음과 같이 find 명령어를 내리면 됩니다.

sudo find / -name "..."

가령 openssl의 ssl.h 헤더 파일이 리눅스 파일 시스템의 어디에 위치해 있는지 알고 싶다면 다음과 같이 사용할 수 있습니다.

$ sudo find / -name ssl.h
/usr/include/openssl/ssl.h

$ find / -name ssl.h 2>/dev/null

// WSL 환경의 경우 /mnt 디렉터리를 제외하고 싶다면?
$ find / -path /mnt -prune -o -name python 2>/dev/null

윈도우의 경우에는 "dir /a/s ssl.h"라고 하는 것과 유사합니다.




openssl의 초기화 시 인증서와 키 파일의 경로를 지정해야 하는데, 실행 모듈의 경로와 같은 위치에 있는 것을 지정하려고 다음과 같이 사용하면,

int use_cert = SSL_CTX_use_certificate_file(sslContext, "test.pem", SSL_FILETYPE_PEM);
int use_prv = SSL_CTX_use_PrivateKey_file(sslContext, "key.pem", SSL_FILETYPE_PEM);

아래와 같이 해당 실행 모듈이 있는 경로로 이동 후 실행하면 정상적으로 파일을 찾는 반면,

$ cd /share
$ ./test.out

다른 경로에서 직접 실행하게 되면,

$ /share/test.out

test.out과 같은 위치의 파일을 못 찾고 pwd로 출력한 경로를 기준으로 찾게 됩니다. 사실 윈도우에서도 그렇기 때문에 당연한 결과입니다. 따라서 GetModuleFileName과 같은 Win32 API를 사용해 모듈 경로를 직접 구하는 식의 전처리가 필요한데요, 리눅스에서는 "/proc/[pid]/exe"라는 링크를 통해 실행 모듈의 경로를 구할 수 있습니다.

How to find the full path of the C++ Linux program from within?
; https://stackoverflow.com/questions/7051844/how-to-find-the-full-path-of-the-c-linux-program-from-within

[pid]가 아닌 현재 실행되고 있는 프로세스 내에서라면 self 문자열을 사용할 수 있습니다.

/proc/self/exe

다음은 "How to find the full path of the C++ Linux program from within?" 글의 답변을 참고해 작성한 것입니다.

void get_module_dir_path(char modulePath[])
{
    char arg1[] = "/proc/self/exe";
    char exepath[PATH_MAX + 1] = { 0 };

    readlink(arg1, exepath, PATH_MAX);
    strcpy(modulePath, dirname(exepath));

    printf("module path: %s\n", modulePath);
}

암튼, 제가 리눅스 초보자이다 보니 간단한 Win32 API에 상응하는 수준의 것도 저렇게 찾아보게 되는군요. ^^




참고로, 위의 정보를 기반으로 지난번에 만들었던 라즈베리 파이 제로를 위한 가상 USB 키보드/마우스 장치에 SSL 소켓 서버를 구현해 두었습니다. ^^

Raspberry Pi Zero(OTG)를 다른 컴퓨터에 연결해 가상 키보드 및 마우스로 쓰는 방법 (절대 좌표, 상대 좌표, 휠)
; https://www.sysnet.pe.kr/2/0/11369

rasp_vusb 
; https://github.com/stjeong/rasp_vusb



윈도우즈 사용자를 위한 라즈베리 파이 제로 W 모델을 설정하는 방법
; https://www.sysnet.pe.kr/2/0/11372

Raspberry Pi Zero(OTG)를 다른 컴퓨터에 연결해 가상 이더넷 카드로 쓰는 방법
; https://www.sysnet.pe.kr/2/0/11353

Raspberry Pi Zero(OTG)를 다른 컴퓨터에 연결해 가상 키보드로 쓰는 방법
; https://www.sysnet.pe.kr/2/0/11354

Raspberry Pi Zero(OTG)를 다른 컴퓨터에 연결해 가상 마우스로 쓰는 방법
; https://www.sysnet.pe.kr/2/0/11355

Raspberry Pi Zero(OTG)를 다른 컴퓨터에 연결해 가상 마우스 + 키보드로 쓰는 방법
; https://www.sysnet.pe.kr/2/0/11356

Raspberry Pi Zero(OTG)를 다른 컴퓨터에 연결해 가상 마우스로 쓰는 방법 (절대 좌표)
; https://www.sysnet.pe.kr/2/0/11364

Raspberry Pi Zero(OTG)를 다른 컴퓨터에 연결해 가상 키보드 및 마우스로 쓰는 방법 (절대 좌표, 상대 좌표, 휠)
; https://www.sysnet.pe.kr/2/0/11369

라즈베리 파이 용 C++ 프로젝트에 SSL Socket 적용
; https://www.sysnet.pe.kr/2/0/11411

Raspberry Pi/Windows 다중 플랫폼 지원 컴파일 관련 오류 기록
; https://www.sysnet.pe.kr/2/0/11373

Linux 3: 라즈베리 파이 - (윈도우의 NT 서비스처럼) 부팅 시 시작하는 프로그램 설정
; https://www.sysnet.pe.kr/2/0/11374


[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 11/24/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 46  47  48  49  50  51  52  53  [54]  55  56  57  58  59  60  ...
NoWriterDateCnt.TitleFile(s)
12284정성태8/4/202010401디버깅 기술: 169. Hyper-V의 VM에 대한 메모리 덤프를 뜨는 방법
12283정성태8/3/202010905디버깅 기술: 168. windbg - 필터 드라이버 확인하는 확장 명령어(!fltkd) [2]
12282정성태8/2/20209636디버깅 기술: 167. windbg 디버깅 사례: AppDomain 간의 static 변수 사용으로 인한 crash (2)
12281정성태8/2/202012181개발 환경 구성: 500. (PDB 연결이 없는) DLL의 소스 코드 디버깅을 dotPeek 도구로 해결하는 방법
12280정성태8/2/202011351오류 유형: 634. 오라클 (평생) 무료 클라우드 VM 생성 후 SSH 접속 시 키 오류 발생 [2]
12279정성태7/29/202012210개발 환경 구성: 499. 닷넷에서 접근해보는 InterSystems의 Cache 데이터베이스파일 다운로드1
12278정성태7/23/20209520VS.NET IDE: 149. ("Binary was not built with debug information" 상태로) 소스 코드 디버깅이 안되는 경우
12277정성태7/23/202010994개발 환경 구성: 498. DEVPATH 환경 변수의 사용 예 - .NET Reflector의 (PDB 연결이 없는) DLL의 소스 코드 디버깅
12276정성태7/23/202010242.NET Framework: 930. 개발자를 위한 닷넷 어셈블리 바인딩 - DEVPATH 환경 변수
12275정성태7/22/202012753개발 환경 구성: 497. 닷넷에서 접근해보는 InterSystems의 IRIS Data Platform 데이터베이스파일 다운로드1
12274정성태7/21/202012158개발 환경 구성: 496. Azure - Blob Storage Account의 Location 이전 방법 [1]파일 다운로드1
12273정성태7/18/202013815개발 환경 구성: 495. Azure - Location이 다른 웹/DB 서버의 경우 발생하는 성능 하락
12272정성태7/16/20208778.NET Framework: 929. (StrongName의 버전 구분이 필요 없는) .NET Core 어셈블리 바인딩 규칙 [2]파일 다운로드1
12271정성태7/16/202010822.NET Framework: 928. .NET Framework의 Strong-named 어셈블리 바인딩 (2) - 런타임에 바인딩 리디렉션파일 다운로드1
12270정성태7/16/202011660오류 유형: 633. SSL_CTX_use_certificate_file - error:140AB18F:SSL routines:SSL_CTX_use_certificate:ee key too small
12269정성태7/16/20208614오류 유형: 632. .NET Core 웹 응용 프로그램 - The process was terminated due to an unhandled exception.
12268정성태7/15/202010750오류 유형: 631. .NET Core 웹 응용 프로그램 오류 - HTTP Error 500.35 - ANCM Multiple In-Process Applications in same Process
12267정성태7/15/202012439.NET Framework: 927. C# - 윈도우 프로그램에서 Credential Manager를 이용한 보안 정보 저장파일 다운로드1
12266정성태7/14/202010183오류 유형: 630. 사용자 계정을 지정해 CreateService API로 서비스를 등록한 경우 "Error 1069: The service did not start due to a logon failure." 오류발생
12265정성태7/10/20209312오류 유형: 629. Visual Studio - 웹 애플리케이션 실행 시 "Unable to connect to web server 'IIS Express'." 오류 발생
12264정성태7/9/202018396오류 유형: 628. docker: Error response from daemon: Conflict. The container name "..." is already in use by container "...".
12261정성태7/9/202011301VS.NET IDE: 148. 윈도우 10에서 .NET Core 응용 프로그램을 리눅스 환경에서 실행하는 2가지 방법 - docker, WSL 2 [5]
12260정성태7/8/20209656.NET Framework: 926. C# - ETW를 이용한 ThreadPool 스레드 감시파일 다운로드1
12259정성태7/8/20209208오류 유형: 627. nvlddmkm.sys의 BAD_POOL_HEADER BSOD 문제 [1]
12258정성태7/8/202012354기타: 77. DataDog APM 간략 소개
12257정성태7/7/20209382.NET Framework: 925. C# - ETW를 이용한 Monitor Enter/Exit 감시파일 다운로드1
... 46  47  48  49  50  51  52  53  [54]  55  56  57  58  59  60  ...